完全备份、增量备份、差异备份、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 ~]# mkdir /bakdir 创建备份目录
  3. [root@mysql50 ~]# cp -r /var/lib/mysql /bakdir/mysql.bak 拷贝数据源文件
  4. [root@mysql50 ~]# cd /var/lib/mysql
  5. [root@mysql50 mysql]# tar -zcvf /bakdir/mysql.tar.gz ./* 打包压缩数据源文件
  6. [root@mysql50 mysql]# ls /bakdir/ 查看备份文件
  7. mysql.bak mysql.tar.gz

删除数据

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

恢复数据

  1. [root@mysql50 ~]# tar -xf /bakdir/mysql.tar.gz -C /var/lib/mysql/
  2. [root@mysql50 ~]# systemctl start mysqld
  3. [root@mysql50 ~]# mysql -uroot -pNSD2023...a
  4. mysql> show databases;
  5. +--------------------+
  6. | Database |
  7. +--------------------+
  8. | GAMEDB |
  9. | db1 |
  10. | home |
  11. | information_schema |
  12. | mysql |
  13. | performance_schema |
  14. | studb |
  15. | sys |
  16. | tarena |
  17. | 学生库 |
  18. +--------------------+
  19. 10 rows in set (0.00 sec)

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

  1. [root@mysql50 ~]# systemctl stop mysqld
  2. [root@mysql50 ~]# rm -rf /var/lib/mysql/*
  3. [root@mysql50 ~]# cp -r /bakdir/mysql.bak/* /var/lib/mysql/
  4. [root@mysql50 ~]# chown -R mysql:mysql /var/lib/mysql
  5. [root@mysql50 ~]# systemctl start mysqld
  6. [root@mysql50 ~]# mysql -uroot -pNSD2023...a

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

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

  1. //备份1张表
  2. [root@mysql50 ~]# mysqldump -uroot -pNSD2023...a tarena salary > /bakdir/tarena_salary.sql
  3. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  4. //备份多张表
  5. [root@mysql50 ~]# mysqldump -uroot -pNSD2023...a tarena employees departments > /bakdir/tarena_employees_deparments.sql
  6. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  7. //备份1个库
  8. [root@mysql50 ~]# mysqldump -uroot -pNSD2023...a -B tarena > /bakdir/tarena.sql
  9. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  10. //备份多个库
  11. [root@mysql50 ~]# mysqldump -uroot -pNSD2023...a -B studb db1 > /bakdir/studb_db1.sql
  12. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  13. //备份所有库
  14. [root@mysql50 ~]# mysqldump -uroot -pNSD2023...a -A > /bakdir/allbak.sql
  15. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  16. [root@mysql50 ~]#

恢复数据(覆盖恢复数据)

  1. [root@mysql50 ~]# mysql -uroot -pNSD2023...a
  2. mysql> drop database tarena; //删除库
  3. Query OK, 6 rows affected (0.57 sec)
  4. mysql> exit
  5. Bye
  6. [root@mysql50 ~]# mysql -uroot -pNSD2023...a < /bakdir/tarena.sql //恢复数据
  7. mysql: [Warning] Using a password on the command line interface can be insecure.
  8. [root@mysql50 ~]# mysql -uroot -pNSD2023...a //登陆
  9. mysql> use tarena; //进库
  10. mysql> show tables; //看表
  11. +------------------+
  12. | Tables_in_tarena |
  13. +------------------+
  14. | departments |
  15. | employees |
  16. | salary |
  17. | stu4 |
  18. | user |
  19. | wage_grade |
  20. +------------------+
  21. 6 rows in set (0.00 sec)
  22. mysql> delete from salary; //删除表记录
  23. Query OK, 8055 rows affected (0.11 sec)
  24. mysql> exit
  25. Bye
  26. [root@mysql50 ~]#
  27. //使用备份文件恢复数据
  28. [root@mysql50 ~]# mysql -uroot -pNSD2023...a tarena < /bakdir/tarena_salary.sql
  29. mysql: [Warning] Using a password on the command line interface can be insecure.
  30. [root@mysql50 ~]# mysql -uroot -pNSD2023...a //登陆服务
  31. mysql> select count(*) from tarena.salary; //查看行数
  32. +----------+
  33. | count(*) |
  34. +----------+
  35. | 8055 |
  36. +----------+
  37. 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. //安装依赖
  4. [root@host50 ~]# yum -y install perl-DBD-MySQL
  5. //解压源码
  6. [root@host50 ~ ]# tar -xf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal.tar.gz
  7. //移动并改名
  8. [root@host50 ~ ]# mv percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.12-minimal /usr/local/percona
  9. //把命令添加到系统环境变量
  10. [root@host50 ~ ]# vim /etc/bashrc
  11. export PATH=/usr/local/percona/bin:$PATH 添加在文件末尾
  12. :wq
  13. [root@host50 ~ ]# source /etc/bashrc
  14. //查看帮助信息
  15. [root@host50 ~ ]# man xtrabackup (按q 退出)

