700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > MySQL逻辑备份工具mysqldump的实践总结

MySQL逻辑备份工具mysqldump的实践总结

时间:2024-08-15 08:33:06

相关推荐

MySQL逻辑备份工具mysqldump的实践总结

文章目录

第1章 mysqldump工具的介绍及常用参数1.1 mysqldump工具的安装1.2 mysqldump工具的简介1.3 实现环境介绍与数据准备1.4 mysqldump工具备份流程1.5 mysqldump工具语法格式1.6 mysqldump读取文件获取连接信息1.7 mysqldump工具常用参数总结 第2章 mysqldump工具根据需求来备份2.1 对单个业务库下的所有对象进行逻辑全备2.2 对所有业务库下的所有对象进行逻辑全备2.3 对单个业务库下的所有基础表(表结构+表数据)进行全备2.4 对单个业务库下所有表(表结构)进行备份2.5 对单个业务库下所有表(表数据)进行备份2.6 对单个业务库下的单个表(表结构+表数据)进行备份2.7 对单个业务库下的单个表(表结构)进行备份2.8 对单个业务库下的单个表(表数据)进行备份2.9 对单个业务库下单个表中的部分数据进行备份2.10 备份时排除某个表不备份

第1章 mysqldump工具的介绍及常用参数

1.1 mysqldump工具的安装

当你安装好了MySQL软件包(MySQL Community Server)后,就会包含mysqldump这个客户端工具,你可以理解成是MySQL数据库自带的(非自带的不一定说就是第三方的)。mysqldump是MySQL的一个客户端工具,这是从MySQL的架构(C/S架构)来说,即然是客户端工具,就可以单独安装。

1.2 mysqldump工具的简介

mysqldump它是一个逻辑备份工具,这是从它的用途/功能来说。它是将MySQL中的数据以SQL语句的形式备份出来。它在备份时默认都是会加全局读锁的(即对你整个MySQL实例施加读锁,这样所有会话下的事务都只能读,不能写),并且它本身没有参数来支持关闭默认施加全局读锁的功能,但是它有参数支持减少施加全局读锁对业务的影响,具体用不用看你的业务场景(是在单实例上备份还是在还是在slave上)。mysqldump只能热备份(即备份时你的MySQL实例必须处于运行状态),备份时是单线程,所以在数据量大于50G的情况下就不太适用(其实也看你的备份策略了)。

1.3 实现环境介绍与数据准备

环境介绍(单前mysql是单实例运行,没有任何的架构哈)

mysql> select @@version,@@global.default_storage_engine; # 版本和mysql实例的默认存储引擎+------------+---------------------------------+| @@version | @@global.default_storage_engine |+------------+---------------------------------+| 5.7.28-log | InnoDB|+------------+---------------------------------+1 row in set (0.00 sec)mysql> select @@global.log_bin,@@global.binlog_format; # binlog开启了的,模式为row+------------------+------------------------+| @@global.log_bin | @@global.binlog_format |+------------------+------------------------+|1 | ROW|+------------------+------------------------+1 row in set (0.00 sec)mysql> select @@global.transaction_write_set_extraction; # 事务的写集合是off,若开启,mysqldump无法使用+-------------------------------------------+| @@global.transaction_write_set_extraction |+-------------------------------------------+| OFF |+-------------------------------------------+1 row in set (0.00 sec)mysql> select @@global.gtid_mode; # gtid是开启了的哈+--------------------+| @@global.gtid_mode |+--------------------+| ON |+--------------------+1 row in set (0.00 sec)

测试数据的准备

#### 创建chenliang库,并在该库下创建cl1和cl2表-- 创建chenliang库并进入到该库下create database if not exists chenliang character set utf8 collate utf8_general_ci;use chenliang;select database();-- 创建cl1表,并往cl1表中插入数据create table if not exists cl1(id int unsigned auto_increment comment"序列",name varchar(20) not null comment"姓名",sex enum("男","女") comment"性别",primary key(id),key inx_name(name))engine=innodb character set utf8 collate utf8_general_ci comment"测试表1";insert into cl1(name,sex) values('chenliang01','男'),('chenliang02','男'),('chenliang03','男'),('chenliang04','男'),('chenliang05','女'),('chenliang06','女'),('chenliang07','女'),('chenliang08','女'); commit;-- 创建cl2表,并往cl2表中插入数据create table if not exists cl2(id int unsigned auto_increment comment"序列",name varchar(20) not null comment"姓名",age tinyint unsigned not null comment"年龄",primary key(id))engine=innodb character set utf8 collate utf8_general_ci comment"测试表2";insert into cl2(name,age) values("chenliang01",21),("chenliang02",22),("chenliang03",23),("chenliang04",24),("chenliang05",25),("chenliang06",26),("chenliang07",27),("chenliang08",28);commit;#### 创建lili库,并在该库下创建li1和li2表 -- 创建lili库并进入到该库下create database if not exists lili character set utf8 collate utf8_general_ci;use lili;select database();-- 创建li1表,并往li1表中插入数据create table if not exists li1(id int unsigned auto_increment comment"序列",name varchar(20) not null comment"姓名",sex enum("男","女") comment"性别",primary key(id),key inx_name(name))engine=innodb character set utf8 collate utf8_general_ci comment"测试表1";insert into li1(name,sex) values('lili01','男'),('lili02','男'),('lili03','男'),('lili04','男'),('lili05','女'),('lili06','女'),('lili07','女'),('lili08','女'); commit;-- 创建li2表,并往li2表中插入数据create table if not exists li2(id int unsigned auto_increment comment"序列",name varchar(20) not null comment"姓名",age tinyint unsigned not null comment"年龄",primary key(id))engine=innodb character set utf8 collate utf8_general_ci comment"测试表2";insert into li2(name,age) values("lili01",21),("lili02",22),("lili03",23),("lili04",24),("lili05",25),("lili06",26),("lili07",27),("lili08",28);commit;

1.4 mysqldump工具备份流程

这里是指备份流程,而不是备份原理。以下用对单个业务库和多个业务进行逻辑全备来认识下mysqldump的备份流程。

对单个业务库进行逻辑全备

mysqldump --no-defaults -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \-B -F -R -E -x --set-gtid-purged=off chenliang | gzip >/tmp/chenliang.sql.gz

注意1: chenliang库下有cl1表和cl2表,每张表中有8条记录;

