当前位置: 首页 > news >正文

完全备份、增量备份、差异备份、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 ~]#

相关文章:

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

Top NSD DBA DAY06 案例1&#xff1a;完全备份与恢复案例2&#xff1a;增量备份与恢复案例3&#xff1a;差异备份与恢复案例4&#xff1a;binlog日志 1 案例1&#xff1a;完全备份与恢复 1.1 问题 练习物理备份与恢复练习mysqldump备份与恢复 1.2 方案 在数据库服务器192…...

Flutter实现Service + UI 全面跨平台

作者&#xff1a;Karl_wei 前言&#xff1a; Flutter作为跨平台的UI框架&#xff0c;其可行性已经被市场所认可。UI跨端后&#xff0c;我们自然会希望一些运行在终端的小服务也能跨端&#xff0c;特别是当这个小服务还涉及到一些 UI 的展示。 我们希望Flutter能承担这个角色&…...

微软商店的ubuntu 连不上网Temporary failure in name resolution

背景&#xff1a;win10 下载docker时需要wsl2&#xff0c;下了个微软商店的Ubuntu 。写这篇文章的原因是当时查了资料ubuntu的问题和微软下载的Ubuntu还是有一些区别&#xff0c;问题不好解决&#xff0c;故写此文。 问题&#xff1a;用命令ifconfig eth0 down后再执行ifconfi…...

“深入剖析JVM内部工作原理:解密Java虚拟机“

标题&#xff1a;深入剖析JVM内部工作原理&#xff1a;解密Java虚拟机 摘要&#xff1a; 本文将深入剖析Java虚拟机&#xff08;JVM&#xff09;的内部工作原理&#xff0c;包括类加载、运行时数据区、垃圾回收、即时编译等关键概念和机制。通过对JVM的解密&#xff0c;我们将…...

数据结构与算法基础

一、基本概念和术语 &#xff08;一&#xff09;数据元素、数据结构、抽象数据类型等概念 &#xff08;二&#xff09;算法设计的基本要求 &#xff08;三&#xff09;语句的频度和估算时间复杂度 二、线性表 &#xff08;一&#xff09;线性表的定义和基本操作 &#xff08…...

人工智能任务1-【NLP系列】句子嵌入的应用与多模型实现方式

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能任务1-【NLP系列】句子嵌入的应用与多模型实现方式。句子嵌入是将句子映射到一个固定维度的向量表示形式&#xff0c;它在自然语言处理&#xff08;NLP&#xff09;中有着广泛的应用。通过将句子转化为向量…...

【Java并发编程面试题(60道)】

toc Java并发编程面试题(60道) 基础 1.并行跟并发有什么区别&#xff1f; 从操作系统的角度来看&#xff0c;线程是CPU分配的最小单位。 并行就是同一时刻&#xff0c;两个线程都在执行。这就要求有两个CPU去分别执行两个线程。并发就是同一时刻&#xff0c;只有一个执行&…...

Python:逢七拍腿游戏

场景模拟&#xff1a; 通过在 for 循环中使用 continue 语句实现计算拍腿次数&#xff0c;即计算从1到100&#xff08;不包括100&#xff09;&#xff0c;一共有多少个尾数为7或7的倍数这样的游戏&#xff0c;代码如下&#xff1a; total 99 # 记…...

esp32C3 micropython oled 恐龙快跑游戏

目录 简介 效果展示 源代码 main.py ssd1306.py 实现思路 血量值 分数 恐龙 障碍物 得分与血量值的计算 简介 使用合宙esp32c3模块&#xff0c;基于micropython平台开发的一款oled小游戏&#xff0c;恐龙快跑&#xff0c;所有代码已经给出&#xff0c;将两个py文件…...

53.Linux day03 文件查看命令,vi/vim常用命令

今天进行了新的学习。 目录 1.cat a.查看单个文件的内容&#xff1a; b.查看多个文件的内容&#xff1a; c.将多个文件的内容连接并输出到一个新文件&#xff1a; d.显示带有行号的文件内容&#xff1a; 2.more 3.less 4.head 5.tail 6.命令模式 7.插入模式 8.图…...

