完全备份、增量备份、差异备份、binlog日志

Top

NSD DBA DAY06

  1. 案例1:完全备份与恢复
  2. 案例2:增量备份与恢复
  3. 案例3:差异备份与恢复
  4. 案例4:binlog日志

1 案例1:完全备份与恢复

1.1 问题

  1. 练习物理备份与恢复
  2. 练习mysqldump备份与恢复

1.2 方案

在数据库服务器192.168.88.50 练习数据的备份与恢复

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:练习物理备份与恢复

冷备份,需停止数据库服务 适合线下服务器。

备份数据

  1. root@mysql50 \~\]# systemctl stop mysqld

  2. root@mysql50 \~\]# cp -r /var/lib/mysql /bakdir/mysql.bak 拷贝数据源文件

  3. root@mysql50 mysql\]# tar -zcvf /bakdir/mysql.tar.gz ./\* 打包压缩数据源文件

  4. mysql.bak mysql.tar.gz

删除数据

  1. root@mysql50 \~\]# rm -rf /var/lib/mysql/\*

  2. root@mysql50 \~\]# tar -xf /bakdir/mysql.tar.gz -C /var/lib/mysql/

  3. root@mysql50 \~\]# mysql -uroot -pNSD2023...a

  4. +--------------------+

  5. | Database |

  6. +--------------------+

  7. | GAMEDB |

  8. | db1 |

  9. | home |

  10. | information_schema |

  11. | mysql |

  12. | performance_schema |

  13. | studb |

  14. | sys |

  15. | tarena |

  16. | 学生库 |

  17. +--------------------+

  18. 10 rows in set (0.00 sec)

也可使用cp拷贝的备份文件恢复数据

  1. root@mysql50 \~\]# systemctl stop mysqld

  2. [root@mysql50](mailto:root@mysql50) \~\]# cp -r /bakdir/mysql.bak/\* /var/lib/mysql/

  3. [root@mysql50](mailto:root@mysql50) \~\]# systemctl start mysqld

步骤二:练习mysqldump备份与恢复

热备份,备份和恢复数据库服务必须是运行的

  1. //备份1张表

  2. root@mysql50 \~\]# mysqldump -uroot -pNSD2023...a tarena salary \> /bakdir/tarena_salary.sql

  3. //备份多张表

  4. root@mysql50 \~\]# mysqldump -uroot -pNSD2023...a tarena employees departments \> /bakdir/tarena_employees_deparments.sql

  5. //备份1个库

  6. root@mysql50 \~\]# mysqldump -uroot -pNSD2023...a -B tarena \> /bakdir/tarena.sql

  7. //备份多个库

  8. root@mysql50 \~\]# mysqldump -uroot -pNSD2023...a -B studb db1 \> /bakdir/studb_db1.sql

  9. //备份所有库

  10. root@mysql50 \~\]# mysqldump -uroot -pNSD2023...a -A \> /bakdir/allbak.sql

  11. root@mysql50 \~\]#

  12. root@mysql50 \~\]# mysql -uroot -pNSD2023...a

  13. Query OK, 6 rows affected (0.57 sec)

  14. mysql> exit

  15. Bye

  16. root@mysql50 \~\]# mysql -uroot -pNSD2023...a \< /bakdir/tarena.sql //恢复数据

  17. root@mysql50 \~\]# mysql -uroot -pNSD2023...a //登陆

  18. mysql> show tables; //看表

  19. +------------------+

  20. | Tables_in_tarena |

  21. +------------------+

  22. | departments |

  23. | employees |

  24. | salary |

  25. | stu4 |

  26. | user |

  27. | wage_grade |

  28. +------------------+

  29. 6 rows in set (0.00 sec)

  30. mysql> delete from salary; //删除表记录

  31. Query OK, 8055 rows affected (0.11 sec)

  32. mysql> exit

  33. Bye

  34. root@mysql50 \~\]#

  35. root@mysql50 \~\]# mysql -uroot -pNSD2023...a tarena \< /bakdir/tarena_salary.sql

  36. root@mysql50 \~\]# mysql -uroot -pNSD2023...a //登陆服务

  37. +----------+

  38. | count(*) |

  39. +----------+

  40. | 8055 |

  41. +----------+

  42. 1 row in set (0.00 sec)