注意2: 这条备份语句不适合生产(环境不一样,你懂的)

注意3:–no-defaults必须得写在mysqldump后面,不然会报错:[ERROR] unknown option ‘–no-defaults’

注意4:这两张表没有用外键约束进行硬性的关系指定,如何有,会先备份父表,再备份子表,逻辑关系不用管。

A:先备份出chenliang库的创建语句,会在后面加上user 库名;这样的语句,如下;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `chenliang` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `chenliang`;B:备份出cl1表的表结构[表中若有索引(不管是一级索引还是辅助索引),会备份出来,就在创建表的语句中]; 在create table语句前面默认会有drop table这样的语句,如下所示DROP TABLE IF EXISTS `cl1`; # 注意:cl1是表名,它前面没有库名(chenliang.cl1)CREATE TABLE `cl1` (# 注意:cl1是表名,它前面没有库名(chenliang.cl1)`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '序列',`name` varchar(30) NOT NULL COMMENT '姓名',`sex` enum('男','女') DEFAULT NULL COMMENT '性别',PRIMARY KEY (`id`),# 表中的一级索引,是在id字段KEY `inx_name` (`name`)# 表中的辅助索引,是在name字段上) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='table cl1';C:备份出cl1表中的数据,默认是一整条insert语句;会在insert into语句前面加上lock table语句;会在insert语句后面加上unlock tables;语句;如下所示:LOCK TABLES `cl1` WRITE; # 在insert语句前面加上对表的写锁,是为了数据恢复INSERT INTO `cl1` VALUES (1,'chenliang01','男'),(2,'chenliang02','男'),(3,'chenliang03','男'),(4,'chenliang04','男'),(5,'chenliang05','女'),(6,'chenliang06','女'),(7,'chenliang07','女'),(8,'chenliang08','女'); # 是一整条insert语句,有方法让其不是一整条;UNLOCK TABLES;# 在insert语句后面加上unlock tables语句;D:再备份chenliang库下cl2表的表结构和表中的数据,步骤跟B、C的一样

对多个业务库进行逻辑全备

mysqldump --no-defaults -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \-B -F -R -E -x --set-gtid-purged=off chenliang lili | gzip >/tmp/chenliang_lili.sql.gz

注意1:chenliang库下是cl1和cl2表(每张表8条记录);

注意2:lili库下是li1和li2表(每张表8条记录);

注意3:这条备份语句不适合生产(环境不一样,你懂的);

注意4:–no-defaults得写在mysqldump后面,不然报:[ERROR] unknown option ‘–no-defaults’

注意5:相关库下的两张表没有用外键约束进行硬性的关系指定,如何有,会先备份父表,再备份子表,逻辑关系不用管。

#### 先备份chenliang业务库,因为指定时chenliang库在lili库前面A:先备份出chenliang库的创建语句,会在后面加上user 库名;这样的语句,如下;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `chenliang` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `chenliang`;B:备份出cl1表的表结构[表中若有索引(不管是一级索引还是辅助索引),会备份出来,就在创建表的语句中]; 在create table语句前面默认会有drop table这样的语句,如下所示DROP TABLE IF EXISTS `cl1`; # 注意:cl1是表名,它前面没有库名(chenliang.cl1)CREATE TABLE `cl1` (# 注意:cl1是表名,它前面没有库名(chenliang.cl1)`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '序列',`name` varchar(30) NOT NULL COMMENT '姓名',`sex` enum('男','女') DEFAULT NULL COMMENT '性别',PRIMARY KEY (`id`), # 表中的一级索引,是在id字段KEY `inx_name` (`name`)# 表中的辅助索引,是在name字段上) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='table cl1';C:备份出cl1表中的数据,默认是一整条insert语句;会在insert into语句前面加上lock table语句;会在insert语句后面加上unlock tables;语句;如下所示:LOCK TABLES `cl1` WRITE;# 在insert语句前面加上对表的写锁,是为了数据恢复INSERT INTO `cl1` VALUES (1,'chenliang01','男'),(2,'chenliang02','男'),(3,'chenliang03','男'),(4,'chenliang04','男'),(5,'chenliang05','女'),(6,'chenliang06','女'),(7,'chenliang07','女'),(8,'chenliang08','女'); # 一整条insert语句,有方法让其不是一整条;UNLOCK TABLES;# 在insert语句后面加上unlock tables语句;D:再备份chenliang库下cl2表的表结构和表中的数据,步骤跟B、C的一样#### 再备份lili业务库,因为指定时chenliang库在lili库前面A:先备份出lili库的创建语句,会在后面加上user 库名;这样的语句,如下;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `lili ` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `lili `;B:备份出li1表的表结构[表中若有索引(不管是一级索引还是辅助索引),会备份出来,就在创建表的语句中]; 在create table语句前面默认会有drop table这样的语句,如下所示DROP TABLE IF EXISTS `li1`; # 注意:cl1是表名,它前面没有库名(chenliang.cl1)CREATE TABLE `li1` (# 注意:cl1是表名,它前面没有库名(chenliang.cl1)`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '序列',`name` varchar(20) NOT NULL COMMENT '姓名',`sex` enum('男','女') DEFAULT NULL COMMENT '性别',PRIMARY KEY (`id`),# 表中的一级索引,是在id字段KEY `inx_name` (`name`)# 表中的辅助索引,是在name字段上) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='测试表1';C:备份出li1表中的数据,默认是一整条insert语句;会在insert into语句前面加上lock table语句;会在insert语句后面加上unlock tables;语句;如下所示:LOCK TABLES `li1` WRITE; # 在insert语句前面加上对表的写锁,是为了数据恢复INSERT INTO `li1` VALUES(1,'lili01','男'),(2,'lili02','男'),(3,'lili03','男'),(4,'lili04','男'),(5,'lili05','女'),(6,'lili06','女'),(7,'lili07','女'),(8,'lili08','女'); # 是一整条insert语句,有方法让其不是一整条;UNLOCK TABLES;# 在insert语句后面加上unlock tables语句;D:再备份lili库下li2表的表结构和表中的数据,步骤跟B、C的一样

1.5 mysqldump工具语法格式

语法1: mysqldump [OPTIONS] database [table1 table2 ....]语法2: mysqldump [OPTIONS] --databases[OPTIONS] DB1 [DB2 DB3...]语法3: mysqldump [OPTIONS] --all-databases [OPTIONS]

1.6 mysqldump读取文件获取连接信息

