mysql备份恢复常用
备份注意事项
基本原则
- 备份文件不要放在同一个主机上, 异地备份
- 备份文件需要校验hash并记录
- 需要偶尔去验证一下备份恢复流程是否可行
- 性能敏感性,避免在主库上备份, 去二级数据库上进行备份
- 注意binlog文件的连续性
- 对重点表进行单独表级别的备份
- lvm或存储层的快照备份不可靠
- 重要业务可以考虑一个延迟同步实例
恢复场景
- 全量恢复
- 单库恢复
- 单表或多表
- 单表内的部分行
- 某1条数据
恢复方式
- 使用物理备份文件全覆盖
- 从逻辑备份文件恢复到指定库
- 从备份文件 -> 新的恢复专用空库 -> 提取数据 -> 恢复到生产库
- 从 binlog 中提取 sql --> 编辑sql --> 恢复(insert/update)
恢复校验: 基础校验(大小, 行数) + 业务校验(金额, 时间, 状态等业务指标)
其它
备份时附加记录的元数据:
备份时间, 文件大小, 文件hash, 行数, 表数量, 备份使用的完整命令等
热备份: 读写不受影响 温备份: 类似于只读从库, 实时同步但仅可以执行读操作 冷备份: 离线备份
备份组合: 每周全量 + 每日增量 + 实时备份(同步binlog)
常用工具简介
mysqldump
优点: 自带工具, 一般够用
缺点: 因为是逻辑备份, 所以备份和恢复耗时都比较长
xtrabackup
物理备份, 备份和恢复速度快, 可以不影响数据库服务情况下进行热拷贝
mysqlpump
5.7+ 新增的官方备份工具,是 mysqldump 的一个衍生;
支持基于库和表的并行导出
mydumper
早期的并行dump工具
逻辑备份和物理备份
逻辑备份的特点是: 恢复时内容是需要被执行的, 本质是插入sql
优点: 跨版本迁移方便, 适合升级前备份, 支持编辑后恢复
物理备份的特点是: 拷贝的底层数据文件, 恢复时可以直接启动, 不需要再执行一遍sql;(增量的部分是重放redo)
优点: 速度快,缺点: 空间占用大, 不能跨版本和平台进行迁移。
增量备份的方式
非侵入型
- 刷新binlog后,备份增量的binlog文件
- xtrabackup 的增量备份
侵入型
- 纯插入场景, 记录下每次的 id 偏移量, 然后备份新增部分
- 表内如果有 update_time 字段, 备份时按时间筛选
- 准备一个备份状态表, 管理备份的阶段信息
- 触发器模式
- etl 模式
恢复
# 直接加载文件
mysql>source url\file.sql
# 非交互式恢复
mysql -uroot -p123 -h 192.x.x.x < /backup/alldb.sql在线恢复
禁止普通用户写, 只允许超级用户写(便于导入数据)
set read_only=on;
set super_read_only=off;加速恢复速度;
- 可以先关闭普通索引
alter table t_name disable keys -- 关闭普通索引
load data infile file.txt
alter table t_name enable keys -- 开启普通索引- 如果确定导入值不会冲突, 可以先关闭唯一索引检查; 仅适用于InnoDB, 必须在事务外使用;
set unique_checks=0 -- 关闭
set unique_checks=1 -- 开启- 针对 innodb 表, 如果导入数据是按主键顺序排列,可以提高导入效率
- 关闭自动提交,在导入完成后,再开启也会加快导入速度
- 关闭 binlog
- innodb_flush_log_at_trx_commit=0
基于 binlog 的恢复
导出mysql-bin.00000012二进制文件进行还原及时点
# 一般不这样搞, 除非场景特别简单
mysqlbinlog mysql-bin.00000012 > tmp.sql
mysql -uroot -p < tmp.sqlmysqldump
主要参数
-A --all-databases # 导出所有数据库
-B --databases # 指定数据库, 支持多库; 单库时可以省略
--tables # 指定表, 会覆盖 --databases or -B 选项
--ignore-table=db1.t1 # 忽略表, 指定多个
-F, --flush-logs
# 开始导出前刷新 binlog 日志, 方便后续的增量备份或添加从库
注意: 假如一次导出多个数据库(使用选项 --databases 或者 --all-databases),
将会逐个数据库刷新日志;
除使用 --lock-all-tables 或者 --master-data 外;
在这种情况下, 日志将会被刷新一次, 相应的所以表同时被锁定;
因此, 如果打算同时导出和刷新日志应该使用 --lock-all-tables 或者 --master-data 和 --flush-logs;
会执行 FLUSH TABLES, 等待关闭全部表
--extended-insert # 将多行数据合并成一个 insert 语句, 默认有开启
--skip-extended-insert # 关闭 sql 合并, 导出 sql 时, 将每行数据生成一个 insert 语句
-t, --no-create-info # 只有数据, 不包含创建表等创建动作, 即只有 insert
--master-data=[1,2]
--source-data[=#]
# 5.8+ 改名为 source-data
# 将 binlog 的位置和偏移量 追加到输出文件中;
# 1 输出 CHANGE MASTER 命令;
# 2 输出的 CHANGE MASTER 命令前有添加注释信息;
# 该选项将打开 --lock-all-tables 选项,
# 除非 --single-transaction 也被指定, 该选项自动关闭 --lock-tables 选项;
# 添加该选项时, 为了获取 show master status 信息, 会获取一次全局锁,
# 不应该高频率地使用此选项, 单库备份这种频率较低的可以使用
--dump-slave[=#]
--dump-replica[=#]
# 和 source-data 效果一样, 只是方便从库添加
--include-master-host-port
# 配合 --dump-slave 使用, 在文件内添加主节点的ip和端口, 方便直接添加从库
-w, --where=name # 只备份符合条件的, 一般用于增量备份
-d --no-data # 只导出表结构
-q --quick
# 强制 mysqldump 从服务器每次查询一行数据而不是查询整个表;
# 避免大表导出时查询刷爆内存且热点数据被刷出缓冲池, 通常建议总是启用该选项;
--single-transaction
# 在单个事务中执行动作; 保证一致性和解决 锁表的问题
# 当只使用此选项进行备份时, 不会产生表锁
# 适用于 InnoDB 存储引擎, 需要确保导出时无 DDL 操作
# 此选项会自动关闭 --lock-tables
-l, --lock-tables
# 写锁, 导出过程中依次锁住每个 schema 下所有表(只能保证各 schema 下表导出的一致性),
# 被锁的表只能读, MyISAM 存储引擎常用
--skip-lock-tables
-x, --lock-all-tables
# 提交请求锁定所有数据库中的所有表, 以保证数据的一致性;
# 这是一个全局读锁, 并且自动关闭 --single-transaction 和 --lock-tables 选项;
# 适合 MyISAM 存储引擎
--flush-privileges
# 有与 mysql 这个库相关的数据导出时, 最好是添加这个
# 在转储 mysql 数据库后, 发出一个 FLUSH PRIVILEGES 语句
--triggers # 转储触发器, 默认关闭
--skip-triggers
默认导出表中是带着触发器的, 不要触发器可以用 --skip-triggers
-n, --no-create-db
-Y, --all-tablespaces 导出全部表空间
-y, --no-tablespaces # Do not dump any tablespace information 不导出任何表空间信息
--add-drop-database
--add-drop-database Add a DROP DATABASE before each create.
--add-drop-table # 在每个 create 语句之前增加一个 drop table; 默认为 if drop
--skip-add-drop-table # 不添加 if drop; 直接就是 create
# data
--add-locks # 在 INSERT 语句前添加 lock
--allow-keywords # 允许使用关键字 做为列名
--ignore-error=name
--ignore-table=name
-E, --events # Dump events 事务; mysqldump 默认没有导出事务和存储过程
-R --routines # 转储存储过程(函数和过程)
--hex-blob
# 以十六进制格式转储二进制字符串(BINARY, VARBINARY, BLOB);
# 避免导出的二进制字符串乱码
--set-gtid-purged=OFF # 关闭 gtid 相关的事件转储
--net-buffer-length=
# TCP/IP和套接字通信的缓冲区大小
# 导出值不能比目标数据库的值大
--max-allowed-packet=
# 发送到服务器或从服务器接收的最大数据包长度
--tz-utc # 需要跨时区导入导出时, 需要添加
# 会自动转换 TIMESTAMP 字段内容为 utc0 时区的时间,
# 并设置在导出文件顶部设置时区 TIME_ZONE='+00:00'
# 只影响 TIMESTAMP 类型, DATETIME 等不受影响实例
单表
# 普通备份
# DROP TABLE IF EXISTS; CREATE TABLE; LOCK TABLES; INSERT INTO; UNLOCK TABLES;
mysqldump db t1 > t1.sql
# 备份表数据 - 只有数据不含创建表
# LOCK TABLES; INSERT INTO; UNLOCK TABLES;
mysqldump -t db t1 > t1.sql
# 备份表结构
# DROP TABLE IF EXISTS; CREATE TABLE;
mysqldump -d db1 t_1 > t_1.sql
# 多表
mysqldump db t1 t2 t3 > t_all.sql
# 排除部分表
mysqldump db1 --ignore-table=db1.test1 --ignore-table=db1.test2 > /data/bak/db1.sql
# 指定 where 条件导出表的部分数据
mysqldump -w "id=6032" t_1 > /tmp/where.sql单库
# 普通备份; 即多个 普通表 备份的组合
mysqldump db1 > db1-db.sql
# 仅导出单个 db 数据
mysqldump -u root -p db1 -t > /data/bak/db1.sql
# 单库备份 - 只备份表结构
mysqldump -d -B db1 > db1-db.sql多库
# 全量备份所有内容 - 常用
mysqldump -u root -p \
--all-databases --add-drop-table --routines --triggers --events \
> /path/to/full_backup_$(date +%Y%m%d).sql
# 导出所有 db 结构和数据
mysqldump -uroot -p -A > /data/bak/all.sql
# 导出所有 db 结构
mysqldump -uroot -p -A -d > /data/bak/all_struct.sql
# 仅导出所有 db 数据不导表结构
mysqldump -uroot -p -A -t > /data/bak/all_data.sql
# 导出多个指定 db
mysqldump --databases db1 db2 > /data/bak/muldbs.sql特殊场景
# 单库备份命令(推荐); 在单个事务中执行备份, 并且刷新 binlog
mysqldump -h 10.2.1.5 -u root -p -A \
--source-data=2 --single-transaction --flush-logs > back-2023-03-21.sql
mysqldump --master-data=2 --lock-all-tables --flush-logs --all-databases > /root/alldb.sql
# 普通备份, 不记录 gtid
mysqldump -u root -p -B doc \
--set-gtid-purged=OFF \
--single-transaction > db_doc-2023-02-09.sql
# 备份 -> 恢复 | 异机恢复
mysqldump -h host1 -u root -p -B db1 --tables t1 | mysql -h host2 -u user1 -p db2
# 备份-压缩-恢复 适合小数据量场景
mysqldump -h host1 -u user1 -p'pw' mydb | gzip > mydb.sql.gz
gunzip < mydb.sql.gz | mysql -h host2 -u user1 -p'pw' mydb
# 条件备份+过滤恢复+严格确认数据
mysqldump -u root -p -S /data/mysql_3306/mysql.sock \
--databases cmcc --tables t_name \
--where='VERIFY_TIME BETWEEN "2018-03-29 03:00:00" and "2018-03-29 03:59:59"' >> c1.sql
grep --ignore-case 'insert into `t_name`' c1.sql >> xxx.sql
sed -i '/t_name/s/t_name/t_name_0711/g' xxx.sql
/opt/app/mysql/bin/mysql -u root -p cmcc < xxx.sql
INSERT INTO t_name SELECT * FROM t_name_0711;脚本实例
脚本1
#!/bin/bash
# mysql_backup
# 0 3 * * * sh /bigdata/mysql_backup.sh >> /bigdata/mysql_backup.log 2>&1 &
# 完善的备份机制
# 1. 启动前检查实例是否具备可备份状态;
# 包括是否在线, 当前负载,磁盘空间是否足够,远程服务器是否能连接
# 2. 备份 -> 压缩 -> 异地同步
# 3. md5 检验, 避免以后文件传输过程中损坏
DB_USER="root"
DB_PASS="password"
DB_HOST="192.168.1.100"
BACK_BASE_DIR="/bigdata/mysql"
LOG_FILE=${BACK_BASE_DIR}/backup.log
DUMP="/usr/local/mysql/bin/mysqldump"
REMOTE_SERVER="10.2.1.5"
REMOTE_USER="user1"
REMOTE_DIR="/data/mysql_backup"
function log() {
echo "$(date "+%F %H:%M:%S") $@" >> $LOG_FILE
}
#===================================================================
# pre
# 获取当前日期 2024-02-03
DATE=`date +%F`
BACK_DIR=${BACK_BASE_DIR}/${DATE}
BACK_FILE=${BACK_DIR}/mysql_backup_${DATE}.sql
log "start backup"
mkdir -p $BCK_DIR/$DATE
#===================================================================
$DUMP -u$DB_USER -p$DB_PASS -h$DB_HOST --all-databases > ${BACK_FILE}
log "backup end, start compress"
#===================================================================
gzip ${BACK_FILE}
# 可选并行压缩
# pigz -9 -p 24 ${BACK_FILE}
log "backup task compress end"
#==========================================================
# CHECK FILE MD5SUM
log "pre check file md5sum"
md5sum ${BACK_FILE}.gz >> $LOG_FILE
log "check file md5sum end"
#==========================================================
# old file clear
yestoday=$(date -d '-7 day' +%Y-%m-%d) # 取 7 天前的时间
log "delete old backup file"
log "del ${BACK_BASE_DIR}/${yestoday}"
rm -rf ${BACK_BASE_DIR}/${yestoday}
log "del old backup file end"
# 只保留最近一周的备份
# find ${BACK_BASE_DIR} -mtime +2 -exec rm -rf {} \;
#==========================================================
log "start sync backup file to remote server"
scp -r ${BACK_DIR} ${REMOTE_USER}@${REMOTE_SERVER}:${REMOTE_DIR}
log "all task end"
#==========================================================脚本2
#!/bin/sh
# 1. 先停止复制 - 保障一致性
# 2. 备份完成后再开启同步
mkdir -p /server/backup/
mysql -u$USER -p$PASS -S $SOCK -e "stop slave SQL_THREAD;"
# 实际上还需要排除系统库 mysql|information_schema|performance_schema
DB_LIST=$(mysql -u$USER -p$PASS -S $SOCK -e "show databases"|sed '1,2d'|/bin/egrep -v "${EXCLUDE[*]}")
for dbname in ${DB_LIST}
do
TABLE_LIST=$(mysql -u$USER -p$PASS -S $SOCK -e "show tables from $dbname;"|sed '1d')
for tablename in ${TABLE_LIST}
do
mkdir -p /server/backup/$DATE/$dbname
mysqldump --lock-tables=0 -u$USER -p$PASS -S $SOCK ${dbname} $tablename |gzip >/server/backup/$DATE/${dbname}/${dbname}_${tablename}_$DATE.sql.gz
done
done
mysql -u$USER -p$PASS -S $SOCK -e "start slave SQL_THREAD;"关于备份时的锁
避免只使用 --master-data=2 选项, 此选项会获取全局锁, 大量表频繁获取时, 容易阻塞业务。
最好是始终使用 --single-transaction 参数, 避免一直锁定。
--lock-all-tables 或 --lock-tables 参数, 会加锁;
加 --master-data=2 或 --flush-logs 参数时, 会执行:
FLUSH TABLES;
FLUSH TABLES WITH READ LOCK;
不加锁, 但是会导致备份时间延长, 或无法备份完成
FLUSH TABLES
FLUSH TABLES 关闭所有打开的表, 强制关闭所有正在使用的表, 并刷新查询缓存和预准备语句缓存, 不会刷新脏块, 会被锁阻塞, 会等待所有正在运行的 SQL 执行结束
如果当前有正在运行的慢 SQL, 执行 FLUSH TABLES; 就会被阻塞, 需要等待 SQL 执行结束
FLUSH TABLES WITH READ LOCK 关闭所有打开的表并使用全局读锁锁定所有数据库的所有表, 不会刷新脏块,会被锁阻塞 如果存在锁, FLUSH 会直接返回错误
OUTFILE
OUTFILE 文本备份
理解为导出 csv
SELECT ... INTO OUTFILE
--- 查询输出到一个文件
select * from my_t1 into outfile "d:/my_t1.txt";
--- 指定分隔符
select id from test where id > 0
into outfile 'c:\\test'
FIELDS TERMINATED by ',' ENCLOSED by "" LINES TERMINATED by '\n';OUTFILE控制格式
-- 控制格式
-- TERMINATED 生成的数据分隔符, 默认是制表符
-- ENCLOSED 包裹
-- ESCAPED 转义字符
-- FIELDS 子句的缺省值是,
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
-- LINES 控制行格式, 子句的缺省值是
LINES TERMINATED BY '\n'load data 文本导入
load data [low_priority] [local] infile 'file_name.txt' [replace | ignore] into table t_name [控制格式]
-- local 在客户端查找文件, 未添加时在服务器查找文件
-- replace 和 ignore 关键词控制对现有的唯一键记录的重复的处理
load data infile "d:/home_my_email" into table wait.my_email;
load data infile "d:/home_my_email" into table wait.my_email(name); -- 指定字段
load data local infile "F:/account_data/971.txt" into table t_name;
-- 指定使用,号 和 换行做分隔符;
load data infile '/home/data.txt' into table t_name fields terminated by ',' lines terminated by '\n';
-- 实例
mysql -uroot -p$pw -Dcmcc \
-e "load data local infile '/home/mysql/data/t1.txt' into table t_name fields terminated by ','";恢复错误处理
ERROR at line 3130: Unknown command '\''.
# 字符集问题,使用 --default-character-set=utf8mb4 参数指定字符集mysqlpump简介
并行导出的架构为: 队列(库) + 线程(表)
并行度最细细为表级别
特性:
- 属于逻辑备份
- 并行备份 数据库和数据库中的对象的, 加快备份过程
- 更好的控制数据库和数据库对象(表, 存储过程, 用户帐户)的备份
- 备份用户账号作为帐户管理语句(CREATE USER, GRANT), 而不是直接插入到 MySQL 的系统数据库
- 备份出来直接生成压缩后的备份文件
- 备份进度指示(估计值)
- 重新加载(还原)备份文件, 先建表后插入数据最后建立索引, 减少了索引维护开销, 加快了还原速度
- 备份可以排除或则指定数据库
示例
# mysqlpump 压缩备份 + 三个并发线程备份
mysqlpump -u user1 -p -h 192.168.1.20 --single-transaction \
--default-character-set=utf8mb4 --compress-output=LZ4 \
--default-parallelism=3 -B db1 > /home/user1/db1.sql.lz4核心参数
绝大部分参数和 mysqldump 一致
差异部分
--add-drop-user
在 CREATE USER 语句之前增加 DROP USER,
注意: 这个参数需要和 --users 一起使用, 否者不生效
DROP USER 'backup'@'192.168.123.%';
--default-parallelism
指定并行线程数, 默认是 2, 如果设置成 0, 表示不使用并行备份;
注意: 每个线程的备份步骤是:
先 create table 但不建立二级索引(主键会在 create table 时候建立),
再写入数据, 最后建立二级索引;
--defer-table-indexes
延迟创建索引, 直到所有数据都加载完之后, 再创建索引, 默认开启;
若关闭则会和 mysqldump 一样:
先创建一个表和所有索引, 再导入数据,
因为在加载还原数据的时候要维护二级索引的开销, 导致效率比较低;
关闭使用参数 --skip--defer-table-indexes
--parallel-schemas=[N:]db_list
指定并行备份的库, 多个库用逗号分隔,
如果指定了 N, 将使用 N 个线程的地队列,
如果 N 不指定, 将由 --default-parallelism 才确认 N 的值, 可以设置多个 --parallel-schemas
mysqlpump --parallel-schemas=4:vs,aa --parallel-schemas=3:pt
# 4 个线程备份 vs 和 aa, 3 个线程备份 pt; 通过 show processlist 可以看到有 7 个线程
mysqlpump --parallel-schemas=vs,abc --parallel-schemas=pt
# 默认 2 个线程, 即 2 个线程备份 vs 和 abc, 2 个线程备份 pt
注意: 当然硬盘 IO 不允许的话, 可以少开几个线程和数据库进行并行备份
--compress-output
默认不压缩输出, 目前可以使用的压缩算法有 LZ4 和 ZLIB
shell> mysqlpump --compress-output=LZ4 > dump.lz4
shell> lz4_decompress dump.lz4 dump.txt
shell> mysqlpump --compress-output=ZLIB > dump.zlib
shell> zlib_decompress dump.zlib dump.txt
--exclude-databases
备份排除该参数指定的数据库, 多个用逗号分隔
类似的还有:
--exclude-events
--exclude-routines
--exclude-tables
--exclude-triggers
--exclude-users
mysqlpump --exclude-databases=mysql,sys # 备份过滤 mysql 和 sys 数据库
mysqlpump --exclude-tables=rr,tt # 备份过滤所有数据库中 rr, tt 表
mysqlpump -B test --exclude-tables=tmp_ifulltext,tt # 备份过滤 test 库中的 rr, tt 表
注意: 要是只备份数据库的账号, 需要添加参数 --users, 并且需要过滤掉所有的数据库, 如:
mysqlpump --users --exclude-databases=sys,mysql,db1,db2 --exclude-users=dba,backup
# 备份除 dba 和 backup 的所有账号
--include-databases
指定备份数据库, 多个用逗号分隔, 类似的还有
--include-events
--include-routines
--include-tables
--include-triggers
--include-users, 大致方法使用同 --exclude-users
--skip-definer
忽略那些创建视图和存储过程用到的 DEFINER 和 SQL SECURITY 语句,
恢复的时候, 会使用默认值, 否则会在还原的时候看到没有 DEFINER 定义时的账号而报错
--skip-dump-rows
只备份表结构, 不备份数据, -d
注意: mysqldump 支持 --no-data, mysqlpump 不支持 --no-data
--users
备份数据库用户, 备份的形式是 CREATE USER..., GRANT...,
只备份数据库账号可以通过如下命令:
mysqlpump --exclude-databases=% --users # 过滤掉所有数据库
--watch-progress # 显示进度, 包括总数表, 行和其他对象;
--skip-watch-progress # 关闭进度显示
--add-drop-database # 在建立库之前先执行删库操作
--add-drop-table # 在建表之前先执行删表操作
--add-locks
备份表时, 使用 LOCK TABLES 和 UNLOCK TABLES
注意: 这个参数不支持并行备份, 需要关闭并行备份功能 --default-parallelism=0
--complete-insert # dump 出包含所有列的完整 insert 语句
--compress # 压缩客户端和服务器传输的所有的数据, -C
--default-character-set # 指定备份的字符集
--events # 备份数据库的事件, 默认开启, 关闭使用 --skip-events 参数
--insert-ignore
备份用 insert ignore 语句代替 insert 语句
--log-error-file
# 备份出现的 warnings 和 erros 信息输出到一个指定的文件
--max-allowed-packet
# 备份时用于 client/server 直接通信的最大 buffer 包的大小
--net-buffer-length
备份时用于 client/server 通信的初始 buffer 大小,
当创建多行插入语句的时候, mysqlpump 创建行到 N 个字节长
--no-create-db
备份不写 CREATE DATABASE 语句;
要是备份多个库, 需要使用参数 -B, 而使用 -B 的时候会出现 create database 语句,
该参数可以屏蔽 create database 语句
--no-create-info
备份不写建表语句, 即不备份表结构, 只备份数据, -t
--hex-blob
备份 binary 字段的时候使用十六进制计数法,
受影响的字段类型有 BINARY, VARBINARY, BLOB, BIT
--protocol={TCP|SOCKET|PIPE|MEMORY} # 指定连接服务器的协议
--replace # 备份出来 replace into 语句
--routines
备份出来包含存储过程和函数, 默认开启, 需要对 mysql.proc 表有查看权限;
生成的文件中会包含 CREATE PROCEDURE 和 CREATE FUNCTION 语句以用于恢复,
关闭则需要用 --skip-routines 参数
--triggers
备份出来包含触发器, 默认开启, 使用 --skip-triggers 来关闭
--set-charset
备份文件里写 SET NAMES default_character_set 到输出, 此参默认开启;
--skip-set-charset 禁用此参数, 不会在备份文件里面写出 set names...
--single-transaction
该参数在事务隔离级别设置成 Repeatable Read,
并在 dump 之前发送 start transaction 语句给服务端;
这在使用 innodb 时很有用, 因为在发出 start transaction 时, 保证了在不阻塞任何应用下的一致性状态;
对 myisam 和 memory 等非事务表, 还是会改变状态的,
当使用此参的时候要确保没有其他连接在使用
ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE 等语句,
否则会出现不正确的内容或则失败;
--add-locks 和此参互斥,
在 mysql5.7.11 之前, --default-parallelism 大于 1 的时候和此参也互斥,
必须使用 --default-parallelism=0;
5.7.11 之后解决了 --single-transaction 和 --default-parallelism 的互斥问题
--tz-utc
备份时会在备份文件的最前几行添加 SET TIME_ZONE='+00:00'
注意: 如果还原的服务器不在同一个时区并且还原表中的列有 timestamp 字段, 会导致还原出来的结果不一致;
默认开启该参数, 用 --skip-tz-utc 来关闭参数