增量备份(在mysql50主机 完成增量备份练习)

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

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

 
  1. [root@mysql50 ~]# xtrabackup --host=127.0.0.1 --user=root --password=NSD2023...a --backup --target-dir=/fullbak --datadir=/var/lib/mysql
  2. ……
  3. ……
  4. 230530 18:18:48 [00] ...done
  5. xtrabackup: Transaction log of lsn (24822878) to (24822898) was copied.
  6. 230530 18:18:50 completed OK!
  7. [root@mysql50 ~]#
  8. //插入新数据 (可以插入多行)
  9. 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. ……
  4. 230530 18:33:52 [00] ...done
  5. xtrabackup: Transaction log of lsn (24827173) to (24827183) was copied.
  6. 230530 18:33:53 completed OK!
  7. [root@mysql50 ~]#
  8. //插入新数据 (可以插入多行)
  9. 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. ……
  4. 230530 18:46:17 [00] ...done
  5. xtrabackup: Transaction log of lsn (24832526) to (24832536) was copied.
  6. 230530 18:46:18 completed OK!
  7. [root@mysql50 ~]#
  8. //插入新数据 (可以插入多行)
  9. 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. ……
  4. 230530 18:53:41 [00] ...done
  5. xtrabackup: Transaction log of lsn (24837561) to (24837571) was copied.
  6. 230530 18:53:42 completed OK!
  7. [root@mysql50 ~]#
  8. //插入新数据 (可以插入多行)
  9. 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. ……
  4. 230530 18:58:50 [00] ...done
  5. xtrabackup: Transaction log of lsn (24841645) to (24841655) was copied.
  6. 230530 18:58:51 completed OK!
  7. [root@mysql50 ~]#
  8. //插入新数据 (可以插入多行)
  9. 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. ……
  4. 230530 19:00:55 [00] ...done
  5. xtrabackup: Transaction log of lsn (24848404) to (24848414) was copied.
  6. 230530 19:00:56 completed OK!
  7. [root@mysql50 ~]#
  8. //插入新数据 (可以插入多行)
  9. 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. ……
  4. 230530 19:00:55 [00] ...done
  5. xtrabackup: Transaction log of lsn (24848404) to (24848414) was copied.
  6. 230530 19:00:56 completed OK!
  7. [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:/new2 /
  3. [root@mysql50 ~]# scp –r root@192.168.88.50:/new3 /
  4. [root@mysql50 ~]# scp –r root@192.168.88.50:/new4 /
  5. [root@mysql50 ~]# scp –r root@192.168.88.50:/new5 /
  6. [root@mysql50 ~]# scp –r root@192.168.88.50:/new6 /
  7. [root@mysql50 ~]# scp –r root@192.168.88.50:/new7 /

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

1)、准备恢复数据

 
  1. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak
  2. ……
  3. ……
  4. Log background threads are being closed...
  5. Shutdown completed; log sequence number 24822898
  6. Number of pools: 1
  7. 230531 14:32:14 completed OK!
  8. [root@mysql51 ~]#