在1.4章节简单的使用mysqldump备份了数据,观察了备份出来的数据是怎样的。在备份的过程中mysqldump肯定是要先连接到MySQL实例后再进行备份的嘛。我当时是用参数指定的连接信息(用户、密码、连接方式)。

其实mysqldump这个客户端工具(逻辑备份)它默认会去找f配置文件,然后读取文件中[mysqldump]或者[client]选项下面的相关参数来获取连接信息。其寻找f配置文件的顺序如下所示:

Default options are read from the following files in the given order:/etc/f /etc/mysql/f /usr/local/mysql/etc/f ~/.f The following groups are read: mysqldump client

至于mysqldump能不能找得到,看你生产环境中MySQL软件包(MySQL Community Server)是如何安装的。如果找到了(自己找到的或者我们人为指定的),以[mysqldump]选项下的相关参数为准还是以[client]选项下的相关参数为准。这个看哪个选项在文件的尾部。

这里就要引入mysqldump的–no-defaults和–defaults-file这两个参数,以下是对这两个参数的实践。

############################# --defaults-file参数的实践#### 说明用于指定文件(不一定是f文件,也可是自己创建的一个文件),好让mysqldump工具从文件的[mysqldump]选项或者[client]选项下读取连接mysql实例的相关信息。以下是实践#### 实践1:用--defaults-file指定的文件名为f01:我想用root@localhost通过socket文件去连接mysql实例,然后针对chenliang库进行逻辑全备。02:我的命令如下所示(先不要执行),我这里没有用参数来指定用户名、密码、socket文件哈mysqldump --defaults-file=/data/mysql/3306/etc/f \-B -F -R -E -x --set-gtid-purged=off chenliang | gzip >/tmp/chenliang_1.sql.gz03:在执行02步骤的命令前,我得先在/data/mysql/3306/etc/f文件尾部准备如下信息,不用重启mysql服务[mysqldump] # 也可写成clientuser=rootpassword=chenliangsocket=/data/mysql/3306/run/mysql.sock#### 实践2:用--defaults-file指定的文件名非f01:我想用root@localhost通过socket文件去连接mysql实例,然后针对chenliang库进行逻辑全备。02:我的命令如下所示(先不要执行),我这里没有用参数来指定用户名、密码、socket文件哈mysqldump --defaults-file=/tmp/a \-B -F -R -E -x --set-gtid-purged=off chenliang | gzip >/tmp/chenliang_2.sql.gz03:在执行02步骤的命令前,我得先在/tmp/a 文件尾部准备如下信息,不用重启mysql服务[client] # 也可写成mysqldumpuser=rootpassword=chenliangsocket=/data/mysql/3306/run/mysql.sock#### 实践3:命令行指定的连接信息(用户名、密码等)要高于从文件中读取到的信息01:我想用root@localhost通过socket文件去连接mysql实例,然后针对chenliang库进行逻辑全备。02:我的命令如下所示(先不要执行),我这里没有用参数来指定用户名、密码、socket文件哈mysqldump --defaults-file=/tmp/a -pchenliang \-B -F -R -E -x --set-gtid-purged=off chenliang | gzip >/tmp/chenliang_3.sql.gz03:在执行02步骤的命令前,我得先在/tmp/a 文件尾部准备如下信息,不用重启mysql服务[client] # 也可写成mysqldumpuser=rootpassword=chenlian # 这个密码是错误的哈,但备份时我命令行指定了密码,socket=/data/mysql/3306/run/mysql.sock04:观察是否能够备份成功,肯定是可以备份成功的。验证了命令行指定的连接信息(用户名、密码等)要高于从文件中读取到的信息############################# --no-defaults参数的实践#### 说明不让mysqldump自己去找文件读取连接信息(用户、密码、连接方式),另外我们人为也不能再使用--defaults-file去指定另外的文件。如下的命令执行是备份不出来数据的mysqldump --no-defaults --defaults-file=/data/mysql/3306/etc/f \-B -F -R -E -x --set-gtid-purged=off chenliang | gzip >/tmp/chenliang_1.sql.gz

PS:生产中这两个参数有没有什么注意的。我生产中是不会用这两个参数的。

#### 不用这两个参数的任何一个01:肯定是要去找f文件读取[mysqldump]或者[client]选项下的连接信息02:但我怕服务器上部署了两套MySQL软件包,万一读取到了呢?03:不用怕,只要我们用相关参数指定连接信息(用户、密码、连接方式),不会以文件中信息为准。#### 若要用,可以用--no-defaults参数就不能再使用--defaults-file参数了,这个参数得紧跟在mysqldump后面。

1.7 mysqldump工具常用参数总结

用于指定配置文件的参数

--defaults-file<== 我生产中不用# 默认是没有值的,用于指定mysql实例的配置文件,我生产中不用;# 如何不指定,mysqldump则默认会从以下路径去找:# /etc/f /etc/mysql/f /usr/local/mysql/etc/f ~/.f# 若找到后,会读取f中的[mysqldump]模块下的相关参数--no-defaults <== 我生产中也不用,我会用参数指定连接信息(用户名、密码等)# 默认是没有开启的,我生产中会用这个参数,它表示不从任何文件读取信息# 它得紧跟在mysqldump后面,例如:mysqldump --no-defaults -uroot .....省略

与字符集相关的参数

以下三个参数我在生产中不会指定任何一个,因为默认就是UTF8字符集,会在备份出来的sql文件前面加上 /*!40101 SET NAMES utf8 */ ;这样在你恢复数据时,会先执行,以避免数据恢复或迁移产生乱码;你若要另外指定字符集,,用--default-character-set参数指定就行;--set-charset# 默认True,也就意味着你可以使用--default-character-set参数的默认值;# 生产中让其默认就好,不要去关闭(--skip-set-charset)它。--default-character-set# 默认的字符集是utf8(mysql 5.7版本及之前),8.0.x为utf8mb4;# 这样备份出来的sql文件中就会有/*!40101 SET NAMES utf8 */;这样的语# 句,在恢复sql文件时,这个语句是会执行的哈; -N# 优先级比--set-charset和--default-character-set的优先级要高。默认为False# 等于--no-set-names,若指定后就会让--set-charse和--default-character-set参数的默认值失效。

连接mysql实例的相关参数

