1 案例1:完全备份与恢复
1.1 问题
- 练习物理备份与恢复
- 练习mysqldump备份与恢复
1.2 方案
准备新的服务器,角色如表-1所示。
1.3 步骤
实现此案例需要按照如下步骤进行。
准备虚拟机MySQL51
vm clone mysql51
vm setip mysql51 192.168.88.51
ssh root@192.168.88.51
yum -y install mysql mysql-server
systemclt start mysqld
exit
步骤一:练习物理备份与恢复
在数据库服务器192.168.88.50 练习数据的备份
备份数据
[root@mysql50 ~]# systemctl stop mysqld
[root@mysql50 ~]# mkdir /bakdir 创建备份目录
[root@mysql50 ~]# cp -r /var/lib/mysql /bakdir/mysql.bak 拷贝数据库目录
[root@mysql50 ~]# cd /var/lib/mysql 进入数据库目录
[root@mysql50 mysql]# tar -zcf /bakdir/mysql.tar.gz ./* 打包压缩数据源文件
[root@mysql50 mysql]# ls /bakdir/ 查看备份文件
mysql.bak mysql.tar.gz
把备份文件拷贝给mysql51
[root@mysql50 ~]# scp -r /bakdir/mysql.bak root@192.168.88.51:/root/
[root@mysql50 ~]# scp /bakdir/mysql.tar.gz root@192.168.88.51:/root/
在MySQL51主机恢复数据
[root@mysql51 ~]# systemctl stop mysqld 停止服务
[root@mysql51 ~]# rm -rf /var/lib/mysql/* 清空数据库目录
[root@mysql51 ~]# tar -xf /root/mysql.tar.gz -C /var/lib/mysql/ 释放压缩包
[root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql 修改所有者和组用户
[root@mysql51 ~]# systemctl start mysqld 启动服务
[root@mysql51 ~]# mysql -uroot -pNSD2023...a 连接服务查看数据
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| GAMEDB |
| db1 |
| home |
| information_schema |
| mysql |
| performance_schema |
| studb |
| sys |
| tarena |
| 学生库 |
+--------------------+
10 rows in set (0.00 sec)
也可使用cp拷贝的备份文件恢复数据
[root@mysql51 ~]# systemctl stop mysqld
[root@mysql51 ~]# rm -rf /var/lib/mysql/*
[root@mysql51 ~]# cp -r /bakdir/mysql.bak/* /var/lib/mysql/
[root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql
[root@mysql51 ~]# systemctl start mysqld
[root@mysql51 ~]# mysql -uroot -pNSD2023...a
步骤二:练习mysqldump备份与恢复
//备份1张表
[root@mysql50 ~]# mysqldump -uroot -pNSD2023...a tarena salary > /bakdir/tarena_salary.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
//备份多张表
[root@mysql50 ~]# mysqldump -uroot -pNSD2023...a tarena employees departments > /bakdir/tarena_employees_deparments.sql
//备份1个库
[root@mysql50 ~]# mysqldump -uroot -pNSD2023...a -B tarena > /bakdir/tarena.sql
//备份多个库
[root@mysql50 ~]# mysqldump -uroot -pNSD2023...a -B studb db1 > /bakdir/studb_db1.sql
//备份所有库
[root@mysql50 ~]# mysqldump -uroot -pNSD2023...a -A > /bakdir/allbak.sql
查看备份文件
[root@mysql50 ~]# ls /bakdir/*.sql
把备份文件拷贝给mysql51
[root@mysql50 ~]# scp /bakdir/*.sql root@192.168.88.51:/root/
在mysql51主机连接服务 删除库
[root@mysql51 ~]# mysql -uroot -pNSD2023...a 连接数据库
mysql> drop database tarena; 删除库
mysql> exit
//恢复数据
[root@mysql51 ~]# mysql -uroot -pNSD2023...a < /root/tarena.sql
//登陆查看数据
[root@mysql51 ~]# mysql -uroot -pNSD2023...a
mysql> use tarena; //进库
mysql> show tables; //看表
+------------------+
| Tables_in_tarena |
+------------------+
| departments |
| employees |
| salary |
| stu4 |
| user |
| wage_grade |
+------------------+
6 rows in set (0.00 sec)
//删除表记录
mysql> delete from salary;
mysql> exit
//使用备份文件恢复数据
[root@mysql51 ~]# mysql -uroot -pNSD2023...a tarena < /root/tarena_salary.sql
//登陆查看数据
[root@mysql51 ~]# mysql -uroot -pNSD2023...a
mysql> select count(*) from tarena.salary; //查看行数
+----------+
| count(*) |
+----------+
| 8055 |
+----------+
1 row in set (0.00 sec)
分析:
Mysqldump 备份和恢复数据时会锁表,锁表期间无法对表做写访问,mysqldump适合备份数据量比较小的数据或在数据库服务器访问量少的时候备份。
2 案例2:增量备份与恢复
2.1 问题
- 练习数据增量备份
- 练习数据增量恢复
2.2 方案
2.3 使用2台数据库服务器,如表-2所示
增量备份:备份上次备份后,新产生的数据。
PERCONA Xtrabackup是一款强大的在线热备份工具,备份过程中不锁库表,适合生产环境。支持完全备份与恢复、增量备份与恢复、差异备份与恢复。
在192.168.88.50主机完成备份练习 。
2.4 步骤
环境准备:安装软件(在mysql50 、MySQL51 两台主机都要安装)
//把真机里的软件拷贝到虚拟机里
环境准备:分别在MySQL50和 Mysql51主机安装percona软件
1)在MySQL50主机安装percona软件
//安装依赖
[root@host50 ~]# yum -y install perl-DBD-MySQL
//解压源码
[root@host50 ~ ]# tar -xf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal.tar.gz
//移动并改名
[root@host50 ~ ]# mv percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal /usr/local/percona
//把命令添加到系统环境变量
[root@host50 ~ ]# vim /etc/bashrc
export PATH=/usr/local/percona/bin:$PATH 添加在文件末尾
:wq
[root@host50 ~ ]# source /etc/bashrc
//查看帮助信息
[root@host50 ~ ]# man xtrabackup (按q 退出)
2)在Mysql51主机安装percona软件
[root@host51 ~]# yum -y install perl-DBD-MySQL
[root@host51 ~ ]# tar -xf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal.tar.gz
[root@host51 ~ ]# mv percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal /usr/local/percona
[root@host51 ~ ]# vim /etc/bashrc
export PATH=/usr/local/percona/bin:$PATH 添加在文件末尾
:wq
[root@host51 ~ ]# source /etc/bashrc
[root@host51 ~ ]# man xtrabackup (按q 退出)
步骤一:练习数据增量备份(在mysql50主机 完成增量备份练习)
对数据做增量备份前,必须先有一次备份,也就是首次备份,通常首次备份备份所有数据;比如每周周一完全备份,每周周二到周日增量备份。
周一完全备份(备份所有数据)
//备份
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/fullbak --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230610",18,25000,8000);
周二增量备份(备份周一备份后新产生的数据)
//备份
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new2 --incremental-basedir=/fullbak --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);
周三增量备份(备份周二备份后新产生的数据)
//备份
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new3 --incremental-basedir=/new2 --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);
周四增量备份(备份周三备份后新产生的数据)
//备份
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new4 --incremental-basedir=/new3 --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);
周五增量备份(备份周四备份后新产生的数据)
//备份
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new5 --incremental-basedir=/new4 --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);
周六增量备份(备份周五备份后新产生的数据)
//备份
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new6 --incremental-basedir=/new5 --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);
周日增量备份(备份周六备份后新产生的数据)
//备份
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new7 --incremental-basedir=/new6 --datadir=/var/lib/mysql
步骤二:练习数据增量恢复
增量恢复数据步骤:
- 准备恢复数据
- 合并数据
- 清空数据库目录
- 拷贝数据
- 修改数据库目录所有者/组用户为mysql
- 重启数据库服务
具体操作如下:
把MySQL50主机的备份文件拷贝给mysql51
//拷贝完全备份文件
[root@mysql50~]# scp –r /fullbak root@192.168.88.51:/opt/
//拷贝增量备份文件
[root@mysql50 ~]# scp –r /new* root@192.168.88.51:/opt/
在MySQL51主机使用备份文件恢复数据
1)、准备恢复数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak
2)、合并数据
//将周二的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是
周一 + 周二 的数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak --incremental-dir=/opt/new2
//将周三的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是
周一 + 周二 + 周三 的数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak --incremental-dir=/opt/new3
//将周四的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是
周一 + 周二 + 周三 +周四的数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak --incremental-dir=/opt/new4
//将周五的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是
周一 + 周二 + 周三 + 周四 +周五 的数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak --incremental-dir=/opt/new5
//将周六的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是
周一 + 周二 + 周三 + 周四 + 周五 + 周六 的数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak --incremental-dir=/opt/new6
//将周日的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是
周一 + 周二 + 周三 + 周四 + 周五 + 周六 + 周日 的数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/opt/fullbak --incremental-dir=/opt/new7
清空数据库目录
[root@mysql51 ~]# rm -rf /var/lib/mysql/*
拷贝数据
[root@mysql51 ~]# xtrabackup --copy-back --target-dir=/fullbak
修改数据库目录所有者/组用户为mysql
[root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql
重启数据库服务
[root@mysql51 ~]# systemctl restart mysqld
连接服务查看数据
[root@mysql51 ~]# mysql -uroot -pNSD2023...a
mysql> select count(*) from tarena.salary where date=20230710;
+----------+
| count(*) |
+----------+
| 75 |
+----------+
1 row in set (0.01 sec)
mysql> select count(*) from tarena.salary where not date=20230710;
+----------+
| count(*) |
+----------+
| 8067 |
+----------+
1 row in set (0.00 sec)
3 案例3:差异备份与恢复
3.1 问题
- 练习差异备份
- 练习差异恢复
3.2 方案
差异备份:备份完全备份后,新产生的数据。
在192.168.88.50主机完成差异备份
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:练习差异备份
//周一完全备份
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/allbak --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);
周二差异备份,备份周一备份后新产生的数据
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir2 --incremental-basedir=/allbak --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);
周三差异备份,备份周一备份后新产生的数据
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir3 --incremental-basedir=/allbak --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);
周四差异备份,备份周一备份后新产生的数据
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir4 --incremental-basedir=/allbak --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);
周五差异备份,备份周一备份后新产生的数据
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir5 --incremental-basedir=/allbak --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);
周六差异备份,备份周一备份后新产生的数据
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir6 --incremental-basedir=/allbak --datadir=/var/lib/mysql
//插入新数据 (可以插入多行)
mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);
周日差异,备份备份周一备份后新产生的数据
[root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir7 --incremental-basedir=/allbak --datadir=/var/lib/mysql
步骤二:练习差异恢复
差异恢复数据步骤:
- 准备恢复数据
- 合并数据
- 清空数据库目录
- 拷贝数据
- 修改数据库目录所有者/组用户为mysql
- 重启数据库服务
具体操作如下:
把MySQL50的备份文件拷贝给MySQL51
[root@mysql50 ~]# scp –r /allbak root@192.168.88.51:/root/ 周一完全备份
[root@mysql50 ~]# scp –r /dir7 root@192.168.88.51:/root/ 周日差异备份
1)、准备恢复数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/root/allbak
2)、合并数据
说明:将周日的差异备份与周一的完全备份合并,因为周日的差异备份包扩周二+周日的所有数据
[root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/root/allbak --incremental-dir=/root/dir7
3)清空数据库目录
[root@mysql51 ~]# rm -rf /var/lib/mysql/*
4)拷贝数据
[root@mysql51 ~]# xtrabackup --copy-back --target-dir=/root/allbak
5)修改数据库目录所有者/组用户为mysql
[root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql
6)重启数据库服务
[root@mysql51 ~]# systemctl restart mysqld
7)连接服务查看数据
[root@mysql51 ~]# mysql -uroot -pNSD2023...a
mysql> select count(*) from tarena.salary where date=20230810;
+----------+
| count(*) |
+----------+
| 75 |
+----------+
1 row in set (0.01 sec)
mysql> select count(*) from tarena.salary where not date=20230810;
+----------+
| count(*) |
+----------+
| 8067 |
+----------+
1 row in set (0.00 sec)
4 案例4:binlog日志
4.1 问题
- 查看正在使用的binlog日志文件
- 自定义日志目录和日志名
- 手动创建新的日志文件
- 练习日志相关命令的使用
- 使用日志恢复数据
4.2 方案
- 准备新的数据库服务器如表-3
4.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:查看正在使用的binlog日志文件
在新创建的数据库服务器做如下操作:
[root@mysql52 ~]# mysql 连接服务
mysql> show master status; 查看日志文件
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
执行查询命令
mysql> select count(*) from mysql.user;
+----------+
| count(*) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)
执行查询命令 日志偏移量不变
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
执行建库、建表命令
mysql> create database db1;
mysql> create table db1.user(name char(10));
执行写命令 日志偏移量改变
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 535 | | | |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
插入记录
mysql> insert into db1.user values("jim");
执行写命令 日志偏移量改变
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 809 | | | |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
步骤二:自定义日志目录和日志名
说明:日志文件默认保存在/var/lib/mysql目录下
[root@mysql52 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
log-bin=/mylog/mysql52 //定义日志目录和日志文件名(手动添加)
:wq
[root@mysql52 ~]# mkdir /mylog 创建目录
[root@mysql52 ~]# chown mysql /mylog 修改目录所有者mysql用户
[root@mysql52 ~]# setenforce 0 关闭selinux
[root@mysql52 ~]# systemctl restart mysqld 重启服务
[root@mysql52 ~]# ls /mylog/ 查看日志目录
mysql52.000001 mysql52.index
登陆服务
[root@mysql52 ~]# mysql
查看日志信息
Mysql> show master status ;
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql52.000001 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
步骤三:手动创建新的日志文件
说明:默认日志文件容量大于1G时会自动创建新的日志文件,在日志文件没写满时,执行的所有写命令都会保存到当前使用的日志文件里。
//刷新前查看
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql52.000001 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
//刷新日志
mysql> flush logs;
//查看日志文件
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql52.000002 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
//只要服务重启就会创建新日志
[root@mysql52 ~]# systemctl restart mysqld
[root@mysql52 ~]# mysql 连接服务
Mysql> show master status; 查看日志
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql52.000003 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
[root@mysql52 ~]#
//完全备份后创建新的日志文件,创建的日志个数和备份库的个数一致
[root@mysql52 ~]# mysqldump --flush-logs mysql user > user.sql
//查看日志
[root@mysql52 ~]# mysql -e 'show master status'
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql52.000004 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
步骤四:练习日志相关命令的使用
//查看已有的日志文件
mysql> show binary logs;
日志文件名 日志大小(字节) 加密(no/yes)
+----------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+----------------+-----------+-----------+
| mysql52.000001 | 201 | No |
| mysql52.000002 | 201 | No |
| mysql52.000003 | 179 | No |
| mysql52.000004 | 201 | No |
+----------------+-----------+-----------+
7 rows in set (0.00 sec)
//查看正在使用的日志
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql52.000004 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
//插入记录
mysql> insert into db1.user values("yaya");
//查看日志文件内容
说明:
Log_name: 日志文件名。
Pos: 命令在日志文件中的起始位置。
Event_type: 事件类型,例如 Query、Table_map、Write_rows 等。
Server_id: 服务器 ID。
End_log_pos:命令在文件中的结束位置,以字节为单位。
Info:执行命令信息。
mysql> show binlog events in "mysql52.000007";
+----------------+-----+----------------+-----------+-------------+--------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+----------------+-----+----------------+-----------+-------------+--------------------------------------+
| mysql52.000007 | 4 | Format_desc | 1 | 125 | Server ver: 8.0.26, Binlog ver: 4 |
| mysql52.000007 | 125 | Previous_gtids | 1 | 156 | |
| mysql52.000007 | 156 | Anonymous_Gtid | 1 | 235 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql52.000007 | 235 | Query | 1 | 306 | BEGIN |
| mysql52.000007 | 306 | Table_map | 1 | 359 | table_id: 108 (db1.user) |
| mysql52.000007 | 359 | Write_rows | 1 | 400 | table_id: 108 flags: STMT_END_F |
| mysql52.000007 | 400 | Xid | 1 | 431 | COMMIT /* xid=649 */ |
+----------------+-----+----------------+-----------+-------------+--------------------------------------+
7 rows in set (0.00 sec)
//删除日志文件名之前的所有日志文件
mysql> purge master logs to "mysql52.000003";
//查看已有的日志文件
mysql> show binary logs;
+----------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+----------------+-----------+-----------+
| mysql52.000003 | 201 | No |
| mysql52.000004 | 201 | No |
+----------------+-----------+-----------+
//删除所有日志文件,并重新创建日志文件
mysql> reset master;
//查看已有的日志文件 ,仅有第1个文件了
mysql> show binary logs;
+----------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+----------------+-----------+-----------+
| mysql52.000001 | 156 | No |
+----------------+-----------+-----------+
1 row in set (0.00 sec)
步骤五:使用日志恢复数据
1)在mysql52主机执行如下操:
//重置日志
mysql> reset master;
//查看日志
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql52.000001 | 156 | | | |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
//建库
mysql> create database gamedb;
//建表
mysql> create table gamedb.t1(name char(10),class char(3));
//插入记录
mysql> insert into gamedb.t1 values ("yaya","nsd");
mysql> insert into gamedb.t1 values ("yaya","nsd");
mysql> insert into gamedb.t1 values ("yaya","nsd");
//查看表记录
mysql> select * from gamedb.t1;
+------+-------+
| name | class |
+------+-------+
| yaya | nsd |
| yaya | nsd |
| yaya | nsd |
+------+-------+
3 rows in set (0.00 sec)
mysql> exit
//把日志文件拷贝给恢复数据的服务器,比如 mysql50
[root@mysql52 ~]# scp /mylog/mysql52.000001 root@192.168.88.50:/root/
2)在MySQL50 使用日志恢复数据
//查看日志
[root@mysql50 ~]# ls /root/mysql52.000001
/root/mysql52.000001
//执行日志恢复数据
[root@mysql50 ~]# mysqlbinlog /root/mysql52.000001 | mysql -uroot -pNSD2023...a
//连接服务查看数据
[root@mysql50 ~]# mysql -uroot -pNSD2023...a -e 'select * from gamedb.t1'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+-------+
| name | class |
+------+-------+
| yaya | nsd |
| yaya | nsd |
| yaya | nsd |
+------+-------+
[root@mysql50 ~]#