YOLOv8改进后效果

数据集 自建铁路障碍数据集-包含路障&#xff0c;人等少数标签。其中百分之八十作为训练集&#xff0c;百分之二十作为测试集 第一次部署 版本&#xff1a;YOLOv5 训练50epoch后精度可达0.94 mAP可达0.95.此时未包含任何改进操作 第二次部署 版本&#xff1a;YOLOv8改进版本 首…...

小程序的数据绑定和事件绑定

小程序的数据绑定 1.需要渲染的数据放在index.js中的data里 Page({data: {info:HELLO WORLD,imgSrc:/images/1.jpg,randomNum:Math.random()*10,randomNum1:Math.random().toFixed(2)}, }) 2.在WXML中通过{{}}获取数据 <view>{{info}}</view><image src"{{…...

第四章MyBatis核心配置文件

environments与environment标签 environments主要用来配置环境&#xff0c;属性default表示默认环境&#xff0c;值为environment的idenvironment为具体环境&#xff0c;属性id表示环境唯一标识environments可以有多个environment 加载默认环境 sqlSessionFactory sqlSessi…...

⛳ Docker - Centos 安装配置

目录 ⛳ Docker - Centos 安装配置&#x1f3ed; Docker 安装&#xff1a;&#x1f4e2; 一、安装依赖包&#x1f4ac; 二、添加 Docker 下载源地址&#x1f43e; 三、更新yum缓存&#x1f463; 四、安装Docker&#x1f4bb; 五、启动Docker&#x1f381; 六、查看Docker状态和…...

Python web实战之Django 的跨站点请求伪造(CSRF)保护详解

关键词&#xff1a;Python、Web、Django、跨站请求伪造、CSRF 大家好&#xff0c;今天我将分享web关于安全的话题&#xff1a;Django 的跨站点请求伪造&#xff08;CSRF&#xff09;保护&#xff0c;介绍 CSRF 的概念、原理和保护方法. 1. CSRF 是什么&#xff1f; CSRF&#…...

ARM(汇编指令)

.global _start _start:/*mov r0,#0x5mov r1,#0x6 bl LoopLoop:cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0mov pc,lr*/ mov r0,#0x1mov r1,#0x0mov r2,#0x64bl Loop Loop:cmp r0,r2bhi stopadd r1,r1,r0add r0,r0,#0x01mov pc,lr stop:B stop.end...

神经网络基础-神经网络补充概念-01-二分分类

概念 二分分类是一种常见的机器学习任务&#xff0c;其目标是将一组数据点分成两个不同的类别。在二分分类中&#xff0c;每个数据点都有一个与之关联的标签&#xff0c;通常是“正类”或“负类”。算法的任务是根据数据点的特征来学习一个模型&#xff0c;以便能够准确地将新…...

Linux16(1) 线程同步

目录 1、概念 2、线程的实现&#xff1a; 3、线程同步&#xff1a; 4、使用信号量&#xff1a; 5、使用信号量实现进程同步&#xff1a; 6、使用互斥锁 7、使用互斥锁实现线程同步 8、读写锁 9、使用读写锁 10、使用读写锁实现进程同步 1、概念 线程&#xff1a;进程…...

深入探讨lowess算法:纯C++实现与局部加权多项式回归的数据平滑技术

引言 在统计学和数据科学中&#xff0c;有时我们面对的数据是嘈杂的、充满噪声的。为了更好地揭示数据的潜在趋势和结构&#xff0c;数据平滑技术成为了一个重要工具。lowess或称为局部加权多项式回归是其中的一种流行方法&#xff0c;它对每一个点给予一个权重&#xff0c;根…...

Sui安全篇|详解零知识证明 (ZKP) Groth16的可塑性

Sui Move允许用户使用Groth16进行高效验证任何非确定性多项式时间&#xff08;Non-deterministic Polynomial time &#xff0c;NP&#xff09;状态。Groth16是一种高效且广泛使用的零知识简洁非交互知识证明&#xff08;Zero-Knowledge Succinct Non-interactive Argument of …...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...