-u# 等于--user= 指定连接mysql的用户(mysql实例中必须得存在,必须得有相应权限,这里不说明)-p# 等于--password= 指定用户的密码-h# 等于--host= 指定用于连接mysql实例的ip地址-P# 等于--port= 指定mysql实例的端口-S# 等于--socket= 用于指定mysql实例的socket文件

备份内容的相关参数

-A 和 --flush-privilegs# -A等于--all-databases,默认false,指定了它,就不用再指定-B参数了;#(1):备份整个mysql实例[你的业务库(肯定是会备份的)、默认的库(不是说所有默认库都会备份)]#(2):5.7的mysql实例默认库有:mysql、sys、information_schema、performance_schema#(3):对于默认库,只会备份mysql库,但不会将用户的权限备份出来,这就得配合--flush-privileges#(4):会备份出用户,因为会备份mysql库,但不会备份出用户的权限,所以得配合--flush-privileges参数# --flush-privileges,默认false,表示备份用户的权限,它不是说单独只备份出用户的权限;#(1):它可以配合-A参数进行使用#(2):也可不配合-A参数使用(我只备份默认库mysql时用--flush-privileges是可以的吧)--set-gtid-purged# 默认false,它有on和off两个值,如下所示:# on表示不清理Gtid(事务标识),备份出来的sql语句中有全局事务号(Gtid);# off表示清理Gtid(事务标识), 备份出来的sql语句中没有全局事务号(Gtid);# on和off到底怎样指定呢?如下所示:# mysql实例不管有没有开启GTID,指定--set-gtid-purged=off,不会报错,数据也能备份成功;# mysql实例若没开启GTID,指定--set-gtid_purged=on,报Server has GTIDs disabled错误,备份失败# 我工作中对于这个参数是怎样指定的:# 在mysql版本大于5.5时,我的常规备份,指定--set-gtid-purged=off就好。# 在一些特定场景,若实例开了GTid时,我备份的数据要保存gtid,我会指定--set-gtid-purged=on-F# 等于--flush-logs,默认False,作用是生成新的日志(会重新生成binlog文件)# 01:若你mysql实例的binlog没有开启,又用了这个参数,则会如下报错:#Error: Binlogging on server not active,且你整个备份会完全失败; **********# # 02:若你mysql实例有多个业务库,你要对每个业务库做全备时,用-F也没毛病,但我不用#示例:mysqldump --no-defaults -uroot -p -S /data/mysql/3306/run/mysql.sock \# --skip-add-drop-table --set-gtid-purged=off --master-data=2 \# -B -R --triggers -E -x chenliang|gzip >chenliang_database_all.sql.gz#说明1:借助shell配合上面的备份语句对业务库做分库逻辑全备(分库逻辑全备);#说明2:如果加了-F,只要binlog开了,用-F也没毛病,因为有多个业务库,这样就刷新多次binlog。# 你可以在备份前用flush logs;命令先生成一个binlog文件,后面对每个业务库做全备时就# 可以不用再加-F参数了。## 03:当对业务库下的每个表做逻辑全备(每个表一个单独的sql文件),用-F也没毛病,但我不用#示例:mysqldump --no-defaults -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \#--skip-add-drop-table --set-gtid-purged=off --master-data=2 \#chenliang cl1|gzip chenliang_database_cl1_table_all.sql.gz# 说明1:借助shell配合上面的备份语句对chenliang库下的每个表进行单独逻辑全备(分表逻辑全备)# 说明2:如果加了-F,只要binlog开了,用-F也没毛病,但是你想生产中的业务表肯定很多,这样每备份# 一个表都-F(重新生成一个binlog文件),那得生成多少个binlog文件,这对后面的数据恢复也# 加大了难度。所以我会在备份前用flush logs;命令先生成一个新的binlog文件,然后在备份# 时就不用-F参数了。--master-data# 它有三个值,0、1、2,默认是false,只要开了binlog,你就用它就行了;# 0表示备份出来的sql文件中不会记录备份时的binlog的文件名和pos点;# 1表示备份出来的sql文件中会记录备份时的binlog的文件名和pos点,但不会注释掉; 不用,容易有坑;# 2表示备份出来的sql文件中会记录备份时的binlog的文件名和pos点,但会注释掉;我生产中用它;--add-drop-database<== 我生产中不用这个参数# 默认是False,(就是不会在create database语句前面加上drop database语句),# 我不会指定这个参数,若你指定了这个参数,会在create database语句前面加上drop database语句,:# /*!40000 DROP DATABASE IF EXISTS `chenliang`*/;这个语句会把chenliang库给drop掉的,你可# 试试,这样在数据恢复或者迁移时可能就会给自己和他人控坑;-B # 等于--databases参数,默认false# 01:当用了-B参数后,会备份出库的创建语句,同时会在创建库的语句后面加上use "库名";这样的语句。#这样在恢复数据时,就不用事先创建库,也不用指定库名了;# 02:当用了-B参数后,会认为-B参数后面指定的全是"库"名;#-- 备份命令:# mysqldump --no-defaults -uroot -p -S /data/mysql/3306/run/mysql.sock \# --skip-add-drop-table --set-gtid-purged=off --master-data=2 \# -B -F -R -E --triggers -x chenliang cl1|gzip 11.sql.gz#-- 说明 # 01:会认为chenliang和cl1都是库;# 02:当cl1不是库时,会报错,但整个备份语句是会成功的;# 03:它会把chenliang库下所有表、视图、存储过程、自定义函数、视图、事件进行备份; -n <== 我生立中不用它# 等于--no-create-db,默认false,表示不备份出库的创建语句; # 它与-B参数可共用(不冲突),不会有创建库的语句,但有use 库的语句;--add-drop-table # 默认是True,(就是会在create table 语句前面加上 drop table if exists 表名;)# 这样在数据恢复或者数据迁移时就可能给他人和自己控坑;若要关闭,就用--skip-add-drop-table--skip-add-drop-table# 因--add-drop-table默认为true,会在备份表结果的语句前面加上drop table的语句# 为了避免在数据恢复时踩坑,我会用这个参数(--skip-add-drop-table)-d 和 -t # -d等于--no-data,表示不备份表中的数据,默认false# -t等于--no-create-info,表示不备份表结构,默认false# PS:因为这两个参数默认都为false,当不指定它们时,默认是会备份出表的表结构和表数据的-e# 等于--extended-insert,默认是true,这样在备份表中数据时,备份出来的是一整条insert语句# 我生产中不用它,我会用--skip-extended-insert参数来关闭它--skip-extended-insert# 作用是用来关闭-e参数(--extended-insert),这样在备份出来的表数据就不是一整条insert语句# 而是每条记录一条insert语句-R# 等于--routines,默认Fluse,作用是备份存储过程和自定义函数# mysqldump不能针对每个存储过程和函数进行单独的备份# 你要备份只能备份出相关库下所有的存储过程或者所有有自定义函数-E# 等于--events,作用是备份出事件,默认false, 如果不想备份事件,不指定参数-E就行了,反之;--triggers# 作用是备份出触发器,默认是true,会有drop trigger语句# 如果不想备份出触发器,可用--skip-triggers参数--add-drop-trigger <==我生产中不用# 默认false,指定后,备份出来会有drop trigger语句--skip-triggers# 默认false,指定它就是关闭--triggers参数的功能,不备份触发器-w# 等于--where,默认false,用它可以指定备份出表中某一部分数据# 例如:chenliang cl1 -w="id>2" >/tmp/11.sql# 说明:chenliang是库,cl1是表,备份出chenliang库下cl1表中id>2的记录

