点击上方 SRE运维派,?关注我?,选择 设为星标
优质文章,及时送达
1 MySQL 备份和恢复
1.2 mysqldump 备份工具
1.2.1 mysqldump 说明
常用的逻辑备份工具包括 mysqldump,mysqldumper,phpMyAdmin 等。
mysqldump 是 MySQL 官方提供的客户端备份工具,通过 mysql 协议连接至 mysql 服务器进行备份,mysqldump 命令是将数据库中的数据备份成一个文本文件,数据表的结构和数据都存储在生成的文本文件中。
mysqldump [OPTIONS] database [tables]
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
mysqldump [OPTIONS] --all-databases [OPTIONS]
#常用选项
-u|--user=val #指定用户名
-P|--port=N #指定端口,默认3306
-p|--password[=val] #指定密码
-A|--all-databases #备份所有数据库(创建数据库语句)
-Y|--all-tablespaces #备份所有表空间(建表语句)
-y|--no-tablespaces #不备份表空间
-a|--create-options #在create table语句中保留所有mysql特性选项,默认项,可用 --skip-create-options 去掉
-B|--databases db1 db2 #导出指定数据库
-E|--events #导出事件
-R|--routines #导出存储过程以及自定义函数
-c|--complete-insert #导出完整的insert语句,包含列名和值,但可能会受到max_allowed_packet参数影响而导致插入失败
-e|--extended-insert #导出多个VALUES列的INSERT语法,默认项,可使用 --skipextended-insert 关闭
-C|--compress #在客户端和服务端启用压缩传输数据
-d|--no-data #只备份表结构,不备份数据,即只备份create table
-t|--no-create-info #只备份数据,不备份表结构
-n|--no-create-db #不备份create database,可被-A或-B覆盖
-f|--force #忽略错误
-S|--socket=val #指定socket文件地址
-F|--flush-logs #开始导出之前刷新日志,如果使用了 --databases|--all-databases 导出多个库,会逐个刷新
#如果使用了--lock-all-tables|--master-data,日志将会被刷新一次且会锁表
--triggers #导出触发器,默认项,可用 --skip-triggers 关闭
--default-character-set=val #设置默认字符集,默认utf8
--delete-source-logs #备份前刷新二进制日志,相当于执行 flush logs,备份后重置,相当于purge logs
#需要配合 --source-data 选项一起使用
--delete-master-logs #备份后删除日志,需要配合 --master-data 选项一起使用
--master-data=N #此配置在新版中被废弃,使用 --source-data 选项代替
--source-data=N #将binlog的pos位置和文件名追加到输出文件中,取值为1|2
#1会保留 CHANGE MASTER TO 语句,适合于集群使用
#2也会有 CHANGE MASTER TO 语句,但会被注释,适合于单机使用
#该选项将打开--lock-all-tables 选项,除非--singletransaction也被指定
--default-character-set=val #设置默认字符集,默认值为utf8
--add-drop-database #每个数据库创建语句之前添加 drop database 语句
--add-drop-table #每个数据表创建语句之前添加 drop table 语句
--add-drop-trigger #每个触发器创建语句之前添加 drop trigger 语句
--add-locks #在每个表导出之前lock table,导出后unlock table,默认项,可使用 --skip-add-locks 去掉
--compatible=val #让备份数据兼容其它相间库类型,可选值包括
#ansi|mysql323|mysql40|postgresql|oracle|mssql|db2|maxdb|
#no_key_options|no_tables_options|no_field_options
#多个值用逗号分隔,此处并不能保证全完兼容,是尽最大可能保证兼容
--flush-privileges #在导出mysql数据库之后,执行 FLUSH PRIVILEGES
#用于导出mysql数据库和依赖mysql数据库数据的任何时候
--character-sets-dir=dir #指定字符集文件目录
--comments #导出备份文件中是否包含注释信息,默认项,可用--skip-comments关闭
--compact #导出更少的信息,一般用于调试,比如说不导出注释信息等,配合下列选项一起
#--skip-add-drop-table|--skip-add-locks|--skip-comments|--skip-disable-keys
--protocol=val #指定客户端连接协议tcp|socket|pipe|memory
--hex-blob #使用十六进制格式导出二进制字段,影响到的字段类型有BINARY,VARBINARY,BLOB
MyISAM 引擎相关选项
MyISAM 不支持事务,只能支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作
-x|--lock-all-tables
#--single-transactio|--lock-tables 选项会关闭此选项功能
-l|--lock-tables #对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认项
#可用 --skip-lock-tables关闭,对备份MyISAM的多个库,可能会造成数据不一致
#以上选项对InnoDB表一样生效,实现温备,但不推荐使用
InnoDB 引擎相关选项
InnoDB 存储引擎支持事务,可以利用事务的相应的隔离级别,实现热备,也可以实现温备但不建议用
--single-transaction
#此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启事务
#此选项通过在单个事务中转储所有表来创建一致的快照。 仅适用于存储在支持多版本控制的存储引擎中的表
(目前只有InnoDB),转储不保证与其他存储引擎保持一致。 在进行单事务转储时,要确保有效的转储文件
(正确的表内容和二进制日志位置),没有其他连接应该使用以下语句: ALTER TABLE, DROP TABLE,
RENAME TABLE, TRUNCATE TABLE。此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互
排斥,备份大型表时,建议将 --single-transaction 选项和 --quick 结合一起使用
1.2.2 mysqldump 备份策略
InnoDB建议备份策略
mysqldump -uroot -p123456 -A -F -E -R --triggers --single-transaction --master-data=2 --flush-privileges --default-character-set=utf8 --hex-blob > ${BACKUP}/fullbak_${BACKUP_TIME}.sql
#新版8.0.26以上
mysqldump -uroot -p123456 -A -F -E -R --triggers --single-transaction --source-data=2 --flush-privileges --default-character-set=utf8 --hex-blob > ${BACKUP}/fullbak_${BACKUP_TIME}.sql
#选项说明
-uroot #MySQL用户名
-p123456 #MySQL密码
-A #备份所有数据库
-F #刷新日志
-E #导出事件
-R #导出存储过程以及自定义函数
--triggers #导出触发器
--single-transaction #以开启事务的方式备份数据
--master-data=2 #备份日志信息
--source-data=2 #备份日志信息
--flush-privileges #导出后刷新权限
--default-character-set=utf8 #设置字符集
--hex-blob #使用十六进制转储二进制
mysqldump -uroot -p123456 -A -F -E -R -x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > ${BACKUP}/fullbak_${BACKUP_TIME}.sql
#选项说明
-uroot #MySQL用户名
-p123456 #MySQL密码
-A #备份所有数据库
-F #刷新日志
-E #导出事件
-R #导出存储过程以及自定义函数
-x #加全局读锁,备份完会自动解锁
--triggers #导出触发器
--master-data=2 #备份日志信息
--flush-privileges #导出后刷新权限
--default-character-set=utf8 #设置字符集
--hex-blob #使用十六进制转储二进制
1.2.3 mysqldump 备份和还原实现
1.2.3.1 备份指定数据库中的数据
此种备份方式并不会备份数据库结构,只备份表和数据
mysqldump [OPTIONS] database [tables]
#只备份 testdb 数据库
[root@rocky86 ~]# mysqldump -uuser1 -p123456 testdb > /data/testdb-bak.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#查看文件,此文件中并没有创建数据库的语句,还原时要指定数据库
[root@rocky86 ~]# ll /data/testdb-bak.sql -h
-rw-r--r-- 1 root root 8.0M Jan 2 20:45 /data/testdb-bak.sql
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| student |
| t1 |
| testlog |
+------------------+
3 rows in set (0.00 sec)
#删除数据库
mysql> drop table t1;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table testlog;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)
#测试还原,还原的时候要指定数据库,如果数据库不存在,要在还原前手动创建
[root@rocky86 ~]# mysql -uuser1 -p123456 testdb < /data/testdb-bak.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
#再次查看
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| student |
| t1 |
| testlog |
+------------------+
3 rows in set (0.00 sec)
#创建数据库,可以和原来的数据库不同名
[root@rocky86 ~]# mysql -uuser1 -p123456 -e "create database testdb2"
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rocky86 ~]# mysql -uuser1 -p123456 testdb2 < /data/testdb-bak.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
#查看
mysql> use testdb2;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_testdb2 |
+-------------------+
| student |
| t1 |
| testlog |
+-------------------+
3 rows in set (0.00 sec)
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
#--databases 可以写成 -B
[root ~]# mysqldump -uuser1 -p123456 -B testdb2 > /data/testdb2-bak.sql
#备份文件对比
[root ~]# ll /data/
total 16288
-rw-r--r-- 1 root root 8337982 Jan 2 21:31 testdb2-bak.sql #文件较大
-rw-r--r-- 1 root root 8337770 Jan 2 21:10 testdb-bak.sql
#此文件中有创建数据库的语句
[root ~]# cat /data/testdb2-bak.sql | grep -i "create database"
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb2` /*!40100 DEFAULT CHARACTER
SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
[root ~]# cat /data/testdb-bak.sql | grep -i "create database"
#测试还原
mysql> drop database testdb2;
Query OK, 3 rows affected (0.02 sec)
mysql> show databases like "%testdb%";
+---------------------+
| Database (%testdb%) |
+---------------------+
| testdb |
+---------------------+
1 row in set (0.00 sec)
#导入
[root ~]# mysql -uuser1 -p123456 < /data/testdb2-bak.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
#再次查看
mysql> show databases like "%testdb%";
+---------------------+
| Database (%testdb%) |
+---------------------+
| testdb |
| testdb2 |
+---------------------+
2 rows in set (0.00 sec)
mysql> show tables from testdb2;
+-------------------+
| Tables_in_testdb2 |
+-------------------+
| student |
| t1 |
| testlog |
+-------------------+
3 rows in set (0.00 sec)
1.2.3.3 备份所有数据库
备份所有数据库是指备份有物理数据的数据库,并不包括从内存中映射的数据库(information_schema,performance_schema,sys)
mysqldump [OPTIONS] --all-databases [OPTIONS]
#--all-databases 可以写成 -A
[root ~]# mysqldump -uuser1 -p123456 -A > /data/all-bak.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#查看文件大小
[root ~]# ll /data/all* -h
-rw-r--r-- 1 root root 23M Jan 2 21:46 /data/all-bak.sql
#备份时可以开启压缩,减小文件体积
[root ~]# mysqldump -uuser1 -p123456 -A |gzip > /data/all-bak.sql.gz
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#再次查看
[root ~]# ll /data/all* -h
-rw-r--r-- 1 root root 23M Jan 2 21:46 /data/all-bak.sql
-rw-r--r-- 1 root root 6.9M Jan 2 21:55 /data/all-bak.sql.gz
#现有数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| discuz |
| eshop |
| information_schema |
| mysql |
| performance_schema |
| shopxo |
| sys |
| testdb |
| testdb2 |
| wordpress |
+--------------------+
10 rows in set (0.00 sec)
#查看具体备份了哪些数据库
[root ~]# cat /data/all-bak.sql | grep -i "^create database"
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET
utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `discuz` /*!40100 DEFAULT CHARACTER SET
utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `eshop` /*!40100 DEFAULT CHARACTER SET
utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `shopxo` /*!40100 DEFAULT CHARACTER SET
utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb` /*!40100 DEFAULT CHARACTER SET
utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb2` /*!40100 DEFAULT CHARACTER
SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `wordpress` /*!40100 DEFAULT CHARACTER
SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
#information_schema,performance_schema,sys 这三个数据库没有备份
1.2.3.4 在配置中指定用户名和密码
修改配置文件,不用每次输入用户名和密码
[root@rocky86 ~]# vim /etc/my.cnf
#仅指定 mysql 客户端
[mysql]
user=user1
password=123456
#仅指定 mysqladmin 客户端
[mysqladmin]
user=user1
password=123456
#仅指定 mysqldump 客户端
[mysqldump]
user=user1
password=123456
#所有客户端
[client]
user=user1
password=123456
生产环境中,我们一般以项目或分数据库的方式来备份,而不会把整个 MySQL 中的所有库备份到一个文件,除非这个库的数据量很少。
如果我们使用了全部备份,而又只需要恢复一个数据库或一个表时,则应该先将备份数据还原到一个中间数据库,再从该库备份出想要的数据,然后再进行还原操作。
[root@rocky86 0104]# vim backup.sh
#
#*********************************************************
#Author: jose
#QQ: 123456
#Date: 2025-01-04
#FileName: backup.sh
#URL: https://www.josdu.com
#Description: The test script
#Copyright: 2024 All rights reserved
#********************************************************
UNAME=user1
PWD=123456
IGNORE='Database|information_schema|performance_schema|sys'
YMD=`date +%F`
DBLIST=`mysql -u${UNAME} -p${PWD} -e "show databases;" 2>/dev/null | grep -Ewv "$IGNORE"`
for db in ${DBLIST};do
mysqldump -u${UNAME} -p${PWD} -B $db 2>/dev/null 1 >/backup/${db}_${YMD}.sql
echo "${db}_${YMD} backup success"
done
#测试
[root@rocky86 0104]# chmod a+x backup.sh
[root@rocky86 0104]# ./backup.sh
discuz_2025-01-04 backup success
eshop_2025-01-04 backup success
mysql_2025-01-04 backup success
shopxo_2025-01-04 backup success
testdb_2025-01-04 backup success
testdb2_2025-01-04 backup success
wordpress_2025-01-04 backup success
[root@rocky86 0104]# ll -h /backup/
total 23M
-rw-r--r-- 1 root root 2.2M Jan 4 11:04 discuz_2025-01-04.sql
-rw-r--r-- 1 root root 1.6K Jan 4 11:04 eshop_2025-01-04.sql
-rw-r--r-- 1 root root 1.4M Jan 4 11:04 mysql_2025-01-04.sql
-rw-r--r-- 1 root root 2.1M Jan 4 11:04 shopxo_2025-01-04.sql
-rw-r--r-- 1 root root 8.0M Jan 4 11:04 testdb_2025-01-04.sql
-rw-r--r-- 1 root root 8.0M Jan 4 11:04 testdb2_2025-01-04.sql
-rw-r--r-- 1 root root 1.1M Jan 4 11:04 wordpress_2025-01-04.sql
mysql> show databases like '%test%';
+-------------------+
| Database (%test%) |
+-------------------+
| testdb |
| testdb2 |
+-------------------+
2 rows in set (0.00 sec)
#删除数据库
mysql> drop database testdb;
Query OK, 3 rows affected (0.01 sec)
mysql> drop database testdb2;
Query OK, 3 rows affected (0.01 sec)
mysql> show databases like '%test%';
Empty set (0.00 sec)
#还原测试
[root@rocky86 0104]# mysql -uuser1 -p123456 < /backup/testdb_2023-01-04.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@rocky86 0104]# mysql -uuser1 -p123456 < /backup/testdb2_2023-01-04.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
#查看
mysql> show databases like '%test%';
+-------------------+
| Database (%test%) |
+-------------------+
| testdb |
| testdb2 |
+-------------------+
2 rows in set (0.00 sec)
mysql> show tables from testdb;
+------------------+
| Tables_in_testdb |
+------------------+
| student |
| t1 |
| testlog |
+------------------+
3 rows in set (0.00 sec)
mysql> show tables from testdb2;
+-------------------+
| Tables_in_testdb2 |
+-------------------+
| student |
| t1 |
| testlog |
+-------------------+
3 rows in set (0.00 sec)
[root@rocky86 0104]# vim backupv2.sh
#!/bin/bash
#
#*********************************************************
#Author: jose
#QQ: 123456
#Date: 2025-01-04
#FileName: backup.sh
#URL: https://www.josedu.com
#Description: The test script
#Copyright: 2024 All rights reserved
#********************************************************
UNAME=user1
PWD=123456
IGNORE='Database|information_schema|performance_schema|sys'
YMD=`date +%F`
DIR=/backup/${YMD}
if [ ! -d ${DIR} ];then
mkdir -p ${DIR}
fi
DBLIST=`mysql -u${UNAME} -p${PWD} -e "show databases;" 2>/dev/null | grep -Ewv "$IGNORE"`
for db in ${DBLIST};do
mysqldump -u${UNAME} -p${PWD} -B $db 2>/dev/null | gzip >${DIR}/${db}_${YMD}.sql.gz
echo "${db}_${YMD} backup success"
done
#加定时任务
[root@rocky86 0104]# crontab -e
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
15 0 * * * /root/0104/backupv2.sh
1.2.3.6 保存二进制日志位置信息
在备份日志中记录备份时的二进制日志信息,后续通过此备份进行恢复,还是会缺少一部份数据,这一部份数据,则可以通过当前的二进制日志与备份文件中的二进制信息进行对比得到。
[root 0104]# mysqldump -uuser1 -p123456 -B testdb > /data/testdbbak1.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#--source-data 选项值默认是1
[root 0104]# mysqldump -uuser1 -p123456 --source-data -B testdb > /data/testdb-bak2.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root 0104]# mysqldump -uuser1 -p123456 --source-data=1 -B testdb > /data/testdb-bak3.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root 0104]# mysqldump -uuser1 -p123456 --source-data=2 -B testdb > /data/testdb-bak4.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#默认无二进制日志位置信息
[root 0104]# cat /data/testdb-bak1.sql | grep "CHANGE MASTER"
#保存了二进制POS位置信息
[root 0104]# cat /data/testdb-bak2.sql | grep "CHANGE MASTER"
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000008', MASTER_LOG_POS=16682818;
#保存了二进制POS位置信息
[root 0104]# cat /data/testdb-bak3.sql | grep "CHANGE MASTER"
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000008', MASTER_LOG_POS=16682818;
#保存了二进制POS位置信息,但是被注释
[root 0104]# cat /data/testdb-bak4.sql | grep "CHANGE MASTER"
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000008', MASTER_LOG_POS=16682818;
mysql> show master logs;
+---------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 | 180 | No |
| binlog.000002 | 180 | No |
| binlog.000003 | 180 | No |
| binlog.000004 | 201 | No |
| binlog.000005 | 180 | No |
| binlog.000006 | 25025939 | No |
| binlog.000007 | 16684542 | No |
| binlog.000008 | 16682818 | No |
+---------------+-----------+-----------+
8 rows in set (0.00 sec)
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000008 | 16682818 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
范例:利用备份中记录的二进制 POS 信息选择性恢复
场景:
上午9点执行了完全备份
上午10点误操作删除了数据库中的某张表
上午11点发现该表被误删除,现要求恢复数据
#查看当前数据库情况
mysql> use testdb;
Database changed
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| student |
| t1 |
+------------------+
2 rows in set (0.00 sec)
mysql> select * from student;
+----+-------------+------+--------+
| id | name | age | gender |
+----+-------------+------+--------+
| 11 | zhangsan | 40 | M |
| 12 | wangwu | 13 | M |
| 13 | zhangfei | 20 | F |
| 15 | liubei | 40 | M |
| 16 | zhugeliang | 39 | M |
+----+-------------+------+--------+
5 rows in set (0.00 sec)
mysql> select * from t1;
+----+------+------+--------+
| id | name | age | gender |
+----+------+------+--------+
| 12 | u11 | 11 | M |
| 13 | u22 | 45 | F |
| 14 | u33 | 33 | M |
| 15 | u44 | 44 | F |
+----+------+------+--------+
4 rows in set (0.00 sec)
#开始执行完全备份
[root@rocky86 0104]# mysqldump -uuser1 -p123456 --source-data=1 -B testdb > /data/testdb-bak.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
#写student表
mysql> delete from student where id>15;
Query OK, 1 row affected (0.00 sec)
#写t1表
mysql> insert into t1 (name,age,gender)values("after",55,'M');
Query OK, 1 row affected (0.00 sec)
#写student表
mysql> update t1 set age=50 where id=12;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
#删除t1表
mysql> drop table t1;
Query OK, 0 rows affected (0.01 sec)
#写student表
mysql> update student set age=33 where id=12;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
#现状
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| student |
+------------------+
1 row in set (0.00 sec)
#开始恢复
#先停止MySQL服务
[root 0104]# systemctl stop mysqld.service
#查看完全备份中的 CHANGE 信息
[root 0104]# cat /data/testdb-bak.sql | grep "CHANGE"
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000008', MASTER_LOG_POS=16686058;
#导出 16686058 之后的binglog中的数据
[root 0104]# mysqlbinlog --start-position=16686058
/mysql/log/binlog.000008 > /backup/logbin.sql
#可以看到DROP语句,还原的时候去掉就行了
[root@rocky86 0104]# grep -i "drop" /backup/logbin.sql
DROP TABLE `t1` /* generated by server */
#拷贝到原程主机还原
[root 0104]# scp /data/testdb-bak.sql /backup/logbin.sql
root@10.0.0.183:/root/backup/
root@10.0.0.183's password:
testdb-bak.sql 100% 3214 3.7MB/s 00:00
logbin.sql 100% 7022 8.5MB/s 00:00
#远程主机上删除掉 drop 语句
# at 16687133
#230104 16:40:27 server id 1 end_log_pos 16687264 CRC32 0xe0287966 Query
thread_id=45 exec_time=0 error_code=0 Xid = 40712
SET TIMESTAMP=1672821627/*!*/;
DROP TABLE `t1` /* generated by server */
/*!*/;
#临时禁用远程主机上的二进制日志
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
#导入完全备份
mysql> source /root/backup/testdb-bak.sql
#导入二进制日志
mysql> source /root/backup/loginbin.sql
#查看,t1 表被恢复
mysql> show tables like '%t1%';
+-------------------------+
| Tables_in_testdb (%t1%) |
+-------------------------+
| t1 |
+-------------------------+
1 row in set (0.00 sec)
mysql> select * from t1;
+----+-------+------+--------+
| id | name | age | gender |
+----+-------+------+--------+
| 12 | u11 | 50 | M |
| 13 | u22 | 45 | F |
| 14 | u33 | 33 | M |
| 15 | u44 | 44 | F |
| 21 | after | 55 | M |
+----+-------+------+--------+
5 rows in set (0.00 sec)
#再备份出来导回去
[root backup]# mysqldump testdb t1 > testdb-t1.sql
[root backup]# scp testdb-t1.sql root@10.0.0.164:/root/0104/
root@10.0.0.164's password:
testdb-t1.sql 100% 2020 1.4MB/s 00:00
#导入的时候临时关闭二进制日志
— END —
-点击下方卡片关注-
点赞、转发、在看!
您的鼓励是对我最大的支持!

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!
优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、DIY体验、720全景展厅及3D虚拟仿真)、移动端应用(手机站、APP开发)、微信定制开发(微信官网、微信商城、企业微信)、微信小程序定制开发等一系列互联网应用服务。