ToB企服应用市场:ToB评测及商务社交产业平台

标题: mysql备份恢复(mysqldump备份 mysqlbinlog恢复) [打印本页]

作者: 西河刘卡车医    时间: 2023-8-8 06:02
标题: mysql备份恢复(mysqldump备份 mysqlbinlog恢复)
mysql备份恢复(mysqldump备份 mysqlbinlog恢复)

一、备份的分类

二、常见的备份方法

三、mysql完全备份

四、数据库完全备份分类

4.1 物理备份/冷备份-tar (备份与恢复)

关闭MySQL数据库
使用tar命令直接打包数据库文件夹
直接替换现有MySQL目录即可
  1. 进入mysql 创建kings数据库
  2. create database kings;
  3. use kings;
  4. 创建tanks表
  5. tanks | CREATE TABLE `tanks` (
  6.   `id` int(10) NOT NULL AUTO_INCREMENT,
  7.   `name` varchar(100) NOT NULL,
  8.   `skills` varchar(100) NOT NULL,
  9.   `price` int(11) NOT NULL,
  10.   PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
  12. 插入数据
  13. insert into tanks(name,skills,price) values('猪八戒','像一个肉球一样弹',12888);
  14. select * from tanks;
  15. +----+-----------+--------------------------+-------+
  16. | id | name      | skills                   | price |
  17. +----+-----------+--------------------------+-------+
  18. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  19. +----+-----------+--------------------------+-------+
  20. 1 row in set (0.00 sec)
复制代码
  1. tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/
  2. cd /backup/
  3. ll
  4. 总用量 760
  5. -rw-r--r-- 1 root root 776114 8月   7 01:21 mysql_all-2023-08-07.tar.gz
复制代码
  1. mkdir /bak
  2. 将现有mysql的data 移走
  3. mv /usr/local/mysql/data/ /bak
  4. mkdir /restore
  5. 将备份文件解压到restore
  6. tar -zxf /backup/mysql_all-2023-08-07.tar.gz -C /restore/
  7. 将解压的备份文件data 移动到mysql中
  8. mv restore/usr/local/mysql/data/ /usr/local/mysql
复制代码
  1. mysql>use kings;
  2. mysql> show tables;
  3. +-----------------+
  4. | Tables_in_kings |
  5. +-----------------+
  6. | tanks           |
  7. +-----------------+
  8. 1 row in set (0.00 sec)
  9. mysql> select * from tanks;
  10. +----+-----------+--------------------------+-------+
  11. | id | name      | skills                   | price |
  12. +----+-----------+--------------------------+-------+
  13. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  14. +----+-----------+--------------------------+-------+
  15. 1 row in set (0.00 sec)
复制代码
4.2 逻辑备份/热备份-mysqldump备份

MySQL自带的备份工具,可方便实现对MySQL的备份
可以将指定的库、表导出为SQL脚本
mysqldump命令备份过程,实际上是把数据库、表,以SQL语句的形式,输出为文件的备份过程,这种方式称之为逻辑备份。
但是这种方式效率并不高,以SQL导出,在海量数据下,例如几十G的场景,备份、恢复的时间都会过长。
备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL),适用于中小型数据库。
mysqldump命令用于备份MySQL数据库
语法:
  1. mysqldump -u username -p password [option] database_name table_name > backup_file.sql
复制代码
常用参数:
  1. --all-databases:备份所有数据库。
  2. --single-transaction:在备份期间使用单个事务,确保数据的一致性(不停机备份)。
  3. --master-data:为1时在文件中生成change master语句,为2时也添加change master并注释。
  4. --delete-master-logs:在master上备份后删除其二进制日志。
  5. --flush-logs:切断日志,做一次日志轮转。
  6. --skip-lock-tables:备份时跳过锁定表,适用于大型数据库。
  7. --no-create-db:备份时不包含创建数据库语句。
  8. --no-create-info:备份时不包含创建表的语句。
  9. --no-data:备份时不包含数据。
  10. --add-drop-database:备份时在创建数据库之前添加DROP DATABASE语句。
  11. --add-drop-table:备份时在创建表之前添加DROP TABLE语句。
  12. --result-file=file_name:将备份结果输出到指定文件中。
  13. --compress:在备份过程中使用压缩。