关于锁的相关参数

只要用mysqldump进行数据备份,都会执行FLUSH TABLES WITH READ LOCK;命令。给你的mysql实例施加全局读锁(简称:FTWRL,这样任何连接对整个mysql实例下的所有对象都只能读,不能写/改变)。施加这个全局读锁跟下面介绍的参数无关。

#### 注意:以下三个参数只能同时使用一个; -l与-x配合使用,不报错,但-x会把-l参数的功能给关闭掉;-l与--single-transaction使用,不报错,但--single-transaction会把-l参数的功能给关闭掉;-x与-l配合使用,不报错, 但-x会把-l参数的功能给关闭掉;-x与--single-transaction使用,会直接报错,整个备份失败(没任何数据);--single-transaction配合-l使用, 不报错,但--single-transaction会把-l参数的功能给关闭掉;--single-transaction配合-x使用, 会直接报错,整个备份失败(没任何数据);## 三个关于锁的参数说明-l# 等于--lock-tables参数,默认True;英文说明:Lock all tables for read 中文说明:锁住所有表;# 结合mysqldump备份原理来理解这个参数的作用# 01:mysqldump连接至mysql实例# 02:flush tables;# 03:FTWRL(施加全局读锁),任何连接对mysql实例下的对象只能读,不能写/改变;# 04:-l参数,再对所有的表施加读锁;# 05:show master status;查看binlog文件和pos点,然后进行数据的备份;# 06:备份完成后,mysqldump退出会话连接,锁自动释放;任何连接下的事务都可对mysql实例进行读写;-x# 等于--lock-all-tables参数,默认False,锁住所有库下的所有表(整个实例),通过FTWRL来实现的;# 会关闭--single-transaction参数和--lock-tables参数(-l);结合mysqldump备份原理来理解这个参数# 01:mysqldump连接至mysql实例# 02:flush tables;# 03:FTWRL(施加全局读锁),mysqldump工具决定的,-x参数的功能也是靠它来实现的。 # 04:show master status;查看binlog文件和pos点,然后进行数据的备份;# 05:备份完成后,mysqldump退出会话连接,锁自动释放--single-transaction# 默认false,用这个参数后,默认会关闭-l参数;不能与-x参数同用,若同用,整个备份失败;# 目前只针对innodb存储引擎的表,使用这个参数后,在备份时不能对mysql实例下所有的innodb表做# alter、drop、rename、truncate这样的操作,这个专业术语叫DDL语句阻塞;# 因为是只针对innodb引擎的表,为了保证myisam引擎的表和其它引擎表在备份时数据的一致性,请配合# --master-data参数使用;以下结合mysqldump的备份原理来理解这个参数作用:# 01:mysqldump连接至mysql实例,连接会话(会话模式)# 02:flush tables;针对myisam引擎的表;# 03:FTWRL(施加全局读锁),任何连接下的事务对整个mysql实例下的对象都只能读,不能写(改变);# 04:--single-transaction参数来了,重点看一看哈;# A:设置事务级别为重复读(repetable read),这是在会话级别下;# B:设置保存点,后面就基于这个保存点来做数据备份;# C:show master status;查看当前使用的binlog文件和pos点;# D:执行unlock tables;命令,释放FTWRL(全局读锁),按理说释放后,其它连接下的事务就可对整#个mysql实例下的对象进行读写操作了。这是正确的。# E:但是因为加了--single-transaction参数,这个参数会导致任何连接还是不能对当前mysql实#例下的innodb表做alter、drop、rename、truncate操作;专业术语叫DDL阻塞;# 05:基于打的快照对相关的数据做备份;# 06:数据备份完成后,退出连接,此时其它事务就可对mysql实例下的表做DDL和任何类型语句操作了;

第2章 mysqldump工具根据需求来备份

2.1 对单个业务库下的所有对象进行逻辑全备

手动对单库(所有对象)逻辑全备

对chenliang业务库下的所有对象/功能(基础表、视图、存储过程和自定义函数、触发器,事件)做逻辑全备(打包备份成一个SQL文件)。不用管前面所说的对象/功能是否存在,生产中这些对象不可能全部存在(不用它),但站在备份的角度,我们得考虑到,万一哪天用了其中一个对象/功能,我的备份能够把它备份起来。另外要求:要有create 库和use 库的语句、不要有drop table的语句、基础表的数据备份出来不能是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert -R -E --triggers \chenliang|gzip >/tmp/chenliang-library-all-object.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x 表示锁表,下一大章节会有关于mysqldump的备份原理;05:-B表示备份库,后面指定的chenliang业务库是存在的,且我没指定表名,会有创建库和use库的语句;06:--skip-add-drop-table表示不添加drop table这样的语句;07:没有-t和-d,默认是false,那就是会备份表的表结构和表数据;08:--skip-extended-insert用来关闭--extended-insert参数,这样表中的数据备份出来就不是一整条insert09:-R -E默认是false,这里指定了,就会备份出存储过程、自定义函数、事件10:--triggers表示备份触发器,默认是true,这里也有指定,方便后面的维护;11:chenliang是业务库的库名,在mysql实例中是真实存在的;