分析:

Mysqldump 备份和恢复数据时会锁表,锁表期间无法对表做写访问,mysqldump适合备份数据量比较小的数据或在数据库服务器访问量少的时候备份。

2 案例2:增量备份与恢复

2.1 问题

  1. 练习数据增量备份
  2. 练习数据增量恢复

2.2 方案

2.3 准备2台数据库服务器,如表-1所示

增量备份:备份上次备份后,新产生的数据。

PERCONA Xtrabackup是一款强大的在线热备份工具,备份过程中不锁库表,适合生产环境。支持完全备份与恢复、增量备份与恢复、差异备份与恢复。

在192.168.88.50主机完成备份与恢复的练习 。

2.4 步骤

实现此案例需要按照如下步骤进行。

步骤一:练习数据增量备份

安装软件(在mysql50 、MySQL51 两台主机都要安装)

复制代码
  1. //把软件拷贝到虚拟机里
  2. openeuler@server1 \~\]$ scp /linux-soft/s3/percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal.tar.gz root@192.168.88.50:/root/

  3. root@host50 \~\]# yum -y install perl-DBD-MySQL

  4. root@host50 \~ \]# tar -xf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal.tar.gz

  5. root@host50 \~ \]# mv percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal /usr/local/percona

  6. root@host50 \~ \]# vim /etc/bashrc

  7. :wq
  8. root@host50 \~ \]# source /etc/bashrc

  9. root@host50 \~ \]# man xtrabackup (按q 退出)

对数据做增量备份前,必须先有一次备份,也就是首次备份,通常是备份所有数据;比如每周周一完全备份,周二到周日增量备份。

周一完全备份(备份所有数据)

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/fullbak --datadir=/var/lib/mysql

  2. ......
  3. 230530 18:18:48 [00] ...done
  4. xtrabackup: Transaction log of lsn (24822878) to (24822898) was copied.
  5. 230530 18:18:50 completed OK!
  6. root@mysql50 \~\]#

  7. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230610",18,25000,8000);

周二增量备份(备份周一备份后新产生的数据)

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new2 --incremental-basedir=/fullbak --datadir=/var/lib/mysql

  2. ......
  3. 230530 18:33:52 [00] ...done
  4. xtrabackup: Transaction log of lsn (24827173) to (24827183) was copied.
  5. 230530 18:33:53 completed OK!
  6. root@mysql50 \~\]#

  7. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);

周三增量备份(备份周二备份后新产生的数据)

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new3 --incremental-basedir=/new2 --datadir=/var/lib/mysql

  2. ......
  3. 230530 18:46:17 [00] ...done
  4. xtrabackup: Transaction log of lsn (24832526) to (24832536) was copied.
  5. 230530 18:46:18 completed OK!
  6. root@mysql50 \~\]#

  7. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);

周四增量备份(备份周三备份后新产生的数据)

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new4 --incremental-basedir=/new3 --datadir=/var/lib/mysql

  2. ......
  3. 230530 18:53:41 [00] ...done
  4. xtrabackup: Transaction log of lsn (24837561) to (24837571) was copied.
  5. 230530 18:53:42 completed OK!
  6. root@mysql50 \~\]#

  7. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);

周五增量备份(备份周四备份后新产生的数据)

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new5 --incremental-basedir=/new4 --datadir=/var/lib/mysql

  2. ......
  3. 230530 18:58:50 [00] ...done
  4. xtrabackup: Transaction log of lsn (24841645) to (24841655) was copied.
  5. 230530 18:58:51 completed OK!
  6. root@mysql50 \~\]#

  7. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);

周六增量备份(备份周五备份后新产生的数据)

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new6 --incremental-basedir=/new5 --datadir=/var/lib/mysql

  2. ......
  3. 230530 19:00:55 [00] ...done
  4. xtrabackup: Transaction log of lsn (24848404) to (24848414) was copied.
  5. 230530 19:00:56 completed OK!
  6. root@mysql50 \~\]#

  7. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230710",18,25000,8000);