复制代码
常用命令:
  1. mysqldump -u root -p --all-databses > all-data-$(date +%F).sql ###备份所有数据库
  2. mysqldump -u root -p -databases auth mysql > auth-mysql.sql ###备份auth和mysql库
  3. mysqldump -u root -p auth > auth-$(data +%F).sql ###备份auth数据库
  4. mysqldump -u root -p mysql user > mysql-user-$(date +%F).sql ###备份mysql的user表
  5. mysqldump -u root -p -d mysql user > /tmp/desc-mysql-user.sql ###备份mysql库user表的结构
  6. mysqldump -u root -p --all-databases --single-transaction --master-data=2 --flush-logs >/backup/`date +%F-%H`mysql_all.sql ###备份所有库,添加change master并注释,并切断日志
复制代码
对单个表备份
  1. mysql> show databases;
  2. +--------------------+
  3. | Database           |
  4. +--------------------+
  5. | information_schema |
  6. | kings              |
  7. | mysql              |
  8. | performance_schema |
  9. | test               |
  10. +--------------------+
  11. 5 rows in set (0.00 sec)
  12. [root@localhost ~]# mysqldump -u root -p kings  > /backup/kings-$(date +%F).sql
  13. Enter password:
  14. [root@localhost ~]# cd /backup/
  15. [root@localhost backup]# ls
  16. kings-2023-08-07.sql  mysql_all-2023-08-07.tar.gz
复制代码
对所有库进行备份
  1. [root@localhost ~]# mysqldump -u root -p --all-databases > /backup/all-$(date +%F).sql
  2. Enter password:
  3. [root@localhost ~]# cd /backup/
  4. [root@localhost backup]# ls
  5. all-2023-08-07.sql  kings-2023-08-07.sql  mysql_all-2023-08-07.tar.gz
复制代码
备份表
  1. [root@localhost backup]# mysqldump -u root -p kings tanks > /backup/kings.tanks-$(date +%F).sql
  2. [root@localhost backup]# ls
  3. all-2023-08-07.sql  kings-2023-08-07.sql  kings.tanks-2023-08-07.sql  mysql_all-2023-08-07.tar.gz
复制代码
4.2.1使用source命令恢复数据库

source命令【作用于mysql模式下】
使用source恢复数据库
模拟删除表 恢复表
  1. mysql> drop table tanks;
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql> show tables;
  4. Empty set (0.00 sec)
  5. mysql> source /backup/kings.tanks-2023-08-07.sql;
  6. Query OK, 0 rows affected (0.00 sec)
  7. Query OK, 0 rows affected (0.00 sec)
  8. ...
  9. mysql> show tables;
  10. +-----------------+
  11. | Tables_in_kings |
  12. +-----------------+
  13. | tanks           |
  14. +-----------------+
  15. 1 row in set (0.00 sec)
复制代码
4.2.2使用mysql命令恢复数据库

mysql命令【作用于于linux模式下】
模拟删表 恢复
  1. mysql> drop table tanks;
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql> show tables;
  4. Empty set (0.00 sec)
  5. kings为数据库名字 恢复导入表需要指定数据库!
  6. [root@localhost ~]# mysql -uroot -p kings < /backup/kings.tanks-2023-08-07.sql
  7. Enter password:
  8. mysql> show tables;
  9. +-----------------+
  10. | Tables_in_kings |
  11. +-----------------+
  12. | tanks           |
  13. +-----------------+
  14. 1 row in set (0.00 sec)
复制代码
五、二进制日志备份、恢复

mysqlbinlog工具来读取和分析binlog文件
语法:
  1. mysqlbinlog [options] logfile1 logfile2
