背景
备份参数的使用
简而言之
可以不添加,但是需要知道添加或是不添加,造成的影响面积
写在前面
原文链接https://www.cnblogs.com/digdeep/p/4906032.html
link
-A
-A, --all-databases Dump all the databases.
包括了mysql数据库,但是不会包含 information_schema和performance_schema两个数据库。
- - lock-tables
mysqldump 默认启用了 --lock-tables,所以会导致在备份期间对
所有表持有读锁: lock table tb read local,所以所有的update,delete语句 会被阻塞。
但是select语句和insert语句不会被阻塞。
该备份方式,虽然在整个备份过程中持有了 lock table tb read local,但是还是可以执行 insert 语句的。所以得到的不是一致性的备份。虽然得到的不是 一致性的备份,但是因为flush log之后,所有的操作 也会记入新的binary log,所以如果使用了所有新的binary log来进行完全恢复的话,最后恢复的数据
也是一致性的。当然不一致性的备份无法用于搭建slave。
如果要得到一致性的备份的话,需要使用 --lock-all-tables 或者使用 --single-transaction 选项。前者使用了全局读锁,不允许任何修改操作。后者使用了事务的特性来得到一致性备份。
推荐使用--single-transaction 选项(只针对事务表,一般是innodb)
优化锁 和 得到一致性备份
1.请结合使用 --single-transaction 、--master-data=2 、--flush-logs 来达到将锁定时间大大减少的目的。同时有得到了一致性的备份,而且该一致性备份和 flush 的日志也是一致的;
2.将mysql数据库的备份分开来(可选,包含非innodb表)
3.加上 --routines 来备份存储过程和函数,触发器默认会备份。 -R, --routines Dump stored routines (functions and procedures)
(--flush-logs非必须)
mysqldump -uxxx -p --single-transaction --master-data=2 --routines --flush-logs
--databases db1 db2 db3 > alldb.sql;
mysqldump -uxxx -p --flush-privileges --databases mysql > mysql.sql;
–set-gtid-purged=OFF(不推荐使用)
例句
mysqldump --socket=/tmp/mysql5.7.32.sock -u root -p --add-drop-table --routines --events --master-data=2 --single-transaction --databases ceshi000 > data-for000-upgrade.sql
如何添加--set-gtid-purged=OFF选项,备份文件中不包括GTID信息,恢复之后,还需要设置set global gtid_purged=xx;
不添加该选项:(推荐)
导入包含gtid-purged值的备份文件需要先在从库reset master;(清空Executed_Gtid_Set信息)
不需要其他操作。
导入之后日志显示:
[MY-010916] [Server] @@GLOBAL.GTID_PURGED was changed from '' to 'dc7a9ee6-7a3c-11eb-a0cc-000c29691a9a:1-12'.
2021-03-02T11:22:36.916927+08:00 18 [System] [MY-010917] [Server] @@GLOBAL.GTID_EXECUTED was changed from '' to 'dc7a9ee6-7a3c-11eb-a0cc-000c29691a9a:1-12'.
读者可根据实际情况选择,比如不需要GTID或是恢复到5.5版本时,可使用。
或者也可配合设置sql_log_bin=off,取消记录到日志中。(防止从库用户建立等操作,改变gtid的值影响复制)
其他(主从补充)
read-only=1 和 skip-slave-start=1 前者可以防止没有super权限的用户在slave上进行写,后者防止在启动slave数据库时,自动启动复制线程。以后需要手动start slave来启动复制线程。
在master上建立一个具有复制权限的用户:
grant replication slave, replication client on . to repl@’192.168.%.%’ identified by ‘123456’;
需要启用 --lock-all-tables(master-data=1/2会自动启用–lock-all-tables)或者–single-transaction;
另外还需要知道该一致性备份的数据,对应的master上的binary log的文件名,以及在该文件中的position,
所以必须启用 master-data选项。(文件中会包含位点信息)
mysqldump -uroot -p --routines --flush-logs --single-transaction --master-data=2
--databases db1 db2 > /root/backup.sql; (--flush-logs非必须)
这样全局锁仅仅在备份的开始短暂的持有。不会再备份的整个过程中持有全局锁。
不推荐source backup.sql的方式导入数据,可以使用 mysql <backup.sql
找到 --master-data 输出的 binary log 的文件名和postion:
head -50 /tmp/backup.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=809;
replication涉及到的三个线程:
1> master上的 binlog dump(dump线程),即读取master上的binlog,发送到slave上的线程。
2> slave上的IO线程:读取slave上的relay log。
3> slave上的sql线程:执行IO线程读取的relay log的线程。
mysqldump逻辑备份适合数据量小的库,使用 xtrabackup,物理备份。 也推荐MySQLDumper(并行)
本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删