2)、合并数据

 
  1. //将周二的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是周一 + 周二 的数据
  2. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new2
  3. ……
  4. ……
  5. 230531 14:40:05 [00] Copying /new2/binlog.index to ./binlog.index
  6. 230531 14:40:05 [00] ...done
  7. 230531 14:40:05 completed OK!
  8. [root@mysql51 ~]#
  9. //将周三的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是周一 + 周二 + 周三 的数据
  10. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new3
  11. ……
  12. ……
  13. 230531 15:00:37 [00] Copying /new3/binlog.index to ./binlog.index
  14. 230531 15:00:37 [00] ...done
  15. 230531 15:00:37 completed OK!
  16. [root@mysql51 ~]#
  17. //将周四的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是周一 + 周二 + 周三 +周四的数据
  18. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new4
  19. ……
  20. ……
  21. 230531 15:00:37 [00] Copying /new4/binlog.index to ./binlog.index
  22. 230531 15:00:37 [00] ...done
  23. 230531 15:00:37 completed OK!
  24. [root@mysql51 ~]#
  25. //将周五的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是周一 + 周二 + 周三 +周四+周五的数据
  26. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new5
  27. ……
  28. ……
  29. 230531 15:00:37 [00] Copying /new5/binlog.index to ./binlog.index
  30. 230531 15:00:37 [00] ...done
  31. 230531 15:00:37 completed OK!
  32. [root@mysql51 ~]#
  33. //将周六的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是周一 + 周二 + 周三 +周四+周五+周六的数据
  34. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new6
  35. ……
  36. ……
  37. 230531 15:00:37 [00] Copying /new6/binlog.index to ./binlog.index
  38. 230531 15:00:37 [00] ...done
  39. 230531 15:00:37 completed OK!
  40. [root@mysql51 ~]#
  41. //将周日的增量数据拷贝到周一备份目录里,合并后周一的目录里存放的是周一 + 周二 + 周三 +周四+周五+周六+周日的数据
  42. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/fullbak --incremental-dir=/new7
  43. ……
  44. ……
  45. 230531 15:00:37 [00] Copying /new7/binlog.index to ./binlog.index
  46. 230531 15:00:37 [00] ...done
  47. 230531 15:00:37 completed OK!
  48. [root@mysql51 ~]#
  49. [root@mysql51 ~]# rm -rf /var/lib/mysql/*
  50. [root@mysql51 ~]# xtrabackup --copy-back --target-dir=/fullbak
  51. [root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql

6)重启数据库服务

 
  1. [root@mysql51 ~]# systemctl restart mysqld

7)连接服务查看数据

 
  1. [root@mysql51 ~]# mysql -uroot -pNSD2023...a
  2. mysql> select count(*) from tarena.salary where date=20230710;
  3. +----------+
  4. | count(*) |
  5. +----------+
  6. | 75 |
  7. +----------+
  8. 1 row in set (0.01 sec)
  9. mysql> select count(*) from tarena.salary where not date=20230710;
  10. +----------+
  11. | count(*) |
  12. +----------+
  13. | 8067 |
  14. +----------+
  15. 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. ……
  5. 230531 17:10:02 [00] Writing /allbak/xtrabackup_info
  6. 230531 17:10:02 [00] ...done
  7. xtrabackup: Transaction log of lsn (24881353) to (24881373) was copied.
  8. 230531 17:10:03 completed OK!
  9. [root@mysql50 ~]#
  10. //插入新数据 (可以插入多行)
  11. 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. ……
  4. 230531 17:23:56 [00] Writing /dir2/xtrabackup_info
  5. 230531 17:23:56 [00] ...done
  6. xtrabackup: Transaction log of lsn (24886741) to (24886751) was copied.
  7. 230531 17:23:58 completed OK!
  8. [root@mysql50 ~]#
  9. //插入新数据 (可以插入多行)
  10. 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. ……
  4. 230531 17:27:10 [00] Writing /dir3/xtrabackup_info
  5. 230531 17:27:10 [00] ...done
  6. xtrabackup: Transaction log of lsn (24892043) to (24892063) was copied.
  7. 230531 17:27:11 completed OK!
  8. [root@mysql50 ~]#
  9. //插入新数据 (可以插入多行)
  10. 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. ……
  4. 230531 17:31:00 [00] Writing /dir4/xtrabackup_info
  5. 230531 17:31:00 [00] ...done
  6. xtrabackup: Transaction log of lsn (24900560) to (24900580) was copied.
  7. 230531 17:31:01 completed OK!
  8. [root@mysql50 ~]#
  9. //插入新数据 (可以插入多行)
  10. 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. ……
  4. 230531 17:32:38 [00] Writing /dir5/xtrabackup_info
  5. 230531 17:32:38 [00] ...done
  6. xtrabackup: Transaction log of lsn (24906902) to (24906912) was copied.
  7. 230531 17:32:39 completed OK!
  8. [root@mysql50 ~]#
  9. //插入新数据 (可以插入多行)
  10. 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. ……
  4. 230531 17:41:01 [00] Writing /dir6/xtrabackup_info
  5. 230531 17:41:01 [00] ...done
  6. xtrabackup: Transaction log of lsn (24914729) to (24914739) was copied.
  7. 230531 17:41:02 completed OK!
  8. [root@mysql50 ~]#
  9. //插入新数据 (可以插入多行)
  10. 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. ……
  4. 230531 17:43:16 [00] Writing /dir7/xtrabackup_info
  5. 230531 17:43:16 [00] ...done
  6. xtrabackup: Transaction log of lsn (24920772) to (24920782) was copied.
  7. 230531 17:43:17 completed OK!
  8. [root@mysql50 ~]#