复制代码
常用参数:
  1. --database=name,仅显示指定数据库的转储内容。
  2. --short-form,使用简单格式。
  3. --start-datetime=name,转储日志的起始时间。
  4. --stop-datetime=name,转储日志的截止时间。
  5. --start-position=#,转储日志的起始位置。
  6. --stop-position=#,转储日志的截止位置。
  7. --no-defaults:指定不加载或使用默认配置文件,以确保按照命令行参数指定的配置选项进行操作。
  8. --base64-output=decode-rows:将读取的二进制数据解码为可读格式,即将Base64编码的内容解码为原始数据。
  9. -v:输出详细信息,包括读取的日志事件和相关数据。
复制代码
常用命令:
  1. 查看日志
  2. mysqlbinlog --no-defaults --base64-output=decode-rows -v
  3. 恢复数据
  4. mysqlbinlog --stop-position=xxx [mysql-bin.0000xx] | mysql -uroot -p
  5. mysqlbinlog --start-position=xxx --stop-position=xxx [mysql-bin.0000xx] | mysql -uroot -p
  6. mysqlbinlog --start-datetime=xxx --stop-datetime=xxx [mysql-bin.0000xx] | mysql -uroot -p
复制代码
5.1基于position(位置点)备份

1.开启mysql服务器的二进制日志功能
  1. [root@localhost ~]# tail -15 /etc/my.cnf
  2. [mysqld]
  3. basedir = /usr/local/mysql
  4. datadir = /usr/local/mysql/data
  5. socket = /usr/local/mysql/mysql.sock
  6. port = 3306
  7. pid-file = /usr/local/mysql/mysql.pid
  8. user = mysql
  9. skip-name-resolve
  10. server-id = 1   // 设置服务器标识
  11. log-bin = /usr/local/mysql/mysql-bin  //开启二进制功能
  12. 查看日志文件
  13. [root@localhost ~]# ll /opt/data/
  14. -rw-r-----. 1 mysql mysql      154 2月  22 16:37 mysql_bin.000001
  15. -rw-r-----. 1 mysql mysql       19 2月  22 16:37 mysql_bin.index
复制代码
2.对数据库进行完全备份
  1. mysqldump -uroot -p --single-transation --master-data=2 --flush-logs --all-databases --delete-master-logs > /backup/all-`date +%F-%H`.sql
  2. 可以看到all-2023-08-07-16.sql已经创建
  3. [root@localhost backup]# ls
  4. all-2023-08-07-16.sql  kings-2023-08-07.sql        mysql_all-2023-08-07.tar.gz
  5. all-2023-08-07.sql     kings.tanks-2023-08-07.sql
复制代码
3.在数据数据库中增加类容
  1. mysql> select * from tanks;
  2. +----+-----------+--------------------------+-------+
  3. | id | name      | skills                   | price |
  4. +----+-----------+--------------------------+-------+
  5. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  6. +----+-----------+--------------------------+-------+
  7. 1 row in set (0.00 sec)
  8. mysql> insert into tanks(name,skills,price) values('钟馗','钩子英雄',12888);
  9. Query OK, 1 row affected (0.01 sec)
  10. mysql> select * from tanks;                                             
  11. +----+-----------+--------------------------+-------+
  12. | id | name      | skills                   | price |
  13. +----+-----------+--------------------------+-------+
  14. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  15. |  3 | 钟馗      | 钩子英雄                 | 12888 |
  16. +----+-----------+--------------------------+-------+
  17. 2 rows in set (0.00 sec)
复制代码
4.模拟删库
  1. mysql> drop database kings;
  2. Query OK, 1 row affected (0.01 sec)
  3. mysql> show databases;
  4. +--------------------+
  5. | Database           |
  6. +--------------------+
  7. | information_schema |
  8. | mysql              |
  9. | performance_schema |
  10. | test               |
  11. +--------------------+
  12. 4 rows in set (0.00 sec)
