【备份和恢复】mysqldump
mysqldump是一款MySQL自带的逻辑备份工具。
数据量级100G,大约 30 - 45 min可以进行备份完成。
注意:使用逻辑备份进行数据恢复时,会先删除原先的库表,重建新表后再逻辑插入
1、备份核心参数
mkdir -p /backup/mysql
mysqldump -uathos -p123qwe -h 192.168.0.11 -R -E --triggers --master-data=2 --single-transaction -A > /backup/mysql/mysqldump.sql
【连接参数】
-u # 指定连接MySQL服务端的用户名
-p # 指定连接MySQL服务端的用户名所对应的密码
-h # 指定连接MySQL服务端的主机地址
-P # 指定连接MySQL服务端的端口
-S # 指定连接MySQL服务端的本地套接字文件
【备份参数】
-A # 备份所有库
-B 库1 [库2 库3 ...] # 备份1个或多个库(加-B 会在备份文件中写入建库语句)
库1 # 备份单库(不加-B,备份文件中不会写入建库语句,等同表级别备份)
库1 表1 [表2 表3 ...] # 备份某个库下的1张表或多张表
-R # 备份存储过程和函数
-E # 备份事件
--triggers # 备份触发器
-F # 每备份一个库,刷新一个binlog【缺点:生成大量的binlog,生产环境很少用】
--no-data # 只备份表结构
【高级参数】
--master-data:
功能1:在备份时自动记录备份开始时刻binlog的file和position。该参数有三个值可选:
- 0 # 默认值,什么都不记录
- 1 # 会将"CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=753"写入到备份文件中
- 2 # 会将"-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=753;" 以注释格式写入到备份文件中。
功能2:自动加全局锁表(FTWRL),在数据备份完成之后,自动释放锁
功能3:但是搭配参数--single-transaction,对于InnoDB,则不会锁表而进行热备
--single-transaction:
功能:此参数只针对InnoDB的表有效,会创建一致性快照(MVCC)进行备份。
--set-gtid-purged:
该参数决定是否要在备份文件中加入GTID信息:SET @@GLOBAL.GTID_PURGED=...; 表示该备份中已有数据
- auto # 默认值,等同开启
- on # 在备份文件中加入此GTID信息
- off # 不在备份文件中加入此GTID信息
情况1:仅用于本机备份数据,可加可不加
情况2:使用备份数据构建主从、恢复到其他机器,必须开启。会在备份中加入信息 Set gtid_next....,确保在主从复制环境中的数据一致性,
这样从库恢复数据后,就知道本地的binlog中有GTID信息。利用GTID的幂等性,从库知道从下一个号开始请求复制。
--max_allowed_packet:
- 128M # 从服务器导出数据时,数据包的大小超过了这个预设阈值,就会报错,建议设置为128M。
2、恢复数据
# 1、恢复数据时的SQL语句,不再记录到binlog
set sql_log_bin=0;
# 2、恢复数据
mysql -uroot -p密码 库名 < /backup/bak.sql
或者
mysql> source /backup/bak.sql;
# 3、开启binlog
set sql_log_bin=1;
3、扩展
可以从mysqldump的数据全备中,截取我们所需的数据:
从mysqldump全备中截取单库的备份
sed -n '/^-- Current Database: `库名`/,/^-- Current Database: `/p' 全备文件.sql > xxx.sql
从mysqldump全备中截取所有insert语句
grep -i 'INSERT INTO `表名`' 全备文件.sql > xxx.sql &
从mysqldump全备中获取某表结构
sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `表名`/!d;q' 全备文件.sql > xxx.sql
拼接语句:备份每个库下的每张表的数据
# mysqldump逻辑备份单库单表的命令
mysqldump -uathos -p123qwe -h 192.168.0.11 -R -E --triggers --master-data=2 --single-transaction -A > /backup/mysql/mysqldump.sql
# 准备备份目录
mkdir -p /backup/mysql
chown -R mysql.mysql /backup/mysql/
# 修改配置文件
[mysqld]
secure-file-priv=/backup/mysql
# 使用拼接语句,为每个库下的每张表生成对应的单独备份命令
SELECT CONCAT(
"mysqldump -uathos -p123qwe -h 192.168.0.11 --master-data=2 --single-transaction -R -E --triggers ",
table_schema, " ", table_name,
" > /backup/mysql/", table_schema, "_", table_name, ".sql"
) AS backup_command
FROM information_schema.tables
WHERE table_schema NOT IN ('sys', 'information_schema', 'performance_schema')
into outfile '/backup/mysql/back_db_table.sh';
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,完整转载请注明来自 athos.lau