步骤二:练习差异恢复

差异恢复数据步骤:

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

具体操作如下:

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

 
  1. [root@mysql51 ~]# scp –r root@192.168.88.50:/allbak /
  2. [root@mysql51 ~]# scp –r root@192.168.88.50:/dir7 /

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

1)、准备恢复数据

 
  1. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/allbak
  2. ……
  3. ……
  4. Log background threads are being closed...
  5. Shutdown completed; log sequence number 24881373
  6. Number of pools: 1
  7. 230531 17:59:06 completed OK!
  8. [root@mysql51 ~]#

2)、合并数据

 
  1. //将周日的差异备份与周一的完全备份合并,因为周日的差异备份包扩周二+周日的所有数据
  2. [root@mysql51 ~]# xtrabackup --prepare --apply-log-only --target-dir=/allbak --incremental-dir=/dir7
  3. ……
  4. ……
  5. 230531 18:05:08 [00] Copying /dir7/binlog.000029 to ./binlog.000029
  6. 230531 18:05:08 [00] ...done
  7. 230531 18:05:08 [00] Copying /dir7/binlog.index to ./binlog.index
  8. 230531 18:05:08 [00] ...done
  9. 230531 18:05:08 completed OK!
  10. [root@mysql51 ~]#
  11. [root@mysql51 ~]# rm -rf /var/lib/mysql/*
  12. [root@mysql51 ~]# xtrabackup --copy-back --target-dir=/allbak
  13. [root@mysql51 ~]# chown -R mysql:mysql /var/lib/mysql

6)重启数据库服务

 
  1. [root@mysql51 ~]# systemctl restart mysqld