周日增量备份(备份周六备份后新产生的数据)

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/new7 --incremental-basedir=/new6 --datadir=/var/lib/mysql

  2. ......
  3. 230530 19:00:55 [00] ...done
  4. xtrabackup: Transaction log of lsn (24848404) to (24848414) was copied.
  5. 230530 19:00:56 completed OK!
  6. root@mysql50 \~\]#

增量恢复数据步骤:

  1. 准备恢复数据
  2. 合并数据
  3. 清空数据库目录
  4. 拷贝数据
  5. 修改数据库目录所有者/组用户为mysql
  6. 重启数据库服务

具体操作如下:

MySQL51 拷贝 MySQL50 的备份文件到 本机的根目录下

复制代码
  1. root@mysql50 \~\]# scp --r root@192.168.88.50:/fullbak /

  2. root@mysql50 \~\]# scp --r root@192.168.88.50:/new3 /

  3. root@mysql50 \~\]# scp --r root@192.168.88.50:/new5 /

  4. root@mysql50 \~\]# scp --r root@192.168.88.50:/new7 /

1)、准备恢复数据

复制代码
  1. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak

  2. ......
  3. Log background threads are being closed...
  4. Shutdown completed; log sequence number 24822898
  5. Number of pools: 1
  6. 230531 14:32:14 completed OK!
  7. root@mysql51 \~\]#

复制代码
  1. //将周二的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是周一 + 周二 的数据
  2. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new2

  3. ......
  4. 230531 14:40:05 [00] Copying /new2/binlog.index to ./binlog.index
  5. 230531 14:40:05 [00] ...done
  6. 230531 14:40:05 completed OK!
  7. root@mysql51 \~\]#

  8. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new3

  9. ......
  10. 230531 15:00:37 [00] Copying /new3/binlog.index to ./binlog.index
  11. 230531 15:00:37 [00] ...done
  12. 230531 15:00:37 completed OK!
  13. root@mysql51 \~\]#

  14. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new4

  15. ......
  16. 230531 15:00:37 [00] Copying /new4/binlog.index to ./binlog.index
  17. 230531 15:00:37 [00] ...done
  18. 230531 15:00:37 completed OK!
  19. root@mysql51 \~\]#

  20. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new5

  21. ......
  22. 230531 15:00:37 [00] Copying /new5/binlog.index to ./binlog.index
  23. 230531 15:00:37 [00] ...done
  24. 230531 15:00:37 completed OK!
  25. root@mysql51 \~\]#

  26. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new6

  27. ......
  28. 230531 15:00:37 [00] Copying /new6/binlog.index to ./binlog.index
  29. 230531 15:00:37 [00] ...done
  30. 230531 15:00:37 completed OK!
  31. root@mysql51 \~\]#

  32. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new7

  33. ......
  34. 230531 15:00:37 [00] Copying /new7/binlog.index to ./binlog.index
  35. 230531 15:00:37 [00] ...done
  36. 230531 15:00:37 completed OK!
  37. root@mysql51 \~\]#

  38. [root@mysql51](mailto:root@mysql51) \~\]# xtrabackup --copy-back --target-dir=/fullbak

6)重启数据库服务

复制代码
  1. root@mysql51 \~\]# systemctl restart mysqld

复制代码
  1. root@mysql51 \~\]# mysql -uroot -pNSD2023...a

  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 75 |
  6. +----------+
  7. 1 row in set (0.01 sec)
  8. mysql> select count(*) from tarena.salary where not date=20230710;
  9. +----------+
  10. | count(*) |
  11. +----------+
  12. | 8067 |
  13. +----------+
  14. 1 row in set (0.00 sec)

3 案例3:差异备份与恢复

3.1 问题

  1. 练习差异备份
  2. 练习差异恢复

3.2 方案

差异备份:备份完全备份后,新产生的数据。

