目录
1. 备份类型
2. 逻辑备份VS物理备份
3. mysqldump工具
3.1 备份命令格式
3.2 备份选项
3.3 备份全库(结构和数据)
3.4 备份全库(仅结构)
3.5 备份全库(仅数据)
3.6 备份单个数据库(结构和数据)
3.7 备份单个数据库(仅结构)
3.8 备份单个数据库(仅数据)
3.9 备份多个指定数据库(多个数据库以空格间隔)
3.10 备份多张表
3.11 排除某些表
3.12 指定where条件
3.13 压缩备份
3.14 压缩备份至远程服务器
3.13 一致性导出
3.14 备份原理
3.15 详细过程解释
3.16 原理总结
4.恢复
4.1 mysql命令恢复
4.2 source命令恢复
4.3 备份并用gzip压缩
4.4 备份并用bzip压缩
1. 备份类型
2. 逻辑备份VS物理备份
3. mysqldump工具
mysqldump是MySQL自带的逻辑备份工具,连接MySQL数据库,生成一组SQL语句,可以执行这些语句来重现原始数据库对象定义和表数据。mysqldump命令还可以生成CSV、其他分隔文本或XML格式的输出。它是单线程备份恢复。
3.1 备份命令格式
mysqldump [options] db_name [tbl_name ...] > 脚本名.sql
mysqldump [options] --databases db_name ... > 脚本名.sql
mysqldump [options] --all-databases > 脚本名.sql
3.2 备份选项
选项 | 简写 | 描述 |
--add-drop-database | 在每个CREATE DATABASE语句之前添加DROP DATABASE语句 | |
--add-drop-table | 在每个CREATE TABLE语句之前添加DROP TABLE语句 | |
--add-drop-trigger | 在每个CREATE TRIGGER语句之前添加DROP TRIGGER声明 | |
--add-locks | 在每张导出的表前后用LOCK TABLES和UNLOCK TABLES语句包裹 | |
--all-databases | -A | 导出所有数据库的所有表 |
--allow-keywords | 允许创建的列名是关键字 | |
--apply-slave-statements | 在CHANGE MASTER语句之前包括STOP SLAVE,在输出结束时包括START SLAVE | |
--bind-address | 使用指定的网络接口连接到MySQL Server | |
--character-sets-dir | 安装字符集的目录 | |
--comments | -i | 将注释添加到dump file |
--compact | 提供较少的详细输出(对调试有用)。禁用结构注释和页眉/页脚构造,相当于一个参数包,其中包含了--skip-add-drop-table,--skip-add-locks,--skip-comments,--skip-disable-keys,--skip-set-charset,以产生更紧促的输出 | |
--compatible | 与其他数据库兼容,或与旧版本MySQL兼容,值为ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, or no_field_options,多个值用逗号分隔 | |
--complete-insert | -c | 在CREATE TABLE语句中包括所有MySQL特定的表选项 |
--compress | -C | 在客户端和服务器之间启用压缩传递所有信息 |
--create-options | -a | 在CREATE TABLE语句中包括所有MySQL特性选项(默认为打开状态,可以使用--skip-create-options禁用) |
--databases | -B | 指定要备份的数据库 |
--debug | -# | 写入调试日志 |
--debug-check | 程序退出时打印调试信息 | |
--debug-info | 程序退出时打印调试信息,内存和CPU统计信息 | |
--default-auth | 使用的密码验证插件 | |
--default-character-set | 指定默认字符集 | |
--defaults-extra-file | 除了读取常用选项文件外,还读取命名选项文件 | |
--defaults-file | 只读取命名选项文件 | |
--defaults-group-suffix | 组后缀 | |
--delete-master-logs | 在复制源服务器上,执行dump(备份)操作后删除二进制日志,自动启用 | |
--disable-keys | -K | disable and enable keys包围INSERT语句 |
--dump-date | 输出结尾显示dump完成时间,默认为on;使用--skip dump date可禁用 | |
--dump-slave | 该选项将导致主的binlog位置和文件名追加到导出数据的文件中。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,在命令前增加说明信息。该选项将会打开--lock-all-tables,除非--single-transaction被指定。该选项会自动关闭--lock-tables选项。默认值为0 | |
--enable-cleartext-plugin | Enable/disable明文身份验证插件 | |
--events | -E | 导出events |
--extended-insert | -e | 使用多行INSERT语法 |
--fields-enclosed-by | 指定包裹字段的字符 | |
--fields-escaped-by | 指定转义字符 | |
--fields-optionally-enclosed-by | 指定包裹字段的字符,对纯数字无影响不加字符包裹 | |
--fields-terminated-by | 指定字段之间的字符 | |
--flush-logs | -F | 导出之前刷新日志,假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。 |
--flush-privileges | 在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候。 | |
--force | -f | 遇到sql报错继续执行 |
--get-server-public-key | 从服务器请求RSA公钥 | |
--help | -? | 查看帮助 |
--hex-blob | 使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB | |
--host | -h | 要导出的MySQL服务器ip |
--ignore-error | 指定忽略的错误,错误号以逗号分隔 | |
--ignore-table | 不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:--ignore-table=db.t1 --ignore-table=db.t2 | |
--include-master-host-port | 使用了--dump-slave时在CHANGE MASTER语句中加入MASTER_HOST和MASTER_PORT。 | |
--insert-ignore | 用INSERT IGNORE 而非INSERT ,以忽略主键或唯一键的重复数据。 | |
--lines-terminated-by | 指定换行符 | |
--lock-all-tables | -x | 提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭–single-transaction 和–lock-tables 选项 |
--lock-tables | -l | 导出之前锁定所有表 |
--log-error | 附加警告和错误信息到给定文件 | |
--login-path | 从.mylogin.cnf登录文件读取登录参数。可通过mysql_config_editor创建登录文件。 | |
--master-data | 该选项将binlog的位置和文件名追加到输出文件中。如果为1,将会输出CHANGE MASTER 命令;如果为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种情况下,全局读锁在开始导出时获得很短的时间;其他内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。(在主执行) | |
--max-allowed-packet | 发送或接收服务器的最大数据包长度 | |
--net-buffer-length | TCP/IP及socket通讯的buffer大小 | |
--no-autocommit | 在INSERT前后添加set autocommit=0和commit | |
--no-create-db | -n | 若使用了--all-databases或--databases,则不在输出中添加CREATE DATABASE |
--no-create-info | -t | 不使用CREATE TABLE 重建备份的表 |
--no-data | -d | 只导出表结构,不导出表数据 |
--no-defaults | 不读取选项文件 | |
--no-set-names | -N | 相当于 --skip-set-charset |
--no-tablespaces | -y | 不导出任何表空间信息,不在输出中使用CREATE LOG FILE和CREATE TABLESPACE |
--opt | --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset,和--disable-keys几个选项合起来的简写形式。 | |
--order-by-primary | 将备份的表中的行按主键排序或者第一个唯一键排序 | |
--password | -p | 连接MySQL用户的密码 |
--pipe | 在Windows上通过命名管道连接server | |
--plugin-dir | 客户端插件的目录,用于兼容不同的插件版本 | |
--port | -P | MySQL连接端口 |
--print-defaults | 输出默认选项 | |
--protocol | 连接MySQL使用的协议 | |
--quick | -q | 备份时逐行读取表而非一次全部读取行后缓冲在内存中。在备份大表时有用。不缓冲查询,直接导出到标准输出 |
--quote-names | -Q | 用反引号(`)引用表和列名。(默认为on;使用--skip-quote-names禁用。)若使用了ANSI_QUOTES则用“””包围。特别的,可能需要在—compatible后开启该选项 |
--replace | 用REPLACE替代INSERT INTO.(REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。 | |
--result-file | -r | 将结果输出到指定的文件 |
--routines | -R | 导出routines(存储过程和函数) |
--secure-auth | 如果客户端使用旧的(4.1.1之前的)协议,则拒绝客户端连接到服务器。MySQL 5.7.5 该参数已弃用。始终为TRUE,不能修改 | |
--server-public-key-path | RSA公钥目录 | |
--set-charset | 将“SET NAMES default_character_SET”添加到输出中。(默认为on;使用–skip-set-charset关闭) | |
--set-gtid-purged | 确定是否在结果中添加SET @@GLOBAL.GTID_PURGED。若为ON但在server中没有开启GTID则发生错误。若OFF则什么都不做。若AUTO则server中开启GTID那么添加上述语句,反之不加。 | |
--shared-memory-base-name | 共享内存连接的共享内存名称(仅限Windows) | |
--single-transaction | 在备份前设置事务隔离级别为REPEATABLE READ并向server发送START TRANSACTION语句。仅对事务型表如InnoDB有用。与--ock-tables互斥。对于大文件备份--single-transaction与--quick结合使用。 | |
--skip-add-drop-table | 禁用--add-drop-table, 在CREATE TABLE之前不添加DROP TABLE语句 | |
--skip-add-locks | 禁用--add-locks | |
--skip-comments | 禁用--comments | |
--skip-compact | 禁用--compact | |
--skip-disable-keys | 禁用--disable-keys | |
--skip-extended-insert | 禁用--extended-insert | |
--skip-mysql-schema | 导出时不删除schema,默认要删除schema,在MySQL 5.7.36中增加此参数 | |
--skip-opt | 禁用--skip-opt | |
--skip-quick | 禁用--quick | |
--skip-quote-names | 禁用--quote-names | |
--skip-set-charset | 禁用--set-charset | |
--skip-triggers | 不导出triggers | |
--skip-tz-utc | 禁用-- tz-utc | |
--socket | -S | 连接本机server所使用的socket |
--ssl | 使用加密连接 | |
--ssl-ca | 包含受信任SSL认证列表的文件 | |
--ssl-capath | 包含受信任SSL认证列表文件的目录 | |
--ssl-cert | 包含X.509证书的文件 | |
--ssl-cipher | 一系列用于SSL加密的所允许的密码 | |
--ssl-crl | 包含废弃证书的列表 | |
--ssl-crlpath | 包含废弃证书列表的目录 | |
--ssl-key | 包含X.509密钥的文件 | |
--ssl-mode | 与服务器连接所需的安全状态 | |
--ssl-verify-server-cert | 已废弃. 使用--ssl-mode=VERIFY_IDENTITY 替代 | |
--tab | -T | 为给定的每个表创建以制表符分隔的文本文件路径。 创建.sql和.txt文件,.sql文件为表结构,.txt为表数据。注意:这只适用如果mysqldump在与mysqld相同的机器上运行服务器。 |
--tables | 覆盖--databases (-B)参数,指定需要导出的表名 | |
--tls-version | 用于加密连接的允许TLS协议 | |
--triggers | 导出表trigger | |
--tz-utc | 在导出顶部设置时区TIME_ZONE='+00:00' ,以保证在不同时区导出的TIMESTAMP 数据或者数据被移动其他时区时的正确性。(默认开启,用--skip-tz-utc禁用) | |
--user | -u | 连接MySQL的用户 |
--verbose | -v | 输出多种平台信息,详细信息 |
--version | -V | 显示mysqldump版本信息并退出 |
--where | -w | 仅导出与where条件中匹配的行。请注意如果条件包含命令解释符专用空格或字符,一定要将条件引用起来 |
--xml | -X | 导出XML格式 |
3.3 备份全库(结构和数据)
mysqldump -uroot -p123456 --all-databases > /backup/all_db.sql
或者
mysqldump -uroot -p123456 -A > /backup/all_db.sql
3.4 备份全库(仅结构)
mysqldump -uroot -p123456 -A -d > /backup/all_metadata.sql
或者
mysqldump -uroot -p123456 --all-databases --no-data > /backup/all_metadata.sql
3.5 备份全库(仅数据)
mysqldump -uroot -p123456 --all-databases --no-create-info > /backup/all_data.sql
或者
mysqldump -uroot -p123456 -A -t > /backup/all_data.sql
3.6 备份单个数据库(结构和数据)
mysqldump -uroot -p123456 zs > /backup/zs.sql
3.7 备份单个数据库(仅结构)
mysqldump -uroot -p123456 zs -d > /backup/zs_metadata.sql
或者
mysqldump -uroot -p123456 zs --no-data > /backup/zs_metadata.sql
3.8 备份单个数据库(仅数据)
mysqldump -uroot -p123456 zs -t > /backup/zs_data.sql
或者
mysqldump -uroot -p123456 zs --no-create-info > /backup/zs_data.sql
3.9 备份多个指定数据库(多个数据库以空格间隔)
mysqldump -uroot -p123456 --databases db1 db2 > /backup/somedbs.sql
或者
mysqldump -uroot -p123456 -B db1 db2 > /backup/somedbs.sql
3.10 备份多张表
mysqldump -uroot -p123456 -B zs --tables aa z1 > /backup/aa_z1.sql
或者
mysqldump -uroot -p123456 zs aa z1 > /backup/aa_z1.sql
3.11 排除某些表
导出DB中其余表结构和数据
mysqldump -uroot -p123456 zs --ignore-table=zs.aa --ignore-table=zs.t1 > /backup/ignoe.sql
3.12 指定where条件
导出表的部分数据(多张表都需有where条件后的字段)
mysqldump -uroot -p123456 zs z1 t1 -w 'a<=4' > /backup/where.sql
3.13 压缩备份
mysqldump -uroot -p123456 -B zs python --single-transaction --master-data=2 --triggers | gzip > /backup/zs_python.sql.tar.gz
3.14 压缩备份至远程服务器
mysqldump -uroot -p123456 -B zs python --single-transaction --master-data=2 --triggers -E -R | gzip | ssh root@192.168.26.101 'cat > /tmp/zs_python.sql.tar.gz'
3.13 一致性导出
导出的时候为了一致性,一般加上参数--single-transaction,可以在配置文件中加上该参数
[mysqldump]
single-transaction
3.14 备份原理
版本为MySQL 5.7.44
#设置general_log日志输出到表,然后执行mysqldump导出
set global log_output = 'TABLE'
set global general_log = 1;
#mysqldump执行完毕后关闭general_log
set global general_log = 0;
#执行语句
mysqldump -uroot -p123456 -B zs python --single-transaction --triggers -E -R > /backup/zs_python.sql
查看mysql.general_log表日志
+-----------+--------------+------------------------------------------------------------------------------------------------------+
| thread_id | command_type | left(argument,100) |
+-----------+--------------+------------------------------------------------------------------------------------------------------+
| 23 | Connect | root@localhost on using Socket |
| 23 | Query | /*!40100 SET @@SQL_MODE='' */ |
| 23 | Query | /*!40103 SET TIME_ZONE='+00:00' */ |
| 23 | Query | SHOW VARIABLES LIKE 'gtid_mode' |
| 23 | Query | FLUSH /*!40101 LOCAL */ TABLES |
| 23 | Query | FLUSH TABLES WITH READ LOCK |
| 23 | Query | SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ |
| 23 | Query | START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ |
| 23 | Query | SHOW MASTER STATUS |
| 23 | Query | UNLOCK TABLES |
| 23 | Query | SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SC |
| 23 | Query | SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FR |
| 23 | Query | SHOW VARIABLES LIKE 'ndbinfo\_version' |
| 23 | Init DB | zs |
| 23 | Query | SHOW CREATE DATABASE IF NOT EXISTS `zs` |
| 23 | Query | SAVEPOINT sp |
| 23 | Query | show tables |
| 23 | Query | show table status like 'aa' |
| 23 | Query | SET SQL_QUOTE_SHOW_CREATE=1 |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | show create table `aa` |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | show fields from `aa` |
| 23 | Query | show fields from `aa` |
| 23 | Query | SELECT /*!40001 SQL_NO_CACHE */ * FROM `aa` |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | use `zs` |
| 23 | Query | select @@collation_database |
| 23 | Query | SHOW TRIGGERS LIKE 'aa' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | ROLLBACK TO SAVEPOINT sp |
| 23 | Query | show table status like 't1' |
| 23 | Query | SET SQL_QUOTE_SHOW_CREATE=1 |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | show create table `t1` |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | show fields from `t1` |
| 23 | Query | show fields from `t1` |
| 23 | Query | SELECT /*!40001 SQL_NO_CACHE */ * FROM `t1` |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | use `zs` |
| 23 | Query | select @@collation_database |
| 23 | Query | SHOW TRIGGERS LIKE 't1' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | ROLLBACK TO SAVEPOINT sp |
| 23 | Query | show table status like 'z1' |
| 23 | Query | SET SQL_QUOTE_SHOW_CREATE=1 |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | show create table `z1` |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | show fields from `z1` |
| 23 | Query | show fields from `z1` |
| 23 | Query | SELECT /*!40001 SQL_NO_CACHE */ * FROM `z1` |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | use `zs` |
| 23 | Query | select @@collation_database |
| 23 | Query | SHOW TRIGGERS LIKE 'z1' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | ROLLBACK TO SAVEPOINT sp |
| 23 | Query | RELEASE SAVEPOINT sp |
| 23 | Query | show events |
| 23 | Query | use `zs` |
| 23 | Query | select @@collation_database |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | SHOW FUNCTION STATUS WHERE Db = 'zs' |
| 23 | Query | SHOW PROCEDURE STATUS WHERE Db = 'zs' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Init DB | python |
| 23 | Query | SHOW CREATE DATABASE IF NOT EXISTS `python` |
| 23 | Query | SAVEPOINT sp |
| 23 | Query | show tables |
| 23 | Query | show table status like 'Orders' |
| 23 | Query | SET SQL_QUOTE_SHOW_CREATE=1 |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | show create table `Orders` |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | show fields from `Orders` |
| 23 | Query | show fields from `Orders` |
| 23 | Query | SELECT /*!40001 SQL_NO_CACHE */ * FROM `Orders` |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | use `python` |
| 23 | Query | select @@collation_database |
| 23 | Query | SHOW TRIGGERS LIKE 'Orders' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | ROLLBACK TO SAVEPOINT sp |
| 23 | Query | show table status like 't' |
| 23 | Query | SET SQL_QUOTE_SHOW_CREATE=1 |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | show create table `t` |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | show fields from `t` |
| 23 | Query | show fields from `t` |
| 23 | Query | SELECT /*!40001 SQL_NO_CACHE */ * FROM `t` |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | use `python` |
| 23 | Query | select @@collation_database |
| 23 | Query | SHOW TRIGGERS LIKE 't' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | ROLLBACK TO SAVEPOINT sp |
| 23 | Query | show table status like 'y' |
| 23 | Query | SET SQL_QUOTE_SHOW_CREATE=1 |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | show create table `y` |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | show fields from `y` |
| 23 | Query | show fields from `y` |
| 23 | Query | SELECT /*!40001 SQL_NO_CACHE */ * FROM `y` |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | use `python` |
| 23 | Query | select @@collation_database |
| 23 | Query | SHOW TRIGGERS LIKE 'y' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | ROLLBACK TO SAVEPOINT sp |
| 23 | Query | show table status like 'z' |
| 23 | Query | SET SQL_QUOTE_SHOW_CREATE=1 |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | show create table `z` |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | show fields from `z` |
| 23 | Query | show fields from `z` |
| 23 | Query | SELECT /*!40001 SQL_NO_CACHE */ * FROM `z` |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | use `python` |
| 23 | Query | select @@collation_database |
| 23 | Query | SHOW TRIGGERS LIKE 'z' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Query | ROLLBACK TO SAVEPOINT sp |
| 23 | Query | RELEASE SAVEPOINT sp |
| 23 | Query | show events |
| 23 | Query | use `python` |
| 23 | Query | select @@collation_database |
| 23 | Query | SET SESSION character_set_results = 'binary' |
| 23 | Query | SHOW FUNCTION STATUS WHERE Db = 'python' |
| 23 | Query | SHOW PROCEDURE STATUS WHERE Db = 'python' |
| 23 | Query | SET SESSION character_set_results = 'utf8' |
| 23 | Quit | |
+-----------+--------------+------------------------------------------------------------------------------------------------------+
3.15 详细过程解释
#1.MySQLdump 工具连接MySQL服务端
root@localhost on using Socket
#2.修改当前SESSION的SQL模式为空;避免对备份产生影响
/*!40100 SET @@SQL_MODE='' */
#3.设置time_zone为+00:00
/*!40103 SET TIME_ZONE='+00:00' */
#4.查询是否开启GTID
SHOW VARIABLES LIKE 'gtid_mode'
#5.刷新表,减少FTWRL锁的等待时间
FLUSH /*!40101 LOCAL */ TABLES
#6.因为开启了--master-data=2,这时就需要flush tables with read lock锁住全库为只读,
记录当时的master_log_file和master_log_pos点
这里有一个疑问?
执行flush tables操作,并加一个全局读锁,那么以上两个命令貌似是重复的,
为什么不在第一次执行flush tables操作的时候加上锁呢?
是为了避免较长的事务操作造成FLUSH TABLES WITH READ LOCK操作迟迟得不到
锁,但同时又阻塞了其它客户端操作,减少FTWRL锁的等待时间。
FLUSH TABLES WITH READ LOCK
#7.--single-transaction参数的作用,设置事务的隔离级别为可重复读,
即REPEATABLE READ,这样能保证在一个事务中所有相同的查询读取到同样的数据,
也就大概保证了在dump期间,如果其他innodb引擎的线程修改了表的数据并提交,
对该dump线程的数据并无影响,然而这个还不够,还需要看下一条
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
#8.获取当前数据库的快照,这个是由mysqldump中--single-transaction决定的。
# WITH CONSISTENT SNAPSHOT能够保证在事务开启的时候,第一次查询的结果就是
事务开始时的数据A,即使这时其他线程将其数据修改为B,查的结果依然是A。简而言之,就是开启事务并对所有表执行了一次SELECT操作,这样可保证备份时,
在任意时间点执行select * from table得到的数据和
执行START TRANSACTION WITH CONSISTENT SNAPSHOT时的数据一致。
【注意】,WITH CONSISTENT SNAPSHOT只在RR隔离级别下有效
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
#9.这个是由--master-data决定的,记录了开始备份时,binlog的状态信息,
包括MASTER_LOG_FILE和MASTER_LOG_POS
SHOW MASTER STATUS
#10.释放FLUSH TABLES WITH READ LOCK锁
UNLOCK TABLES
#11.获取undo文件信息
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 LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('zs','python'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME
#12.获取数据文件信息
SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('zs','python')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME
#13.查看ndb版本信息
SHOW VARIABLES LIKE 'ndbinfo\_version'
#14.开始导出zs数据库
zs
#15.查看创建zs数据库的语句加上IF NOT EXISTS子句
SHOW CREATE DATABASE IF NOT EXISTS `zs`
#16.在一个事务中,sp检查点为了释放表元数据锁
SAVEPOINT sp
#17.获取数据库表信息
show tables
#18.获取表的状态信息
show table status like 'aa'
#19.sql_quote_show_create,有两个值(1,0),默认是1,表示表名和列名会用``包着的
SET SQL_QUOTE_SHOW_CREATE=1
#20.设置字符集为binary,为了更好的备份表结构,将字符集先设置成binary,避免出错
SET SESSION character_set_results = 'binary'
#21.获取表创建语句
show create table `aa`
#22.设置字符集为utf8,开始备份表数据时将字符集设置为数据库的字符集。
SET SESSION character_set_results = 'utf8'
#23.获取表的字段信息
show fields from `aa`
show fields from `aa`
#24.查询表数据,结合show fields from `country`的字段信息生成insert into语句,开始导出表
SELECT /*!40001 SQL_NO_CACHE */ * FROM `aa`
#25.设置字符集为binary
SET SESSION character_set_results = 'binary'
use `zs`
#查看zs数据库字符集编码
select @@collation_database
#26.查询触发器,导出触发器
SHOW TRIGGERS LIKE 'aa'
SET SESSION character_set_results = 'utf8'
#27.回滚至sp检查点,释放表aa的元数据锁,使其他操作可以作用在表aa,比如创建索引等等
ROLLBACK TO SAVEPOINT sp
#28.以下是重复操作步骤18~27,对其他表进行导出
show table status like 't1'
SET SQL_QUOTE_SHOW_CREATE=1
SET SESSION character_set_results = 'binary'
show create table `t1`
SET SESSION character_set_results = 'utf8'
show fields from `t1`
show fields from `t1`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `t1`
SET SESSION character_set_results = 'binary'
use `zs`
select @@collation_database
SHOW TRIGGERS LIKE 't1'
SET SESSION character_set_results = 'utf8'
ROLLBACK TO SAVEPOINT sp
show table status like 'z1'
SET SQL_QUOTE_SHOW_CREATE=1
SET SESSION character_set_results = 'binary'
show create table `z1`
SET SESSION character_set_results = 'utf8'
show fields from `z1`
show fields from `z1`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `z1`
SET SESSION character_set_results = 'binary'
use `zs`
#查看zs数据库编码
select @@collation_database
SHOW TRIGGERS LIKE 'z1'
SET SESSION character_set_results = 'utf8'
ROLLBACK TO SAVEPOINT sp
#29.导出完一个数据库的表和触发器会释放检查点
RELEASE SAVEPOINT sp
#30.完成一个数据库所有表的备份之后,最后备份的数据库中的事件、函数、存储过程
show events
use `zs`
select @@collation_database
SET SESSION character_set_results = 'binary'
SHOW FUNCTION STATUS WHERE Db = 'zs'
SHOW PROCEDURE STATUS WHERE Db = 'zs'
SET SESSION character_set_results = 'utf8'
#31.开始导出python数据库,重复15~30步骤
python
SHOW CREATE DATABASE IF NOT EXISTS `python`
SAVEPOINT sp
show tables
show table status like 'Orders'
SET SQL_QUOTE_SHOW_CREATE=1
SET SESSION character_set_results = 'binary'
show create table `Orders`
SET SESSION character_set_results = 'utf8'
show fields from `Orders`
show fields from `Orders`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `Orders`
SET SESSION character_set_results = 'binary'
use `python`
select @@collation_database
SHOW TRIGGERS LIKE 'Orders'
SET SESSION character_set_results = 'utf8'
ROLLBACK TO SAVEPOINT sp
show table status like 't'
SET SQL_QUOTE_SHOW_CREATE=1
SET SESSION character_set_results = 'binary'
show create table `t`
SET SESSION character_set_results = 'utf8'
show fields from `t`
show fields from `t`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `t`
SET SESSION character_set_results = 'binary'
use `python`
select @@collation_database
SHOW TRIGGERS LIKE 't'
SET SESSION character_set_results = 'utf8'
ROLLBACK TO SAVEPOINT sp
show table status like 'y'
SET SQL_QUOTE_SHOW_CREATE=1
SET SESSION character_set_results = 'binary'
show create table `y`
SET SESSION character_set_results = 'utf8'
show fields from `y`
show fields from `y`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `y`
SET SESSION character_set_results = 'binary'
use `python`
select @@collation_database
SHOW TRIGGERS LIKE 'y'
SET SESSION character_set_results = 'utf8'
ROLLBACK TO SAVEPOINT sp
show table status like 'z'
SET SQL_QUOTE_SHOW_CREATE=1
SET SESSION character_set_results = 'binary'
show create table `z`
SET SESSION character_set_results = 'utf8'
show fields from `z`
show fields from `z`
SELECT /*!40001 SQL_NO_CACHE */ * FROM `z`
SET SESSION character_set_results = 'binary'
use `python`
select @@collation_database
SHOW TRIGGERS LIKE 'z'
SET SESSION character_set_results = 'utf8'
ROLLBACK TO SAVEPOINT sp
RELEASE SAVEPOINT sp
show events
use `python`
select @@collation_database
SET SESSION character_set_results = 'binary'
SHOW FUNCTION STATUS WHERE Db = 'python'
SHOW PROCEDURE STATUS WHERE Db = 'python'
SET SESSION character_set_results = 'utf8'
#32.备份结束,退出连接
quit
3.16 原理总结
通过以上的日志分析,可以总结下mysqldump备份的主要流程:
一开始设置SQL_MODE为空;
设置TIME_ZONE为+00:00;
查看是否开启了GTID;
执行FLUSH TABLES关闭实例中所有的表;
执行语句FLUSH TABLES WITH READ LOCK获取全局表的读锁,保证表一致性;
设置会话级别事务的隔离级别为REPEATABLE READ,保证事务期间数据的一致性;
执行语句START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */创建一个一致性事务快照;
获取当前状态下的binlog文件及位置信息(如有指定选项 --master-data);
执行UNLOCK TABLES释放全局表读锁;
开始备份第一个数据库数据,为事务创建一个检查点,备份完一张表之后,备份触发器,然后还原至检查点再接着备份下一张表,直至该数据库所有的表备份完成,释放检查点,备份第一个数据库事件、函数、存储过程,接着备份下一个数据库数据重复操作,直至所有数据库数据备份完成;
当备份完最后一个数据库数据后,退出并中止事务。
4.恢复
4.1 mysql命令恢复
mysql -uroot -p123456 < zs_python.sql
4.2 source命令恢复
#进入mysql使用source命令
source /backup/zs_python.sql
4.3 备份并用gzip压缩
mysqldump -uroot -p123456 -B zs python --single-transaction --master-data=2 --triggers -R -E > | gzip > outputfile.sql.gz
从gzip备份恢复:
gunzip < outputfile.sql.gz | mysql -uroot -p123456
4.4 备份并用bzip压缩
mysqldump -uroot -p123456 -B zs python --single-transaction --master-data=2 --triggers -R -E | bzip2 > outputfile.sql.bz2
从bzip2备份恢复:
bunzip2 < outputfile.sql.bz2 | mysql -uroot -p123456