翼度科技»论坛 编程开发 mysql 查看内容

mysql备份恢复(mysqldump备份 mysqlbinlog恢复)

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
mysql备份恢复(mysqldump备份 mysqlbinlog恢复)

一、备份的分类


  • 物理备份
    ​        物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)

    • 冷备份(脱机备份) :是在关闭数据库的时候进行的
    • 热备份(联机备份) :数据库处于运行状态,依赖于数据库的日志文件
    • 温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作

  • 逻辑备份
    逻辑备份:对数据库逻辑组件(如: 表等数据库对象)的备份
    从数据库的备份策略角度,备份可分为

    • 完全备份:每次对数据进行完整的备份
    • 差异备份:差异备份是指在一次全备份后到进行差异备份的这段时间内,对那些增加或者修改文件的备份。在进行恢复时,我们只需对第一次全备份和最后一次差异备份进行恢复。
    • 增量备份:增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加和者被修改的文件。这就意味着,第一次增量备份的对象是进行全备后所产生的增加和修改的文件;第二次增量备份的对象是进行第一次增量备份后所产生的增加和修改的文件,如此类推。

二、常见的备份方法


  • 物理冷备

    • 备份时数据库处于关闭状态,直接打包数据库文件
    • 备份速度快,恢复时也是最简单的
    • 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。

  • 专用备份工具mydump或mysqlhotcopy

    • mysqldump常用的逻辑备份工具
    • mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

  • 启用二进制日志进行增量备份

    • 进行增量备份,需要刷新_二进制日志

  • 第三方工具备份

    • 免费的MySQl热备份软件Percona XtraBackup

三、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)
复制代码

  • 先退出mysql,关闭数据库服务,再打包备份
  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
复制代码

  • 将原来的数据移走到备份文件夹中,解压刚才备份的tar包到/restore目录下,再移动到mysql服务的文件夹中
  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
复制代码

  • 重启mysql服务,登录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)
复制代码
来源:https://www.cnblogs.com/xuxuxuxuxu/p/17613139.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具