PERCONA Xtrabackup是一款强大的在线热备份工具,备份过程中不锁库表,适合生产环境。支持差异备份与恢复。

在192.168.88.50主机完成差异备份

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:练习差异备份

差异备份

对数据做差异备份前,必须先有一次备份,也就是首次备份,通常是备份所有数据;比如每周周一完全备份,周二到周日差异备份。

复制代码
  1. //周一完全备份
  2. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/allbak --datadir=/var/lib/mysql

  3. ......
  4. 230531 17:10:02 [00] Writing /allbak/xtrabackup_info
  5. 230531 17:10:02 [00] ...done
  6. xtrabackup: Transaction log of lsn (24881353) to (24881373) was copied.
  7. 230531 17:10:03 completed OK!
  8. root@mysql50 \~\]#

  9. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);

周二差异备份,备份周一备份后新产生的数据

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir2 --incremental-basedir=/allbak --datadir=/var/lib/mysql

  2. ......
  3. 230531 17:23:56 [00] Writing /dir2/xtrabackup_info
  4. 230531 17:23:56 [00] ...done
  5. xtrabackup: Transaction log of lsn (24886741) to (24886751) was copied.
  6. 230531 17:23:58 completed OK!
  7. root@mysql50 \~\]#

  8. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);

周三差异备份,备份周一备份后新产生的数据

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir3 --incremental-basedir=/allbak --datadir=/var/lib/mysql

  2. ......
  3. 230531 17:27:10 [00] Writing /dir3/xtrabackup_info
  4. 230531 17:27:10 [00] ...done
  5. xtrabackup: Transaction log of lsn (24892043) to (24892063) was copied.
  6. 230531 17:27:11 completed OK!
  7. root@mysql50 \~\]#

  8. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);

周四差异备份,备份周一备份后新产生的数据

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir4 --incremental-basedir=/allbak --datadir=/var/lib/mysql

  2. ......
  3. 230531 17:31:00 [00] Writing /dir4/xtrabackup_info
  4. 230531 17:31:00 [00] ...done
  5. xtrabackup: Transaction log of lsn (24900560) to (24900580) was copied.
  6. 230531 17:31:01 completed OK!
  7. root@mysql50 \~\]#

  8. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);

周五差异备份,备份周一备份后新产生的数据

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir5 --incremental-basedir=/allbak --datadir=/var/lib/mysql

  2. ......
  3. 230531 17:32:38 [00] Writing /dir5/xtrabackup_info
  4. 230531 17:32:38 [00] ...done
  5. xtrabackup: Transaction log of lsn (24906902) to (24906912) was copied.
  6. 230531 17:32:39 completed OK!
  7. root@mysql50 \~\]#

  8. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);

周六差异备份,备份周一备份后新产生的数据

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir6 --incremental-basedir=/allbak --datadir=/var/lib/mysql

  2. ......
  3. 230531 17:41:01 [00] Writing /dir6/xtrabackup_info
  4. 230531 17:41:01 [00] ...done
  5. xtrabackup: Transaction log of lsn (24914729) to (24914739) was copied.
  6. 230531 17:41:02 completed OK!
  7. root@mysql50 \~\]#

  8. mysql> insert into tarena.salary(date,employee_id,basic,bonus)values("20230810",18,25000,8000);

周日差异,备份备份周一备份后新产生的数据

复制代码
  1. root@mysql50 \~\]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/dir7 --incremental-basedir=/allbak --datadir=/var/lib/mysql

  2. ......
  3. 230531 17:43:16 [00] Writing /dir7/xtrabackup_info
  4. 230531 17:43:16 [00] ...done
  5. xtrabackup: Transaction log of lsn (24920772) to (24920782) was copied.
  6. 230531 17:43:17 completed OK!
  7. root@mysql50 \~\]#

差异恢复数据步骤:

  1. 准备恢复数据
  2. 合并数据
  3. 清空数据库目录
  4. 拷贝数据
  5. 修改数据库目录所有者/组用户为mysql
  6. 重启数据库服务

具体操作如下:

MySQL51 拷贝 MySQL50 的备份文件到 本机的根目录下

复制代码
  1. root@mysql51 \~\]# scp --r root@192.168.88.50:/allbak /

在MySQL51主机使用备份文件恢复数据

1)、准备恢复数据

复制代码
  1. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/allbak

  2. ......
  3. Log background threads are being closed...
  4. Shutdown completed; log sequence number 24881373
  5. Number of pools: 1
  6. 230531 17:59:06 completed OK!
  7. root@mysql51 \~\]#

复制代码
  1. //将周日的差异备份与周一的完全备份合并,因为周日的差异备份包扩周二+周日的所有数据
  2. root@mysql51 \~\]# xtrabackup --prepare --apply-log-only --target-dir=/allbak --incremental-dir=/dir7

  3. ......
  4. 230531 18:05:08 [00] Copying /dir7/binlog.000029 to ./binlog.000029
  5. 230531 18:05:08 [00] ...done
  6. 230531 18:05:08 [00] Copying /dir7/binlog.index to ./binlog.index
  7. 230531 18:05:08 [00] ...done
  8. 230531 18:05:08 completed OK!
  9. root@mysql51 \~\]#

  10. [root@mysql51](mailto:root@mysql51) \~\]# xtrabackup --copy-back --target-dir=/allbak

6)重启数据库服务

复制代码
  1. root@mysql51 \~\]# systemctl restart mysqld

复制代码
  1. root@mysql51 \~\]# mysql -uroot -pNSD2023...a

  2. +----------+
  3. | count(*) |
  4. +----------+
  5. | 75 |
  6. +----------+
  7. 1 row in set (0.01 sec)
  8. mysql> select count(*) from tarena.salary where not date=20230810;
  9. +----------+
  10. | count(*) |
  11. +----------+
  12. | 8067 |
  13. +----------+
  14. 1 row in set (0.00 sec)

4 案例4:binlog日志

4.1 问题

  1. 查看正在使用的binlog日志文件
  2. 自定义日志目录和日志名
  3. 手动创建新的日志文件
  4. 练习日志相关命令的使用
  5. 使用日志恢复数据

4.2 方案

binlog日志介绍:

  1. 也称做 二进制日志
  2. MySQL服务日志文件的一种
  3. 保存除查询之外的所有SQL命令
  4. 可用于数据的备份和恢复
  5. 配置mysql主从同步的必要条件
  6. 准备新的数据库服务器如表-1,做binlog日志的练习

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:查看正在使用的binlog日志文件

在新创建的数据库服务器做如下操作:

复制代码
  1. root@mysql52 \~\]# yum -y install mysql-server mysql 安装软件

  2. root@mysql52 \~\]# mysql 连接服务

  3. +----------------+----------+--------------+------------------+-------------------+
  4. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  5. +----------------+----------+--------------+------------------+-------------------+
  6. | binlog.000001 | 156 | | | |
  7. +----------------+----------+--------------+------------------+-------------------+
  8. 1 row in set (0.00 sec)
  9. 执行查询命令
  10. mysql> select count(*) from mysql.user;
  11. +----------+
  12. | count(*) |
  13. +----------+
  14. | 4 |
  15. +----------+
  16. 1 row in set (0.00 sec)
  17. mysql> show master status; 执行查询命令 日志偏移量不变
  18. +----------------+----------+--------------+------------------+-------------------+
  19. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  20. +----------------+----------+--------------+------------------+-------------------+
  21. | binlog.000001 | 156 | | | |
  22. +----------------+----------+--------------+------------------+-------------------+
  23. 1 row in set (0.00 sec)
  24. 执行建库、建表命令
  25. mysql> create database db1;
  26. Query OK, 1 row affected (0.07 sec)
  27. mysql> create table db1.user(name char(10));
  28. Query OK, 0 rows affected (0.52 sec)
  29. mysql> show master status; 执行写命令 日志偏移量改变
  30. +----------------+----------+--------------+------------------+-------------------+
  31. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  32. +----------------+----------+--------------+------------------+-------------------+
  33. | binlog.000001 | 535 | | | |
  34. +----------------+----------+--------------+------------------+-------------------+
  35. 1 row in set (0.00 sec)
  36. mysql> insert into db1.user values("jim"); 插入记录
  37. Query OK, 1 row affected (0.10 sec)
  38. mysql> show master status; 执行写命令 日志偏移量改变
  39. +----------------+----------+--------------+------------------+-------------------+
  40. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  41. +----------------+----------+--------------+------------------+-------------------+
  42. | binlog.000001 | 809 | | | |
  43. +----------------+----------+--------------+------------------+-------------------+
  44. 1 row in set (0.00 sec)
  45. mysql>