7)连接服务查看数据

 
  1. [root@mysql51 ~]# mysql -uroot -pNSD2023...a
  2. mysql> select count(*) from tarena.salary where date=20230810;
  3. +----------+
  4. | count(*) |
  5. +----------+
  6. | 75 |
  7. +----------+
  8. 1 row in set (0.01 sec)
  9. mysql> select count(*) from tarena.salary where not date=20230810;
  10. +----------+
  11. | count(*) |
  12. +----------+
  13. | 8067 |
  14. +----------+
  15. 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 ~]# systemctl start mysqld 启动服务
  3. [root@mysql52 ~]# mysql 连接服务
  4. mysql> show master status; 查看日志文件
  5. +----------------+----------+--------------+------------------+-------------------+
  6. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  7. +----------------+----------+--------------+------------------+-------------------+
  8. | binlog.000001 | 156 | | | |
  9. +----------------+----------+--------------+------------------+-------------------+
  10. 1 row in set (0.00 sec)
  11. 执行查询命令
  12. mysql> select count(*) from mysql.user;
  13. +----------+
  14. | count(*) |
  15. +----------+
  16. | 4 |
  17. +----------+
  18. 1 row in set (0.00 sec)
  19. mysql> show master status; 执行查询命令 日志偏移量不变
  20. +----------------+----------+--------------+------------------+-------------------+
  21. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  22. +----------------+----------+--------------+------------------+-------------------+
  23. | binlog.000001 | 156 | | | |
  24. +----------------+----------+--------------+------------------+-------------------+
  25. 1 row in set (0.00 sec)
  26. 执行建库、建表命令
  27. mysql> create database db1;
  28. Query OK, 1 row affected (0.07 sec)
  29. mysql> create table db1.user(name char(10));
  30. Query OK, 0 rows affected (0.52 sec)
  31. mysql> show master status; 执行写命令 日志偏移量改变
  32. +----------------+----------+--------------+------------------+-------------------+
  33. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  34. +----------------+----------+--------------+------------------+-------------------+
  35. | binlog.000001 | 535 | | | |
  36. +----------------+----------+--------------+------------------+-------------------+
  37. 1 row in set (0.00 sec)
  38. mysql> insert into db1.user values("jim"); 插入记录
  39. Query OK, 1 row affected (0.10 sec)
  40. mysql> show master status; 执行写命令 日志偏移量改变
  41. +----------------+----------+--------------+------------------+-------------------+
  42. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  43. +----------------+----------+--------------+------------------+-------------------+
  44. | binlog.000001 | 809 | | | |
  45. +----------------+----------+--------------+------------------+-------------------+
  46. 1 row in set (0.00 sec)
  47. mysql>

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

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

 
  1. [root@mysql52 ~]# vim /etc/my.cnf.d/mysql-server.cnf
  2. [mysqld]
  3. log-bin=/mylog/mysql52 //定义日志目录和日志文件名(手动添加)
  4. :wq
  5. [root@mysql52 ~]# mkdir /mylog 创建目录
  6. [root@mysql52 ~]# chown mysql /mylog 修改目录所有者mysql用户
  7. [root@mysql52 ~]# setenforce 0 关闭selinux
  8. [root@mysql52 ~]# systemctl restart mysqld 重启服务
  9. [root@mysql52 ~]# ls /mylog/ 查看日志目录
  10. mysql52.000001 mysql52.index
  11. [root@mysql52 ~]# mysql 登陆服务
  12. Mysql> show master status ; 查看日志信息
  13. +----------------+----------+--------------+------------------+-------------------+
  14. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  15. +----------------+----------+--------------+------------------+-------------------+
  16. | mysql52.000001 | 156 | | | |
  17. +----------------+----------+--------------+------------------+-------------------+

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

默认日志文件容量大于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. [root@mysql52 ~]# mysql 连接服务
  23. Mysql> show master status; 查看日志
  24. +----------------+----------+--------------+------------------+-------------------+
  25. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  26. +----------------+----------+--------------+------------------+-------------------+
  27. | mysql52.000004 | 156 | | | |
  28. +----------------+----------+--------------+------------------+-------------------+
  29. [root@mysql52 ~]#
  30. //完全备份后创建新的日志文件,创建的日志个数和备份库的个数一致
  31. [root@mysql52 ~]# mysqldump --flush-logs mysql user > user.sql
  32. [root@mysql52 ~]# mysql -e 'show master status'
  33. +----------------+----------+--------------+------------------+-------------------+
  34. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  35. +----------------+----------+--------------+------------------+-------------------+
  36. | mysql52.000005 | 156 | | | |
  37. +----------------+----------+--------------+------------------+-------------------+
  38. [root@mysql52 ~]# mysqldump --flush-logs -B mysql db1 > db_2.sql
  39. [root@mysql52 ~]# mysql -e 'show master status'
  40. +----------------+----------+--------------+------------------+-------------------+
  41. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  42. +----------------+----------+--------------+------------------+-------------------+
  43. | mysql52.000007 | 156 | | | |
  44. +----------------+----------+--------------+------------------+-------------------+
  45. [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. The authenticity of host '192.168.88.50 (192.168.88.50)' can't be established.
  39. ECDSA key fingerprint is SHA256:t7J3okFd0o+9zTmFCIetvDl6mxGCmc43VoD6C65zico.
  40. Are you sure you want to continue connecting (yes/no/[fingerprint])? Yes 同意
  41. Warning: Permanently added '192.168.88.50' (ECDSA) to the list of known hosts.
  42. root@192.168.88.50's password: mysql50的密码
  43. mysql52.000001 100% 1410 1.6MB/s 00:00
  44. [root@mysql52 ~]#

2)在MySQL50 使用日志恢复数据

 
  1. //查看日志
  2. [root@mysql50 ~]# ls /root/mysql52.000001
  3. /root/mysql52.000001
  4. //执行日志恢复数据
  5. [root@mysql50 ~]# mysqlbinlog /root/mysql52.000001 | mysql -uroot -pNSD2023...a
  6. mysql: [Warning] Using a password on the command line interface can be insecure.
  7. //连接服务查看数据
  8. [root@mysql50 ~]# mysql -uroot -pNSD2023...a -e 'select * from gamedb.t1'
  9. mysql: [Warning] Using a password on the command line interface can be insecure.
  10. +------+-------+
  11. | name | class |
  12. +------+-------+
  13. | yaya | nsd |
  14. | yaya | nsd |
  15. | yaya | nsd |
  16. +------+-------+
  17. [root@mysql50 ~]#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问AI一个严肃的问题