对lili业务库下的所有对象/功能(基础表、视图、存储过程和自定义函数、触发器,事件)做逻辑全备(打包备份成一个SQL文件)。不用管前面所说的对象/功能是否存在,生产中这些对象不可能全部存在(不用它),但站在备份的角度,我们得考虑到,万一哪天用了其中一个对象/功能,我的备份能够把它备份起来。另外要求:要有create 库和use 库的语句、不要有drop table的语句、基础表的数据备份出来不能是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert -R -E --triggers \lili|gzip >/tmp/lili-library-all-object.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x 表示锁表,下一大章节会有关于mysqldump的备份原理;05:-B表示备份库,后面指定的chenliang业务库是存在的,且我没指定表名,会有创建库和use库的语句;06:--skip-add-drop-table表示不添加drop table这样的语句;07:没有-t和-d,默认是false,那就是会备份表的表结构和表数据;08:--skip-extended-insert用来关闭--extended-insert参数,这样表中的数据备份出来就不是一整条insert09:-R -E默认是false,这里指定了,就会备份出存储过程、自定义函数、事件10:--triggers表示备份触发器,默认是true,这里也有指定,方便后面的维护;11:lili是业务库的库名,在mysql实例中是真实存在的;

自动分库(所有对象)逻辑全备

利用shell进行分库(业务库)备份(就是将chenliang库和lili这两个库进行分库逻辑全备,每个库备份出来都是一个单独的sql文件)。要考虑到以后可能还会增加业务库,现有业务库也可能会被迁移走。以下的脚本是思路,不规范哈。

#!/bin/bash## 手动先生成binlog文件(后面备份时就不指定-F参数了)mysql -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock -e "flush logs;"# 定义变量,这个变量的值就是业务库(chenliang、lili)的名字Databases=$( mysql -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \-e "show databases;"|grep -Ev "Database|_schema|mysql|sys" )# 用for循环来进行分库逻辑备份for n in $Databasesdomysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert -R -E --triggers \$n|gzip >/tmp/${n}-library-all-object.sql.gzdone

看一看备份的结果

[root@node21 ~]# ll /tmp/*-rw-r--r-- 1 root root 1164 9月 7 14:03 /tmp/chenliang-library-all-object.sql.gz-rw-r--r-- 1 root root 1154 9月 7 14:03 /tmp/lili-library-all-object.sql.gz

2.2 对所有业务库下的所有对象进行逻辑全备

手动多库(所有对象)逻辑全备

对所有业务库(当前只有chenliang和lili两个业务库)下的所有对象(基础表、视图、存储过程和自定义函数、触发器,事件)做逻辑全备(两个业务库打包备份成一个SQL文件)。不用管前面所说的对象/功能是否存在,生产中这些对象不可能全部存在(不用它),但站在备份的角度,我们得考虑到,万一哪天用了其中一个对象/功能,我的备份能够把它备份起来。另外要求:要有create 库和use库的语句、不要有drop table的语句、基础表中的数据不能是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert -R -E --triggers \chenliang lili|gzip >/tmp/business-database-all-object.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x 表示锁表,下一大章节会有关于mysqldump的备份原理;05:-B表示备份库,后面指定的chenliang和lili都是存在的业务库,会有创建库和use库的语句;06:--skip-add-drop-table表示不添加drop table这样的语句;07:没有-t和-d,默认是false,那就是会备份表的表结构和表数据;08:--skip-extended-insert用来关闭--extended-insert参数,这样表中的数据备份出来就不是一整条insert09:-R -E默认是false,这里指定了,就会备份出存储过程、自定义函数、事件10:--triggers表示备份触发器,默认是true,这里也有指定,方便后面的维护;11:chenliang和lili是业务库的库名,在mysql实例中是真实存在的;

自动动多库(所有对象)逻辑全备

利用shell脚本来进行备份多个业务库(多个业务库备份成一个sql文件),这里要考虑到以后可能会新增业务库,也可能会把现有业务库给迁移走。以下的脚本是思路,不规范哈。

#!/bin/bash### 因为是将多个业务库备份成一个sql文件(多个业务库全备),就不用手动刷新binlog文件了# 定义变量,这个变量的值就是业务库(chenliang、lili)的名字, ****特别注意这里Databases=$( echo $(mysql -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \-e "show databases;"|grep -Ev "Database|_schema|mysql|sys" ) )# 直接用mysqldump进行备份mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert -R -E --triggers \$Databases |gzip >/tmp/business-database-all-object.sql.gz

看一看备份的结果

[root@node21 ~]# ll /tmp/*-rw-r--r-- 1 root root 1369 9月 7 14:17 /tmp/business-library-all-object.sql.gz

2.3 对单个业务库下的所有基础表(表结构+表数据)进行全备

手动对单业务库(所有表结构+表数据)进行全备

对chenliang业务库下的所有基础表(表结构+表数据)进行逻辑全备(备份成一个SQL文件)。另外要求:要有create 库和use库的语句、不要有drop table语句、每张表中的数据备份出来不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert --skip-triggers \chenliang|gzip >/tmp/chenliang-library-all-table-info-data.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有关于mysqldump的备份原理;03:-B表示备份库,后面指定的chenliang都是存在的业务库,会有创建库和use库的语句;04:--skip-add-drop-table表示不添加drop table这样的语句;05:-n和-t没有指定,默认为false,就表示备份表结构和表数据;06:--skip-extended-insert用来关闭--extended-insert参数,这样表中的数据备份出来就不是一整条insert07:-R -E没有指定,默认是False,就是不备份存储过程、自定义函数、事件;08:--skip-triggers用来关闭--triggers(触发器,默认True);09:chenliang表示业务库的库名,我这里是存在的哈10:如果chenliang库下有视图,也会把视图给备份出来,但生产中不用视图;

对lili业务库下的所有基础表(表结构+表数据,肯定是有的)进行逻辑全备(备份成一个SQL文件)。每张基础表中的数据备份出来不要其是一整条insert语句。另备份出来的sql文件中不要有drop table这样的语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert --skip-triggers \lili|gzip >/tmp/lili-library-all-table-info-data.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有关于mysqldump的备份原理;03:-B表示备份库,后面指定的lili都是存在的业务库,会有创建库和use库的语句;04:--skip-add-drop-table表示不添加drop table这样的语句;05:-n和-t没有指定,默认为false,就表示备份表结构和表数据;06:--skip-extended-insert用来关闭--extended-insert参数,这样表中的数据备份出来就不是一整条insert07:-R -E没有指定,默认是False,就是不备份存储过程、自定义函数、事件;08:--skip-triggers用来关闭--triggers(触发器,默认True);09:lili表示业务库的库名,我这里是存在的哈10:如果lili库下有视图,也会把视图给备份出来,但生产中不用视图;

