逻辑备份参数详解
mysqldump
1.基本参数
-A 备份所有的database
-B 备份哪几个数据库
--routines, -R参数代表也要把存储过程和函数导出来
-E 备份定时任务(-- events)
--no-data, -d参数代表不要导出数据,只导出表结构
--no-create-info,表示不导出表结构,只导数据
-w 备份过滤数据
-t ,只备份数据
-q ,直接读数据,绕过缓冲池,默认已加
--where 备份表中条件数据
--triggers 备份触发器
Select … into outfield :命令可以用来导出表中符合条件的数据到文本文件,不导出表结构,仅用来导出数据
--dump-slave[=value]参数表示从复制的slave从库导出备份,且其中包含了change master to语句
--master-data=2 在备份文件中以注释的形式记录备份开始时binlog的position,默认值是1,不注释
--single-transaction ####下面详解
必须加(--single-transaction参数代表将事务隔离级别设置为可重复读并在导出开始时执行start transaction开启一个
新的事务,在dump的执行过程中也不会阻止任何的读写操作)
-tab=dir_name参数来指定文本文件的导出路径;需要在my.cnf中先配置secure_file_priv=/usr/local/mysql/backup/参数
在备机上导出数据时
master-data=2则改成--dump-slave[=value]参数表示从复制的slave从库导出备份,且其中包含了change master to语句,则利用此备份文件可以直接建立另一个复制从库。value参数如果不写或者=1的情况下,则change master to语句写入到dump文件中,如果设置=2则代表也写入到dump文件中,只是会注释掉
--master-data[=value]参数表示从复制的主库上导出备份,和--dump-slave参数配置类似,可以利用此备份文件直接建立另一个复制从库。其value的取值含义也和dump-slave相同。使用该参数会自动打开—lock-all-table参数,除非同时使--single-transaction参数
--ignore-table=db_name.tbl_name参数代表导出过程中忽略某个指定表的导出,如果要忽略多个表则这个参数要使用多次
tips:
①--set-gtid-purged=OFF 如果实例开了gtid最好加上这个参数,不然备份时候会报warning,且备份出来的数据恢复到其他版本的实例上会报错:A partial dump from a server that has GTIDs is not allowed.
②--dump-slave,该参数可以用作在从库做备份获取主库的位置点,来做一个新从库,避免在主库做备份影响业务,带该参数备份时,从上sql线程会被kill,备份完再拉起
master-data
**** FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与binlog位点匹配)。由于FTWRL总共需要持有两把全局的MDL锁,并且还需要关闭所有表对象,因此这个命令的杀伤性很大,执行命令时容易导致库卡住
FTWRL主要包括3个步骤:
1.上全局读锁(lock_global_read_lock)
2.清理表缓存(close_cached_tables)
3.上全局COMMIT锁(make_global_read_lock_block_commit)
FTWRL每个操作的影响上全局读锁会导致所有更新操作都会被堵塞;关闭表过程中,如果有大查询导致关闭表等待,那么所有访问这个表的查询和更新都需要等待;上全局COMMIT锁时,会堵塞活跃事务提交
例:mysqldump -u root -p -P 3307 --master-data --single-transaction course >course.sql
通过打开全日志看到备份流程
2017-07-14T02:25:20.174098Z 4 Connect root@localhost on using Socket
2017-07-14T02:25:20.174202Z 4 Query /*!40100 SET @@SQL_MODE='' */
2017-07-14T02:25:20.174283Z 4 Query /*!40103 SET TIME_ZONE='+00:00' */
2017-07-14T02:25:20.174353Z 4 Query FLUSH /*!40101 LOCAL */ TABLES
2017-07-14T02:25:20.175098Z 4 Query FLUSH TABLES WITH READ LOCK
2017-07-14T02:25:20.175152Z 4 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2017-07-14T02:25:20.175186Z 4 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2017-07-14T02:25:20.175245Z 4 Query SHOW VARIABLES LIKE 'gtid\_mode'
2017-07-14T02:25:20.176523Z 4 Query SHOW MASTER STATUS
2017-07-14T02:25:20.176573Z 4 Query UNLOCK TABLES
2017-07-14T02:25:20.176675Z 4 Query SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM
INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND
master-data
参数single-transaction的意义
通过start transaction with consistent snapshot实现一致性快照读:通过将导出操作封装在一个事务内来使得导出的数据是一个一致性快照。只有当表使用支持MVCC的存储引擎(目前只有InnoDB)时才可以工作,其他引擎(MyISAM)不能保证导出是一致的。如备份开启之后,通过一致性快照记录了mysql的binlog和position,此时往innodb表里写入数据,因为有一致性快照,备份读不到最新的记录,但是该操作会在之前记录binlog之后位置里记录,当还原的时候,直接应用之后的binlog记录即可。而myisam不支持事务,没有快照,备份直接取最新数据,而写入操作会持续记录到binlog里,所以还原的时候会导致一致性被破环。当还原到一个新从并开启同步的change(备份里面记录的点)之后,myisam表会出现主键冲突,而innodb表不会。
在可重复读隔离级别下,start transaction和start transaction with consistent snapshot语句的区别:
1)START TRANSACTION 时,是第一条语句的执行时间点,就是事务开始的时间点,第一条select语句建立一致性读的snapshot;
2)START TRANSACTION WITH consistent snapshot 时,则是立即建立本事务的一致性读snapshot,当然也开始事务了;
备份的过程会有时间差;在某一个时间点执行备份都会获取这个时间点的一致性数据,保证数据可用性
3)解锁时间快 (不加此参数都是备份完成后解锁)
备份例子:
导出一个数据库:
[root@master ~]# mysqldump -uroot -p -P3308 --databases course>backup.sql
导出多个数据库:
[root@master ~]# mysqldump -u root -p -P 3308 --databases course test>course.sql
[root@master ~]# mysqldump -u root -p -P 3308 -B course test>course.sql
导出所有数据库:
[root@master ~]# mysqldump -u root -p -P 3308 --all-databases>course.sql
导出一个数据库的某几个表:
[root@master ~]# mysqldump -u root -p -P 3308 course students students_myisam>course.sql
仅导出course数据库的数据而不包含表结构:
[root@master ~]# mysqldump -u root -p -P 3308 --no-create-info course>course.sql
仅导出course数据库中的students和students_myisam两个表的数据:
[root@master ~]# mysqldump -u root -p -P 3308 --no-create-info course students
students_myisam>course.sql
仅导出course数据库的表结构:
[root@master ~]# mysqldump -u root -p -P 3308 --no-data course>course.sql
导出course数据库中除了teacher和score两个表的其他表结构和数据:
[root@master ~]# mysqldump -u root -p -P 3308 --ignore-table=course.teacher --ignoretable=course.score course>course.sql
导出course数据库的表和存储过程和触发器:
[root@master ~]# mysqldump -u root -p -P 3308 --routine --trigger course>course.sql
导出course数据库中符合where条件的数据:
[root@master ~]# mysqldump -u root -p -P 3308 --where="sid in (1,2)" course students
students_myisam>course.sql
远程导出course数据库,导出文件在发起导出命令的服务器上:
[root@slave1 course]# mysqldump -u root -p -P 3308 -h 192.168.237.128 course >course.sql
--tab=dir_name
导出数据到文本文件dir_name=/usr/local/mysql/backup/目录下:
导出students表里的部分数据:
mysql> select * from students where sid in (1,2) into outfile '/usr/local/mysql/backup/students2.txt' fields terminated by ',' enclosed by '"' lines terminated by ‘\r\n';