chatgpt的问世再一次掀起了AI的浪潮&#xff0c;其实我一直在想&#xff0c;AI和人类的关系未来会怎样发展&#xff0c;我们未来会怎样和AI相处&#xff0c;AI真的会完全取代人类吗&#xff0c;带着这个问题&#xff0c;我问了下chatgpt&#xff0c;看一看它是怎么看待这个问题…

Modbus工业RFID设备在自动化生产线中的应用

传统半自动化生产线在运作的过程&#xff0c;因为技工的熟练程度&#xff0c;专业素养的不同&#xff0c;在制造过程中过多的人为干预&#xff0c;工厂将很难对每条生产线的产能进行标准化管理和优化。如果半自动化生产线系统是通过前道工序的作业结果和检测结果来决定产品在下…

react实现模拟弹框遮罩的自定义hook

需求描述 点击按钮用于检测鼠标是否命中按钮 代码实现 import React from react; import {useState, useEffect, useRef} from react;// 封装一个hook用来检测当前点击事件是否在某个元素之外 function useClickOutSide(ref,cb) {useEffect(()>{const handleClickOutside…

JMeter接口自动化测试实例—JMeter引用javaScript

Jmeter提供了JSR223 PreProcessor前置处理器&#xff0c;通过该工具融合了Java 8 Nashorn 脚本引擎&#xff0c;可以执行js脚本以便对脚本进行前置处理。其中比较典型的应用就是通过执行js脚本对前端数据进行rsa加密&#xff0c;如登录密码加密。但在这里我就简单的应用javaScr…

PyTorch翻译官网教程-NLP FROM SCRATCH: GENERATING NAMES WITH A CHARACTER-LEVEL RNN

官网链接 NLP From Scratch: Generating Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用字符级RNN生成名字 这是我们关于“NLP From Scratch”的三篇教程中的第二篇。在第一个教程中</intermediate/char_rnn_classification_tutor…

ChatGPT爆火,会给教育带来什么样的影响或者冲击?

近来&#xff0c;人工智能聊天机器人ChatGPT连上热搜&#xff0c;火爆全网。ChatGPT拥有强大的信息整合能力、自然语言处理能力&#xff0c;可谓是“上知天文&#xff0c;下知地理”&#xff0c;而且还能根据要求进行聊天、撰写文章等。 ChatGPT一经推出&#xff0c;便迅速在社…

stop job is running for Advanced key-value store

今天虚拟机磁盘撑满了&#xff0c;本来还能凑合运行&#xff0c;结果重启了下&#xff0c;就报了这个 stop job is running for Advanced key-value store (1min 59s / no limit) 解决方式很简单&#xff0c; 1、虚拟机关电源&#xff0c;任务管理器&#xff0c;关闭VM&#x…

OpenCV-Python中的图像处理-图像直方图

OpenCV-Python中的图像处理-图像直方图 图像直方图统计直方图绘制直方图Matplotlib绘制灰度直方图Matplotlib绘制RGB直方图 使用掩膜统计直方图直方图均衡化Numpy图像直方图均衡化OpenCV中的直方图均衡化CLAHE 有限对比适应性直方图均衡化 2D直方图OpenCV中的2D直方图Numpy中2D…

当Visual Studio遇到 “当前不会命中断点.还没有为该文档加载任何符号“的情况