自动分库(每个业务库下所有表结构+表数据)进行全备

利用shell进行分库(业务库)备份(就是将chenliang库和lili这两个库进行分库逻辑全备,每个库备份出来都是一个单独的sql文件)。要考虑到可能以后还会增加业务库,现有业务库也可能会被迁移走。以下的脚本是思路,不规范哈。

#!/bin/bash## 手动先生成binlog文件(后面备份时就不指定-F参数了)mysql -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock -e "flush logs;"# 定义变量,这个变量的值就是业务库(chenliang、lili)的名字Databases=$( mysql -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \-e "show databases;"|grep -Ev "Database|_schema|mysql|sys")# 用for循环来进行分库逻辑备份for n in $Databasesdomysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert --skip-triggers \$n|gzip >/tmp/${n}-database-all-table-info-data.sql.gzdone

看一看其备份结果:

[root@node21 ~]# ll /tmp/*-rw-r--r-- 1 root root 1137 9月 7 14:34 /tmp/chenliang-database-all-table-info-data.sql.gz-rw-r--r-- 1 root root 1126 9月 7 14:34 /tmp/lili-database-all-table-info-data.sql.gz

2.4 对单个业务库下所有表(表结构)进行备份

将chenliang业务库下所有基础表的表结构备份成一个SQL文件。另要求:要有create 库和use 库的语句,不要drop table语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table -d --skip-triggers \chenliang|gzip >/tmp/cheliang-library-all-table-info-1.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有关于mysqldump的备份原理;03:-B表示备份指定库,后面只指定了业务库chenliang,没有指定表名,同时会有create库和use库的语句;04:--skip-add-drop-table表示不添加drop table这样的语句;05:-d表示不备份表中的数据(那就是备份表结构)06:-R -E没有指定,默认是False,就是不备份存储过程、自定义函数、事件;07:--skip-triggers用来关闭--triggers(触发器,默认True);08:chenliang表示业务库的库名,我这里是存在的哈;

将chenliang业务库下所有基础表的表结构备份成一个SQL文件。另要求:不要有create 库和use 库的语句,不要drop table语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \--skip-add-drop-table -d --skip-triggers \chenliang|gzip >/tmp/cheliang-library-all-table-info-2.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有关于mysqldump的备份原理;03:没加-B参数,但我后面只指定chenliang是业务库名,没有指定表名,不会有create库和use库的语句;04:--skip-add-drop-table表示不添加drop table这样的语句;05:-d表示不备份表中的数据(那就是备份表结构)06:-R -E没有指定,默认是False,就是不备份存储过程、自定义函数、事件;07:--skip-triggers用来关闭--triggers(触发器,默认True);08:chenliang表示业务库的库名,我这里是存在的哈;

2.5 对单个业务库下所有表(表数据)进行备份

将chenliang业务库下所有基础表的表数据备份成一个SQL文件。另要求:要有create库和use库的语句,每张表基本数据备份出来不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B -t --skip-extended-insert --skip-triggers \chenliang|gzip >/tmp/chenliang-library-all-table-data-1.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03: --master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有关于mysqldump的备份原理;05:有-B参数,我后面指定的chenlian它就是库,会有create 库和use库的语句;06:-t表示不备份表结构(那就是备份表的数据)07:--skip-extended-insert表示让其备份出来的数据不是一整条insert语句;08:-R -E没有指定,默认是False,就是不备份存储过程、自定义函数、事件;09:--skip-triggers用来关闭--triggers(触发器,默认True);10:chenliang表示业务库的库名,我这里是存在的哈;

将chenliang业务库下所有基础表的表数据备份成一个SQL文件。另要求:不要有create库和use库的语句,每张表的基本数据备份出来不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-t --skip-extended-insert --skip-triggers \chenliang|gzip >/tmp/chenliang-library-all-table-data-2.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03: --master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有关于mysqldump的备份原理;05:没有-B参数,我后面指定的chenlian它是库,会有create 库和use库的语句;06:-t表示不备份表结构(那就是备份表的数据)07:--skip-extended-insert表示让其备份出来的数据不是一整条insert语句;08:-R -E没有指定,默认是False,就是不备份存储过程、自定义函数、事件;09:--skip-triggers用来关闭--triggers(触发器,默认True);10:chenliang表示业务库的库名,我这里是存在的哈;

2.6 对单个业务库下的单个表(表结构+表数据)进行备份

将chenliang库下cl1表的表结构和表数据进行备份,不要有drop table语句,表中的数据备份出来后不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \--skip-add-drop-table --skip-extended-insert --skip-triggers \chenliang cl1|gzip >/tmp/chenliang-libary-cl1-table-info-data.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:没有加-B,因为加了-B后面指定的就会认为全是库,而后面指定的cl1是表,这样不会有create 库和use库06:-t和-d没有指定,默认为false,就是备份出表结构和表数据07:--skip-extended-insert用来关闭--extended-insert参数(默认true),让其表中数据不是一整条insert08:-R和-E没有指定,默认为false,这样不备份存储过程、自定义函数、事件09:--skip-triggers用来关闭--triggers(默认true),这样就不备份触发器10:chenliang是库,而cl1是chenliang库下的表;

将chenliang库下cl2表的表结构和表数据进行备份,不要有drop table语句,表中的数据备份出来后不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \--skip-add-drop-table --skip-extended-insert --skip-triggers \chenliang cl2|gzip >/tmp/chenliang-library-cl2-table-info-data.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:没有加-B,因为加了-B后面指定的就会认为全是库,而后面指定的cl1是表,这样不会有create 库和use库06:-t和-d没有指定,默认为false,就是备份出表结构和表数据07:--skip-extended-insert用来关闭--extended-insert参数(默认true),让其表中数据不是一整条insert08:-R和-E没有指定,默认为false,这样不备份存储过程、自定义函数、事件09:--skip-triggers用来关闭--triggers(默认true),这样就不备份触发器10:chenliang是库,而cl2是chenliang库下的表;

2.7 对单个业务库下的单个表(表结构)进行备份