步骤二:自定义日志目录和日志名

日志文件默认保存在/var/lib/mysql目录下,默认日志名binlog

复制代码
  1. root@mysql52 \~\]# vim /etc/my.cnf.d/mysql-server.cnf

  2. log-bin=/mylog/mysql52 //定义日志目录和日志文件名(手动添加)
  3. :wq
  4. root@mysql52 \~\]# mkdir /mylog 创建目录

  5. root@mysql52 \~\]# setenforce 0 关闭selinux

  6. root@mysql52 \~\]# ls /mylog/ 查看日志目录

  7. root@mysql52 \~\]# mysql 登陆服务

  8. +----------------+----------+--------------+------------------+-------------------+
  9. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  10. +----------------+----------+--------------+------------------+-------------------+
  11. | mysql52.000001 | 156 | | | |
  12. +----------------+----------+--------------+------------------+-------------------+

步骤三:手动创建新的日志文件

默认日志文件容量大于1G时会自动创建新的日志文件,在日志文件没写满时,执行的所有写命令都会保存到当前使用的日志文件里。

复制代码
  1. //刷新前查看
  2. mysql> show master status;
  3. +----------------+----------+--------------+------------------+-------------------+
  4. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  5. +----------------+----------+--------------+------------------+-------------------+
  6. | mysql52.000001 | 156 | | | |
  7. +----------------+----------+--------------+------------------+-------------------+
  8. 1 row in set (0.00 sec)
  9. mysql> flush logs; //刷新日志
  10. Query OK, 0 rows affected (0.22 sec)
  11. mysql> flush logs; //刷新日志
  12. Query OK, 0 rows affected (0.16 sec)
  13. mysql> show master status; //刷新一次创建一个新日志
  14. +----------------+----------+--------------+------------------+-------------------+
  15. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  16. +----------------+----------+--------------+------------------+-------------------+
  17. | mysql52.000003 | 156 | | | |
  18. +----------------+----------+--------------+------------------+-------------------+
  19. 1 row in set (0.00 sec)
  20. //只要服务重启就会创建新日志
  21. root@mysql52 \~\]# systemctl restart mysqld

  22. Mysql> show master status; 查看日志
  23. +----------------+----------+--------------+------------------+-------------------+
  24. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  25. +----------------+----------+--------------+------------------+-------------------+
  26. | mysql52.000004 | 156 | | | |
  27. +----------------+----------+--------------+------------------+-------------------+
  28. root@mysql52 \~\]#

  29. root@mysql52 \~\]# mysqldump --flush-logs mysql user \> user.sql

  30. +----------------+----------+--------------+------------------+-------------------+
  31. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  32. +----------------+----------+--------------+------------------+-------------------+
  33. | mysql52.000005 | 156 | | | |
  34. +----------------+----------+--------------+------------------+-------------------+
  35. root@mysql52 \~\]# mysqldump --flush-logs -B mysql db1 \> db_2.sql

  36. +----------------+----------+--------------+------------------+-------------------+
  37. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  38. +----------------+----------+--------------+------------------+-------------------+
  39. | mysql52.000007 | 156 | | | |
  40. +----------------+----------+--------------+------------------+-------------------+
  41. root@mysql52 \~\]#

MySQL服务提供了管理日志的专属命令,具体练习如下:

复制代码
  1. //查看已有的日志文件
  2. mysql> show binary logs;
  3. 日志文件名 日志大小(字节) 加密(no/yes)
  4. +----------------+-----------+-----------+
  5. | Log_name | File_size | Encrypted |
  6. +----------------+-----------+-----------+
  7. | mysql52.000001 | 201 | No |
  8. | mysql52.000002 | 201 | No |
  9. | mysql52.000003 | 179 | No |
  10. | mysql52.000004 | 201 | No |
  11. | mysql52.000005 | 201 | No |
  12. | mysql52.000006 | 201 | No |
  13. | mysql52.000007 | 156 | No |
  14. +----------------+-----------+-----------+
  15. 7 rows in set (0.00 sec)
  16. //查看正在使用的日志
  17. mysql> show master status;
  18. +----------------+----------+--------------+------------------+-------------------+
  19. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  20. +----------------+----------+--------------+------------------+-------------------+
  21. | mysql52.000007 | 156 | | | |
  22. +----------------+----------+--------------+------------------+-------------------+
  23. 1 row in set (0.00 sec)
  24. //插入记录
  25. mysql> insert into db1.user values("yaya");
  26. Query OK, 1 row affected (0.04 sec)
  27. //查看日志文件内容
  28. mysql> show binlog events in "mysql52.000007";
  29. Log_name: 日志文件名。
  30. Pos: 命令在日志文件中的起始位置。
  31. Event_type: 事件类型,例如 Query、Table_map、Write_rows 等。
  32. Server_id: 服务器 ID。
  33. End_log_pos:命令在文件中的结束位置,以字节为单位。
  34. Info:执行命令信息。
  35. +----------------+-----+----------------+-----------+-------------+--------------------------------------+
  36. | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
  37. +----------------+-----+----------------+-----------+-------------+--------------------------------------+
  38. | mysql52.000007 | 4 | Format_desc | 1 | 125 | Server ver: 8.0.26, Binlog ver: 4 |
  39. | mysql52.000007 | 125 | Previous_gtids | 1 | 156 | |
  40. | mysql52.000007 | 156 | Anonymous_Gtid | 1 | 235 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
  41. | mysql52.000007 | 235 | Query | 1 | 306 | BEGIN |
  42. | mysql52.000007 | 306 | Table_map | 1 | 359 | table_id: 108 (db1.user) |
  43. | mysql52.000007 | 359 | Write_rows | 1 | 400 | table_id: 108 flags: STMT_END_F |
  44. | mysql52.000007 | 400 | Xid | 1 | 431 | COMMIT /* xid=649 */ |
  45. +----------------+-----+----------------+-----------+-------------+--------------------------------------+
  46. 7 rows in set (0.00 sec)
  47. //删除日志文件名之前的所有日志文件
  48. mysql> purge master logs to "mysql52.000004";
  49. Query OK, 0 rows affected (0.10 sec)
  50. //查看已有的日志文件
  51. mysql> show binary logs;
  52. +----------------+-----------+-----------+
  53. | Log_name | File_size | Encrypted |
  54. +----------------+-----------+-----------+
  55. | mysql52.000004 | 201 | No |
  56. | mysql52.000005 | 201 | No |
  57. | mysql52.000006 | 201 | No |
  58. | mysql52.000007 | 431 | No |
  59. +----------------+-----------+-----------+
  60. 4 rows in set (0.00 sec)
  61. //删除所有日志文件,并重新创建日志文件
  62. mysql> reset master;
  63. Query OK, 0 rows affected (0.14 sec)
  64. //查看已有的日志文件 ,仅有第1个文件了
  65. mysql> show binary logs;
  66. +----------------+-----------+-----------+
  67. | Log_name | File_size | Encrypted |
  68. +----------------+-----------+-----------+
  69. | mysql52.000001 | 156 | No |
  70. +----------------+-----------+-----------+
  71. 1 row in set (0.00 sec)

步骤五:使用日志恢复数据

把查看到的文件内容管道给连接mysql服务的命令执行

恢复数据命令:

mysqlbinlog /目录/文件名 | mysql --uroot -p密码

