广州总部电话:020-85564311
广州总部电话:020-85564311

广州网站建设-小程序商城开发-广州小程序开发-企业微信开发公司-网站建设高端品牌-优网科技

20年
互联网应用服务商
请输入搜索关键词
知识库 知识库

优网知识库

探索行业前沿,共享知识宝库

MySQL 备份和恢复(二):mysqldump 备份工具
发布日期:2025-04-28 17:09:21 浏览次数: 815 来源:SRE运维派

点击上方 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 #使用十六进制转储二进制
MyISAM建议备份策略
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.sqlmysqldump: [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.sqlmysql> 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.sqlmysql: [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.sqlmysql: [Warning] Using a password on the command line interface can be insecure.
#查看mysql> use testdb2;Database changedmysql> show tables;+-------------------+| Tables_in_testdb2 |+-------------------+| student           || t1                || testlog           |+-------------------+3 rows in set (0.00 sec)
1.2.3.2 备份数据库结构和数据
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]#--databases 可以写成 -B
[root@rocky86 ~]# mysqldump -uuser1 -p123456 -B testdb2 > /data/testdb2-bak.sql
#备份文件对比[root@rocky86 ~]# 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@rocky86 ~]# cat /data/testdb2-bak.sql | grep -"create database"CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb2` /*!40100 DEFAULT CHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
[root@rocky86 ~]# cat /data/testdb-bak.sql | grep -"create database"
#测试还原mysql> drop database testdb2;Query OK3 rows affected (0.02 sec)
mysql> show databases like "%testdb%";+---------------------+| Database (%testdb%|+---------------------+| testdb              |+---------------------+1 row in set (0.00 sec)
#导入[root@rocky86 ~]# mysql -uuser1 -p123456 < /data/testdb2-bak.sqlmysql: [WarningUsing 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@rocky86 ~]# mysqldump -uuser1 -p123456 -A > /data/all-bak.sqlmysqldump: [WarningUsing a password on the command line interface can be insecure.
#查看文件大小[root@rocky86 ~]# ll /data/all* -h-rw-r--r-- 1 root root 23M Jan 2 21:46 /data/all-bak.sql
#备份时可以开启压缩,减小文件体积[root@rocky86 ~]# mysqldump -uuser1 -p123456 -A |gzip > /data/all-bak.sql.gzmysqldump: [WarningUsing a password on the command line interface can be insecure.
#再次查看[root@rocky86 ~]# 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@rocky86 ~]# cat /data/all-bak.sql | grep -"^create database"CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SETutf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `discuz` /*!40100 DEFAULT CHARACTER SETutf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `eshop` /*!40100 DEFAULT CHARACTER SETutf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `shopxo` /*!40100 DEFAULT CHARACTER SETutf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb` /*!40100 DEFAULT CHARACTER SETutf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb2` /*!40100 DEFAULT CHARACTERSET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;CREATE DATABASE /*!32312 IF NOT EXISTS*/ `wordpress` /*!40100 DEFAULT CHARACTERSET 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=user1password=123456
#仅指定 mysqladmin 客户端[mysqladmin]user=user1password=123456
#仅指定 mysqldump 客户端[mysqldump]user=user1password=123456
#所有客户端[client]user=user1password=123456

生产环境中,我们一般以项目或分数据库的方式来备份,而不会把整个 MySQL 中的所有库备份到一个文件,除非这个库的数据量很少。

如果我们使用了全部备份,而又只需要恢复一个数据库或一个表时,则应该先将备份数据还原到一个中间数据库,再从该库备份出想要的数据,然后再进行还原操作。

1.2.3.5 实现数据库备份脚本
[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=user1PWD=123456IGNORE='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.shdiscuz_2025-01-04 backup successeshop_2025-01-04 backup successmysql_2025-01-04 backup successshopxo_2025-01-04 backup successtestdb_2025-01-04 backup successtestdb2_2025-01-04 backup successwordpress_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.sqlmysql: [Warning] Using a password on the command line interface can be insecure.
[root@rocky86 0104]# mysql -uuser1 -p123456 < /backup/testdb2_2023-01-04.sqlmysql: [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=user1PWD=123456IGNORE='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 -ePATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin15 0 * * * /root/0104/backupv2.sh

1.2.3.6 保存二进制日志位置信息

在备份日志中记录备份时的二进制日志信息,后续通过此备份进行恢复,还是会缺少一部份数据,这一部份数据,则可以通过当前的二进制日志与备份文件中的二进制信息进行对比得到。

[root@rocky86 0104]# mysqldump -uuser1 -p123456 -B testdb > /data/testdbbak1.sqlmysqldump: [WarningUsing a password on the command line interface can be insecure.
#--source-data 选项值默认是1[root@rocky86 0104]# mysqldump -uuser1 -p123456 --source-data -B testdb > /data/testdb-bak2.sqlmysqldump: [WarningUsing a password on the command line interface can be insecure.
[root@rocky86 0104]# mysqldump -uuser1 -p123456 --source-data=1 -B testdb > /data/testdb-bak3.sqlmysqldump: [WarningUsing a password on the command line interface can be insecure.
[root@rocky86 0104]# mysqldump -uuser1 -p123456 --source-data=2 -B testdb > /data/testdb-bak4.sqlmysqldump: [WarningUsing a password on the command line interface can be insecure.
#默认无二进制日志位置信息[root@rocky86 0104]# cat /data/testdb-bak1.sql | grep "CHANGE MASTER"
#保存了二进制POS位置信息[root@rocky86 0104]# cat /data/testdb-bak2.sql | grep "CHANGE MASTER"CHANGE MASTER TO MASTER_LOG_FILE='binlog.000008', MASTER_LOG_POS=16682818;
#保存了二进制POS位置信息[root@rocky86 0104]# cat /data/testdb-bak3.sql | grep "CHANGE MASTER"CHANGE MASTER TO MASTER_LOG_FILE='binlog.000008', MASTER_LOG_POS=16682818;
#保存了二进制POS位置信息,但是被注释[root@rocky86 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.sqlmysqldump: [Warning] Using a password on the command line interface can be insecure.
#写studentmysqldelete from student where id>15;Query OK1 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@rocky86 0104]# systemctl stop mysqld.service
#查看完全备份中的 CHANGE 信息[root@rocky86 0104]# cat /data/testdb-bak.sql | grep "CHANGE"CHANGE MASTER TO MASTER_LOG_FILE='binlog.000008', MASTER_LOG_POS=16686058;
#导出 16686058 之后的binglog中的数据[root@rocky86 0104]# mysqlbinlog --start-position=16686058/mysql/log/binlog.000008 > /backup/logbin.sql
#可以看到DROP语句,还原的时候去掉就行了[root@rocky86 0104]# grep -i "drop" /backup/logbin.sqlDROP TABLE `t1` /* generated by server */
#拷贝到原程主机还原[root@rocky86 0104]# scp /data/testdb-bak.sql /backup/logbin.sqlroot@10.0.0.183:/root/backup/root@10.0.0.183's password:testdb-bak.sql 100% 3214 3.7MB/s 00:00logbin.sql 100% 7022 8.5MB/s 00:00
#远程主机上删除掉 drop 语句# at 16687133#230104 16:40:27 server id 1 end_log_pos 16687264 CRC32 0xe0287966 Querythread_id=45 exec_time=0 error_code=0 Xid = 40712SET TIMESTAMP=1672821627/*!*/;DROP TABLE `t1` /* generated by server *//*!*/;
#临时禁用远程主机上的二进制日志mysql> set sql_log_bin=0;Query OK0 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@rocky86 backup]# mysqldump testdb t1 > testdb-t1.sql[root@rocky86 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开发)、微信定制开发(微信官网、微信商城、企业微信)、微信小程序定制开发等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》

专属顾问 专属顾问
扫码咨询您的优网专属顾问!
专属顾问
马上咨询
联系专属顾问
联系专属顾问
联系专属顾问
扫一扫马上咨询
扫一扫马上咨询

扫一扫马上咨询

和我们在线交谈!