将chenliang库下cl1表的表结构进行备份,不要有drop table语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \--skip-add-drop-table -d --skip-triggers \chenliang cl1|gzip >/tmp/chenliang-library-cl1-table-info.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:没有加-B,因为加了-B后面指定的就会认为全是库,而后面指定的cl1是表,这样不会有create 库和use库06:-d 表示不备份表中数据(那就是表的结构了) 07:-R和-E没有指定,默认为false,这样不备份存储过程、自定义函数、事件09:--skip-triggers用来关闭--triggers(默认true),这样就不备份触发器10:chenliang是库,而cl1是chenliang库下的表;

将chenliang库下cl2表的表结构进行备份,不要有drop table语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \--skip-add-drop-table -d --skip-triggers \chenliang cl2|gzip >/tmp/chenliang-library-cl2-table-info.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:没有加-B,因为加了-B后面指定的就会认为全是库,而后面指定的cl1是表,这样不会有create 库和use库06:-d 表示不备份表中数据(那就是表的结构了) 07:-R和-E没有指定,默认为false,这样不备份存储过程、自定义函数、事件09:--skip-triggers用来关闭--triggers(默认true),这样就不备份触发器10:chenliang是库,而cl2是chenliang库下的表;

2.8 对单个业务库下的单个表(表数据)进行备份

将chenliang库下cl1表的表结构进行备份,不要有drop table语句,不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-t --skip-extended-insert --skip-triggers \chenliang cl1|gzip >/tmp/chenliang-library-cl1-table-data.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:没有加-B,因为加了-B后面指定的就会认为全是库,而后面指定的cl1是表,这样不会有create 库和use库06:-t 表示不备份表结构(那就是备份表中数据了) 07:--skip-extended-insert用来关闭--extended-insert参数(默认true),让其表中数据不是一整条insert08:-R和-E没有指定,默认为false,这样不备份存储过程、自定义函数、事件09:--skip-triggers用来关闭--triggers(默认true),这样就不备份触发器10:chenliang是库,而cl1是chenliang库下的表;

将chenliang库下cl2表的表结构进行备份,不要有drop table语句,不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-t --skip-extended-insert --skip-triggers \chenliang cl2|gzip >/tmp/chenliang-library-cl2-table-data.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:没有加-B,因为加了-B后面指定的就会认为全是库,而后面指定的cl1是表,这样不会有create 库和use库06:-t 表示不备份表结构(那就是备份表中数据了) 07:--skip-extended-insert用来关闭--extended-insert参数(默认true),让其表中数据不是一整条insert08:-R和-E没有指定,默认为false,这样不备份存储过程、自定义函数、事件09:--skip-triggers用来关闭--triggers(默认true),这样就不备份触发器10:chenliang是库,而cl1是chenliang库下的表;

2.9 对单个业务库下单个表中的部分数据进行备份

只导出chenliang库下cl1表(这张表中有8条记录的哈)中id大于2的记录(只要满足条件的数据、且备份出来的数据不要让其是整条insert语句)。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-t --skip-extended-insert --skip-triggers \chenliang cl1 --where="id > 2" >/tmp/chenliang-library-cl1-table-w-idcolumn-greater-2-data.sql## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:没有加-B,因为加了-B后面指定的就会认为全是库,而后面指定的cl1是表,这样不会有create 库和use库06:-t表示不备份表结构(那就是备份表中数据了)07:--skip-extended-insert用来关闭--extended-insert参数(默认true),让其表中数据不是一整条insert08:-R和-E没有指定,默认为false,这样不备份存储过程、自定义函数、事件09:--skip-triggers是关闭--triggers参数(默认true);10:chenliang是库,cl1是表;11:--where是用来指定条件,而我指定的条件是id>2的记录;

2.10 备份时排除某个表不备份

在对chenliang业务库进行全备(所有对象,不管有没有哈,备份时要考虑到),但不需要备份基础表cl2的表结构和表数据。另要求:不要有drop库的语句,数据不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert -R -E --triggers \chenliang --ignore-table="chenliang.cl2"|gzip >/tmp/chenliang-library-all-object-not-cl2-table.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:-B用于指定备份的库,我后面指定的chenliang就是业务库,会有创建库和use库的语句;06:--skip-add-drop-table 表示备份出来的sql文件中没有drop table语句;07:没有-t和-d,默认false,那就表示备份表结构和和表数据;08:-R -E默认false,这里指定了,表示会备份出存储过程、自定义函数、事件09:--triggers默认true,表示备份触发器,这里也指定了,方便维护;10:chenliang是业务库的库名,实例中真实存在;11:--ignore-table表示排除某个表,chenliang.cl2表示排除chenliang库下的cl2表;PS:如果要排除多个表,还需要再写一次--ignore-table参数,后面再指定某个表;

在对chenliang和lili进行全备(所有对象,不管有没有哈,备份时要考虑到),但不需要备chenliang库下的cl2表和lili库下的li2表。另要求:不要有drop库的语句,数据不要是一整条insert语句。

## 备份命令mysqldump -uroot -pchenliang -S /data/mysql/3306/run/mysql.sock \--set-gtid-purged=off -F --master-data=2 -x \-B --skip-add-drop-table --skip-extended-insert -R -E --triggers \chenliang lili --ignore-table="chenliang.cl2" \--ignore-table="lili.li2" |gzip >/tmp/chenliang-library-all-object-not-cl2-table.sql.gz## 命令说明01:--set-gtid-purged=off 表示备份时不记录GTID,当前mysql实例是有开gtid,不管开没开,设置成off没错02:-F 表示刷新binlog,当前mysql实例有开binlog,不然指定-F会直接报错,整个备份失败;03:--master-data=2 表示记录binlog文件和Pos点,且在备份文件中进行注释,我都这样干;04:-x是锁表的参数,这里不考虑,下一大章节会有讲到mysqldump的备份原理05:-B用于指定备份的库,我后面指定的chenliang和lili都就是业务库,会有创建库和use库的语句;06:--skip-add-drop-table 表示备份出来的sql文件中没有drop table语句;07:没有-t和-d,默认false,那就表示备份表结构和和表数据;08:-R -E默认false,这里指定了,表示会备份出存储过程、自定义函数、事件09:--triggers默认true,表示备份触发器,这里也指定了,方便维护;10:chenliang和lili都是是业务库的库名,实例中真实存在;11:--ignore-table="chenliang.cl2" 排除chenliang库下的cl2表12:--ignore-table="lili.li2" 排除lili库下的li2表

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。