1)在mysql52主机执行如下操:

复制代码
  1. //重置日志
  2. mysql> reset master;
  3. Query OK, 0 rows affected (0.09 sec)
  4. //查看日志
  5. mysql> show master status;
  6. +----------------+----------+--------------+------------------+-------------------+
  7. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  8. +----------------+----------+--------------+------------------+-------------------+
  9. | mysql52.000001 | 156 | | | |
  10. +----------------+----------+--------------+------------------+-------------------+
  11. 1 row in set (0.00 sec)
  12. //建库、
  13. mysql> create database gamedb;
  14. Query OK, 1 row affected (0.07 sec)
  15. //建表
  16. mysql> create table gamedb.t1(name char(10),class char(3));
  17. Query OK, 0 rows affected (0.55 sec)
  18. //插入记录
  19. mysql> insert into gamedb.t1 values ("yaya","nsd");
  20. Query OK, 1 row affected (0.08 sec)
  21. mysql> insert into gamedb.t1 values ("yaya","nsd");
  22. Query OK, 1 row affected (0.04 sec)
  23. mysql> insert into gamedb.t1 values ("yaya","nsd");
  24. Query OK, 1 row affected (0.08 sec)
  25. //查看表记录
  26. mysql> select * from gamedb.t1;
  27. +------+-------+
  28. | name | class |
  29. +------+-------+
  30. | yaya | nsd |
  31. | yaya | nsd |
  32. | yaya | nsd |
  33. +------+-------+
  34. 3 rows in set (0.00 sec)
  35. mysql> exit
  36. //把日志文件拷贝给恢复数据的服务器,比如 mysql50
  37. root@mysql52 \~\]# scp /mylog/mysql52.000001 root@192.168.88.50:/root/

  38. ECDSA key fingerprint is SHA256:t7J3okFd0o+9zTmFCIetvDl6mxGCmc43VoD6C65zico.
  39. Are you sure you want to continue connecting (yes/no/[fingerprint])? Yes 同意
  40. Warning: Permanently added '192.168.88.50' (ECDSA) to the list of known hosts.
  41. root@192.168.88.50's password: mysql50的密码
  42. mysql52.000001 100% 1410 1.6MB/s 00:00
  43. root@mysql52 \~\]#

复制代码
  1. //查看日志
  2. root@mysql50 \~\]# ls /root/mysql52.000001

  3. //执行日志恢复数据
  4. root@mysql50 \~\]# mysqlbinlog /root/mysql52.000001 \| mysql -uroot -pNSD2023...a

  5. //连接服务查看数据
  6. root@mysql50 \~\]# mysql -uroot -pNSD2023...a -e 'select \* from gamedb.t1'

  7. +------+-------+
  8. | name | class |
  9. +------+-------+
  10. | yaya | nsd |
  11. | yaya | nsd |
  12. | yaya | nsd |
  13. +------+-------+
  14. root@mysql50 \~\]#

相关推荐
何盖(何松影)3 小时前
Android T startingwindow使用总结
android
小李飞飞砖5 小时前
Android 依赖注入框架详解
android
SUNxuetian5 小时前
【Android Studio】升级AGP-8.6.1,Find Usage对Method失效的处理方法!
android·ide·gradle·android studio·安卓
阿华的代码王国5 小时前
【Android】搭配安卓环境及设备连接
android·java
__water6 小时前
RHA《Unity兼容AndroidStudio打Apk包》
android·unity·jdk·游戏引擎·sdk·打包·androidstudio
一起搞IT吧8 小时前
相机Camera日志实例分析之五:相机Camx【萌拍闪光灯后置拍照】单帧流程日志详解
android·图像处理·数码相机
浩浩乎@8 小时前
【openGLES】安卓端EGL的使用
android
Kotlin上海用户组10 小时前
Koin vs. Hilt——最流行的 Android DI 框架全方位对比
android·架构·kotlin
zzq199610 小时前
Android framework 开发者模式下,如何修改动画过度模式
android
木叶丸10 小时前
Flutter 生命周期完全指南
android·flutter·ios