复制代码
5.刷新二进制文件
  1. [root@localhost mysql]# mysqladmin -uroot -p flush-logs
  2. [root@localhost mysql]# ls /usr/local/mysql/
  3. mysql-bin.000002  mysql-bin.000003  ...
复制代码
6.恢复完全备份
查看tanks表内容,可以发现备份之后修改的内容丢失
  1. [root@localhost mysql]# mysql -uroot -p < /backup/all-2023-08-07-16.sql
  2. Enter password:
  3. mysql> show databases;
  4. +--------------------+
  5. | Database           |
  6. +--------------------+
  7. | information_schema |
  8. | mysql              |
  9. | performance_schema |
  10. | test               |
  11. +--------------------+
  12. 4 rows in set (0.00 sec)
  13. mysql> show databases;
  14. +--------------------+
  15. | Database           |
  16. +--------------------+
  17. | information_schema |
  18. | kings              |
  19. | mysql              |
  20. | performance_schema |
  21. | test               |
  22. +--------------------+
  23. 5 rows in set (0.00 sec)
  24. mysql> use kings;
  25. Reading table information for completion of table and column names
  26. You can turn off this feature to get a quicker startup with -A
  27. Database changed
  28. mysql> show tables;
  29. +-----------------+
  30. | Tables_in_kings |
  31. +-----------------+
  32. | tanks           |
  33. +-----------------+
  34. 1 row in set (0.00 sec)
  35. mysql> select * from tanks;
  36. +----+-----------+--------------------------+-------+
  37. | id | name      | skills                   | price |
  38. +----+-----------+--------------------------+-------+
  39. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  40. +----+-----------+--------------------------+-------+
  41. 1 row in set (0.00 sec)
复制代码
7.查看binlog 日志,发现414为删库前,所以恢复到414
  1. mysql> show binlog events in 'mysql-bin.000002'\G
  2. *************************** 4. row ***************************
  3.    Log_name: mysql-bin.000002
  4.         Pos: 233
  5. Event_type: Query
  6.   Server_id: 1
  7. End_log_pos: 383
  8.        Info: use `kings`; insert into tanks(name,skills,price) values('钟馗','钩子英雄',12888)
  9. *************************** 5. row ***************************
  10.    Log_name: mysql-bin.000002
  11.         Pos: 383
  12. Event_type: Xid
  13.   Server_id: 1
  14. End_log_pos: 414
  15.        Info: COMMIT /* xid=965 */
  16. *************************** 6. row ***************************
  17.    Log_name: mysql-bin.000002
  18.         Pos: 414
  19. Event_type: Query
  20.   Server_id: 1
  21. End_log_pos: 509
  22.        Info: drop database kings
  23.       
  24. 恢复到删库前
  25. 退出mysql 执行mysqlbinlog --stop-position=
  26. [root@localhost ~]# mysqlbinlog --stop-position=414 /usr/local/mysql/mysql-bin.000003 | mysql -uroot -p
  27. Enter password:
  28. 进入mysql 查看tanks表
  29. mysql> select * from tanks;
  30. +----+-----------+--------------------------+-------+
  31. | id | name      | skills                   | price |
  32. +----+-----------+--------------------------+-------+
  33. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  34. |  3 | 钟馗      | 钩子英雄                 | 12888 |
  35. +----+-----------+--------------------------+-------+
  36. 2 rows in set (0.00 sec)
  37. 同理也可以恢复到插入'id=3'语句之前