1.配置项目调试路径&#xff1a; 2.问题解决方案&#xff1a; VS配置调试路径不是默认路径时&#xff0c;需要看生成的文件是否在配置路径内&#xff0c;如果不在的话&#xff0c;可能发生"当前不会命中断点.还没有为该文档加载任何符号"的情况&#xff1b; 右键项…

Kotlin语法

整理关键语法列表如下&#xff1a; https://developer.android.com/kotlin/interop?hlzh-cn官方指导链接 语法形式 说明 println("count ${countnum}")字符串里取值运算 val count 2 var sum 0 类型自动推导 val 定义只读变量&#xff0c;优先 var定义可变变量…

计算机竞赛 python+opencv+深度学习实现二维码识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; pythonopencv深度学习实现二维码识别 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 该项目较为新颖&…

HotSpot虚拟机之字节码执行引擎

目录 一、栈帧 1. 栈帧结构 2. 基于栈的解释执行过程 二、方法调用 1. 方法调用指令 2. 分派 三、动态类型语言 四、参考资料 一、栈帧 1. 栈帧结构 栈帧是Java虚拟机栈进行方法调用和执行的数据结构&#xff0c;是方法最基本的执行单元&#xff0c;是栈的元素。一个栈…

【环境配置】Windows10终端和VSCode下能够直接打开Anaconda-Prompt

很多小伙伴在 Windows 下做深度学习开发的时候&#xff0c;遇到终端没有在 Linux 那么方便&#xff0c;那么我们现在就可以来设置一下&#xff1b;这样我们也可以在文件夹内部右键打开终端&#xff0c;也可以在 VS Code 里面新建一个虚拟环境的控制台&#xff1b;这里主要是针对…

佛祖保佑,永不宕机,永无bug

当我们的程序编译通过&#xff0c;能预防的bug也都预防了&#xff0c;其它的就只能交给天意了。当然请求佛祖的保佑也是必不可少的。 下面是一些常用的保佑图&#xff1a; 佛祖保佑图 ——————————————————————————————————————————…

【c语言】动态内存管理(超详细)

他治愈了身边所有人&#xff0c;唯独没有治愈他自己—超脱 csdn上的朋友你们好呀&#xff01;&#xff01;今天给大家分享的是动态内存管理 &#x1f440;为什么存在动态内存分配 我们定义的局部变量在栈区创建 int n 4;//在栈上开辟4个字节大小int arr[10] { 0 };//在栈上开…

Android Socket使用TCP协议实现手机投屏

本节主要通过实战来了解Socket在TCP/IP协议中充当的是一个什么角色&#xff0c;有什么作用。通过Socket使用TCP协议实现局域网内手机A充当服务端&#xff0c;手机B充当客户端&#xff0c;手机B连接手机A&#xff0c;手机A获取屏幕数据转化为Bitmap&#xff0c;通过Socket传递个…

Excel设置某列或者某行不某行不可以编辑,只读属性

设置单元格只读的三种方式: 1、通过单元格只读按钮&#xff0c;设置为只为 设置行或者列的只读属性&#xff0c;可以设置整行或者整列只读 2、设置单元格编辑控件为标签控件(标签控件不可编辑) 3、通过锁定行&#xff0c;锁定行的修改。锁定的行与只读行的区别在于锁定的行不…

openGauss学习笔记-40 openGauss 高级数据管理-锁

文章目录 openGauss学习笔记-40 openGauss 高级数据管理-锁40.1 语法格式40.2 参数说明40.3 示例 openGauss学习笔记-40 openGauss 高级数据管理-锁 如果需要保持数据库数据的一致性&#xff0c;可以使用LOCK TABLE来阻止其他用户修改表。 例如&#xff0c;一个应用需要保证表…

GPT垂直领域相关模型 现有的开源领域大模型

对于ToC端来说&#xff0c;广大群众的口味已经被ChatGPT给养叼了&#xff0c;市场基本上被ChatGPT吃的干干净净。虽然国内大厂在紧追不舍&#xff0c;但目前绝大多数都还在实行内测机制&#xff0c;大概率是不会广泛开放的&#xff08;毕竟&#xff0c;各大厂还是主盯ToB、ToG市…

视频集中存储安防监控平台EasyCVR优化AI硬件接入时的通道显示异常问题

安防视频监控平台视频集中存储EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 安防监控视频云存储平台EasyCVR既具…