复制代码
对二进制日志查询还可以用
  1. mysql> show binlog events in 'mysql-bin.000002';
  2. +------------------+-----+-------------+-----------+-------------+-----------------------------------------------------------------------------------------+
  3. | Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                                                    |
  4. +------------------+-----+-------------+-----------+-------------+-----------------------------------------------------------------------------------------+
  5. | mysql-bin.000023 |   4 | Format_desc |         1 |         120 | Server ver: 5.6.40-log, Binlog ver: 4                                                   |
  6. | mysql-bin.000023 | 120 | Query       |         1 |         201 | BEGIN                                                                                   |
  7. | mysql-bin.000023 | 201 | Intvar      |         1 |         233 | INSERT_ID=3                                                                             |
  8. | mysql-bin.000023 | 233 | Query       |         1 |         383 | use `kings`; insert into tanks(name,skills,price) values('钟馗','钩子英雄',12888)       |
  9. | mysql-bin.000023 | 383 | Xid         |         1 |         414 | COMMIT /* xid=965 */                                                                    |
  10. | mysql-bin.000023 | 414 | Query       |         1 |         509 | drop database kings                                                                     |
  11. | mysql-bin.000023 | 509 | Rotate      |         1 |         556 | mysql-bin.000024;pos=4                                                                  |
  12. +------------------+-----+-------------+-----------+-------------+-----------------------------------------------------------------------------------------+
  13. 7 rows in set (0.00 sec)
复制代码
5.2基于datetime(时间点)备份

1.删库 (之前添加的id=3 数据 这里不进行修改表了)
  1. mysql> select * from tanks;
  2. +----+-----------+--------------------------+-------+
  3. | id | name      | skills                   | price |
  4. +----+-----------+--------------------------+-------+
  5. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  6. |  3 | 钟馗      | 钩子英雄                 | 12888 |
  7. +----+-----------+--------------------------+-------+
  8. 2 rows in set (0.01 sec)
  9. Database changed
  10. mysql> drop database kings;
  11. Query OK, 1 row affected (0.00 sec)
复制代码
2.恢复完全备份 (因为之前有备份过就不需要进行mysqldump备份了,直接使用备份文件完全恢复就行)
  1. mysql -uroot -p  < /backup/all-2023-08-07-16.sql
复制代码
3.查看表 此时已经恢复到了完全备份的数据状态
  1. mysql> select * from tanks;
  2. +----+-----------+--------------------------+-------+
  3. | id | name      | skills                   | price |
  4. +----+-----------+--------------------------+-------+
  5. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  6. +----+-----------+--------------------------+-------+
  7. 1 row in set (0.01 sec)
复制代码
4.使用mysqlbinlog查询时间点
  1. [root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql_bin.000002
  2. 找到有关的信息
  3. # at 233
  4. #230807 17:01:37 server id 1  end_log_pos 233 CRC32 0xf9822b3a  Intvar
  5. SET INSERT_ID=3/*!*/;
  6. #230807 17:01:37 server id 1  end_log_pos 383 CRC32 0xc6524022  Query   thread_id=9     exec_time=0    error_code=0
  7. use `kings`/*!*/;
  8. SET TIMESTAMP=1691398897/*!*/;
  9. insert into tanks(name,skills,price) values('钟馗','钩子英雄',12888)
  10. /*!*/;
  11. # at 383
  12. #230807 17:01:37 server id 1  end_log_pos 414 CRC32 0x090e26df  Xid = 965
  13. COMMIT/*!*/;
  14. # at 414
  15. #230807 17:02:35 server id 1  end_log_pos 509 CRC32 0xd7c5718b  Query   thread_id=9     exec_time=0    error_code=0
  16. SET TIMESTAMP=1691398955/*!*/;
  17. drop database kings
  18. /*!*/;
复制代码
5.使用mysqlbinlog时间点恢复
  1. [root@localhost 3306]#  mysqlbinlog --no-defaults --start-datetime='2023-08-07 17:01:37' --stop-datetime='2023-08-07 17:02:35' /usr/local/mysql/mysql-bin.000023 | mysql -uroot -p
  2. mysql> select * from tanks;
  3. +----+-----------+--------------------------+-------+
  4. | id | name      | skills                   | price |
  5. +----+-----------+--------------------------+-------+
  6. |  2 | 猪八戒    | 像一个肉球一样弹         | 12888 |
  7. |  3 | 钟馗      | 钩子英雄                 | 12888 |
  8. +----+-----------+--------------------------+-------+
  9. 2 rows in set (0.00 sec)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4