MySQL备份与恢复

打印 上一主题 下一主题

主题 1007|帖子 1007|积分 3021

一、MySQL 数据库备份概述

1、数据库备份的重要性



  • 在生产情况中,数据的安全性至关重要
  • 任何数据的丢失都大概产生严重的后果
  • 造成数据丢失的原因

    • 步伐错误
    • 人为操作错误
    • 运算错误
    • 磁盘故障
    • 灾难(如火灾、地震)和偷窃

2、数据库备份类型



  • 从物理与逻辑的角度,备份可分为

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

      • 物理备份方法

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

      • 逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份


  • 从数据库的备份策略角度,备份可分为

    • 完全备份:每次对数据库进行完整的备份
    • 差别备份:备份自从上次完全备份之后被修改过的文件
    • 增量备份:只有在上次完全备份或者增重备份后被修改的文件才会被备份

3、常见的备份方法



  • 物理冷备

    • 备份时数据库处于关闭状态,直接打包数据库文件
    • 备份速率快,恢复时也是最简单的

  • 专用备份工具 mydump 或 mysqlhoctopy

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

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

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

  • 第三方工具备份

    • 免费的MySQL热备份软件Percoona XtraBackup

二、数据库完全备份操作

1、物理冷备份与恢复

1.备份数据库

  1. mysql> create database aa;
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> create database bb;
  4. Query OK, 1 row affected (0.00 sec)
  5. mysql> show databases;
  6. +--------------------+
  7. | Database           |
  8. +--------------------+
  9. | information_schema |
  10. | aa                 |
  11. | bb                 |
  12. | mysql              |
  13. | performance_schema |
  14. | sys                |
  15. +--------------------+
  16. 6 rows in set (0.00 sec)
  17. mysql> exit
  18. Bye
  19. [root@bogon mysql]# cat /etc/my.cnf
  20. [client]
  21. socket=/usr/local/mysql/data/mysql.sock
  22. [mysqld]
  23. socket=/usr/local/mysql/data/mysql.sock
  24. #绑定监听地址 0.0.0.0
  25. bind-address = 0.0.0.0
  26. # 跳过域名解析,如果mysql服务器设置了dns服务器,并且客户端ip在dns上并没有相应的hostname,那么这个过程很慢,导致连接等待
  27. skip-name-resolve
  28. #设置 3306 端口
  29. port = 3306
  30. # 设置 mysql 的安装目录
  31. basedir=/usr/local/mysql
  32. # 设置 mysql 数据库的数据的存放目录
  33. datadir=/usr/local/mysql/data
  34. # 允许最大连接数
  35. max_connections=2048
  36. # 服务端使用的字符集默认为 utf8
  37. character-set-server=utf8
  38. # 创建新表时将使用的默认存储引擎
  39. default-storage-engine=INNODB
  40. # 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
  41. lower_case_table_names=1
  42. # 接收数据包的大小
  43. max_allowed_packet=16M
  44. [root@bogon ~]# grep datadir /etc/my.cnf
  45. datadir=/usr/local/mysql/data
  46. [root@bogon ~]# systemctl stop mysqld
  47. [root@bogon ~]# mkdir /backup
  48. [root@bogon ~]# cd /usr/local/mysql/
  49. [root@bogon mysql]# ls
  50. bin  data  docs  include  lib  LICENSE  man  README  share  support-files
  51. [root@bogon mysql]# tar zcf /backup/mysql-all-$(date +%F).tar.gz data/
  52. [root@bogon mysql]# ls /backup/
  53. mysql-all-2024-07-29.tar.gz  mysql-all.tar-2024-07-29.gz
  54. [root@bogon mysql]# systemctl start mysqld
  55. [root@bogon mysql]# scp /backup/mysql-all-2024-07-29.tar.gz root@192.168.72.145:/root/
  56. root@192.168.72.145's password:
  57. mysql-all-2024-07-29.tar.gz                                                100% 1319KB  82.8MB/s   00:00   
复制代码
2.恢复数据库

  1. [root@bogon ~]# ls
  2. anaconda-ks.cfg  auto-install-mysql57-glibc  auto-install-mysql57-glibc.tar.gz  mysql-all-2024-07-29.tar.gz
  3. [root@bogon ~]# systemctl stop mysqld
  4. [root@bogon ~]# ls /usr/local/mysql/
  5. bin  data  docs  include  lib  LICENSE  man  README  share  support-files
  6. [root@bogon ~]# mv /usr/local/mysql/data/ /usr/local/mysql/data.old
  7. [root@bogon ~]# tar zxf mysql-all-2024-07-29.tar.gz
  8. [root@bogon ~]# ls
  9. anaconda-ks.cfg             auto-install-mysql57-glibc.tar.gz  mysql-all-2024-07-29.tar.gz
  10. auto-install-mysql57-glibc  data
  11. [root@bogon ~]# mv data/ /usr/local/mysql/
  12. [root@bogon ~]# systemctl start mysqld
  13. # 测试是否备份恢复成功
  14. [root@bogon ~]# mysql -uroot -p123
  15. mysql> show databases;
  16. +--------------------+
  17. | Database           |
  18. +--------------------+
  19. | information_schema |
  20. | aa                 |
  21. | bb                 |
  22. | mysql              |
  23. | performance_schema |
  24. | sys                |
  25. +--------------------+
  26. 6 rows in set (0.00 sec)
  27. mysql> exit
  28. Bye
复制代码
2、mysqldump 备份与恢复

1.备份数据库

  1. # 备份指定库中的部分表
  2. # mysqldump [选项] 库名 [表名 1] [表名 2] … > /备份路径/备份文件名
  3. mysqldump -uroot -p mysql user > mysql_user.sql
  4. # 备份一个或多个完整的库(包括其中所有的表)
  5. # mysqldump [选项] --databases 库名 1 [库名 2] … > /备份路径/备份文件名
  6. mysqldump -uroot -p --databases mysql > mysql.sql
  7. # 备份 MySQL 服务器中所有的库
  8. # mysqldump [选项] --all-databases > /备份路径/备份文件名
  9. # -A 是 --all-databases的简写
  10. mysqldump -uroot -p --all-databases > all-data.sql
  11. mysqldump -uroot -p -A > all-data.sql
复制代码
2.恢复数据库

  1. # 删除数据库 aa 和 bb
  2. mysql> drop database aa;
  3. Query OK, 0 rows affected (0.00 sec)
  4. mysql> drop database bb;
  5. Query OK, 0 rows affected (0.00 sec)
  6. # 查看数据库
  7. mysql> show databases;
  8. +--------------------+
  9. | Database           |
  10. +--------------------+
  11. | information_schema |
  12. | mysql              |
  13. | performance_schema |
  14. | sys                |
  15. +--------------------+
  16. 4 rows in set (0.00 sec)
  17. # mysql [选项] [库名] [表名] < /备份路径/备份文件名
  18. # 恢复所有数据库
  19. [root@bogon ~]# mysql -uroot -p < all-data.sql
  20. Enter password:
  21. # 查看数据库
  22. [root@bogon ~]# mysql -uroot -p -e 'show databases;'
  23. Enter password:
  24. +--------------------+
  25. | Database           |
  26. +--------------------+
  27. | information_schema |
  28. | aa                 |
  29. | bb                 |
  30. | mysql              |
  31. | performance_schema |
  32. | sys                |
  33. +--------------------+
复制代码
三、MySQL 增量备份与恢复

1、MySQL 增量备份概述

1.增量备份的特点

2.MySQL 二进制日志对备份的意义

  1. # 开启二进制日志功能
  2. [root@bogon ~]# vi /etc/my.cnf
  3. [mysqld]
  4. log-bin=mysql-bin
  5. binlog_format = MIXED
  6. server-id=1
  7. # 重启服务
  8. [root@bogon ~]# systemctl restart mysqld
  9. # 有 mysql-bin.000001 就代表成功
  10. [root@bogon ~]# ls /usr/local/mysql/data/mysql-bin.*
  11. /usr/local/mysql/data/mysql-bin.000001  /usr/local/mysql/data/mysql-bin.index
复制代码
2、MySQL 增量恢复



  • 常用的增量恢复的方法有三种:一样平常恢复、基于位置的恢复、基于时间点的恢复。
  • 一样平常恢复:将所有备份的二进制日志内容全部恢复,命令格式如下所示。
  1. mysqlbinlog [--no-defaults] 增量备份文件 | mysql -u 用户名 -p 密码
复制代码


  • 基于位置的恢复:数据库管理员在操作数据库时大概在同一时间点既有错误的操作也有 正确的操作,通过基于位置进行恢复可以更加精准,命令格式如下所示。
  1. # 格式 1:恢复数据到指定位置。
  2. mysqlbinlog --stop-position='操作 id' 二进制日志 |mysql -u 用户名 -p 密码
  3. # 格式 2:从指定的位置开始恢复数据。
  4. mysqlbinlog --start-position='操作 id' 二进制日志 |mysql -u 用户名 -p 密码
复制代码


  • 基于时间点的恢复:跳过某个发生错误的时间点实现数据恢复,而基于时间点的恢复可 以分成三种情况。
  1. # 格式 1:从日志开头截止到某个时间点的恢复。
  2. mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
  3. # 格式 2:从某个时间点到日志结尾的恢复。
  4. mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码
  5. # 格式 3:从某个时间点到某个时间点的恢复。
  6. mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日小时:分钟:秒' 二进制日志
复制代码
3、MySQL 企业备份案例

1.一样平常恢复



  • 添加数据库、表,录入信息
  1. [root@bogon ~]# mysql -uroot -p123
  2. CREATE DATABASE client;
  3. USE client;
  4. CREATE TABLE user_info(
  5. IdentityCard CHAR(20) NOT NULL,
  6. name CHAR(20) NOT NULL,
  7. gender CHAR(4),
  8. UserID CHAR(10) NOT NULL,
  9. expenses INT(10));
  10. INSERT INTO user_info VALUES('000006','张三','男','016','10');
  11. INSERT INTO user_info VALUES('000007','李四','女','017','91');
  12. INSERT INTO user_info VALUES('000008','王五','女','018','23');
  13. SELECT * FROM user_info;
  14. mysql> exit
  15. Bye
复制代码


  • 先进行一次完全备份
  1. [root@bogon ~]# mkdir /mysql_bak
  2. [root@bogon ~]# mysqldump -uroot -p -A > /mysql_bak/mysql-all.sql
  3. Enter password:
  4. # 刷新日志
  5. [root@bogon ~]# mysqladmin -uroot -p flush-logs
  6. [root@bogon ~]# ls /usr/local/mysql/data/mysql-bin.*
  7. /usr/local/mysql/data/mysql-bin.000001  /usr/local/mysql/data/mysql-bin.index
  8. /usr/local/mysql/data/mysql-bin.000002
复制代码


  • 继续录入新的数据并进行增量备份
  1. USE client;
  2. INSERT INTO user_info VALUES('000009','赵六','男','019','37');
  3. INSERT INTO user_info VALUES('000010','孙七','男','020','36');
  4. # 停顿几秒之后再插入
  5. INSERT INTO user_info VALUES('000011','张三','男','021','35');
  6. INSERT INTO user_info VALUES('000012','李四','男','022','37');
  7. # 刷新日志
  8. [root@bogon ~]# mysqladmin -uroot -p flush-logs
  9. Enter password:
  10. [root@bogon ~]# ls /usr/local/mysql/data/mysql-bin.*
  11. /usr/local/mysql/data/mysql-bin.000001  /usr/local/mysql/data/mysql-bin.000003
  12. /usr/local/mysql/data/mysql-bin.000002  /usr/local/mysql/data/mysql-bin.index
  13. # 备份
  14. [root@bogon ~]# cp /usr/local/mysql/data/mysql-bin.000002 /mysql_bak/
  15. [root@bogon ~]# ls /mysql_bak/
  16. client_userinfo-2024-07-29.sql  mysql-all.sql  mysql-bin.000002
  17. [root@bogon ~]# ls /mysql_bak/
  18. client_userinfo-2024-07-29.sql  mysql-all.sql  mysql-bin.000002
  19. # 查看
  20. [root@bogon ~]# mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002
复制代码


  • 模仿误操作
  1. [root@bogon ~]# mysql -uroot -p -e 'DROP database client;'
  2. Enter password:
  3. [root@bogon ~]# mysql -uroot -p -e 'show databases;'
  4. Enter password:
  5. +--------------------+
  6. | Database           |
  7. +--------------------+
  8. | information_schema |
  9. | mysql              |
  10. | performance_schema |
  11. | sys                |
  12. +--------------------+
复制代码


  • 恢复操作
  1. [root@bogon ~]# mysql -uroot -p < /mysql_bak/mysql-all.sql
  2. Enter password:
  3. [root@bogon ~]# mysql -uroot -p -e 'show databases;'
  4. Enter password:
  5. +--------------------+
  6. | Database           |
  7. +--------------------+
  8. | information_schema |
  9. | client             |
  10. | mysql              |
  11. | performance_schema |
  12. | sys                |
  13. +--------------------+
复制代码
2.基于位置恢复

  1. # 把mysql-bin.000002的内容全部恢复
  2. mysqlbinlog --no-defaults /mysql_bak/mysql-bin.000002 | mysql -uroot -p
  3. --start-position
  4. --stop-position
  5. [root@bogon ~]# mysql -uroot -p -e 'select * from client.user_info;'
  6. Enter password:
  7. +--------------+--------+--------+--------+----------+
  8. | IdentityCard | name   | gender | UserID | expenses |
  9. +--------------+--------+--------+--------+----------+
  10. | 000006       | 张三   | 男     | 016    |       10 |
  11. | 000007       | 李四   | 女     | 017    |       91 |
  12. | 000008       | 王五   | 女     | 018    |       23 |
  13. +--------------+--------+--------+--------+----------+
  14. # 恢复 孙七 之前的内容 基于位置 623
  15. [root@bogon ~]# mysqlbinlog --no-defaults --stop-position='623' /mysql_bak/mysql-bin.000002 | mysql -uroot -p
  16. Enter password:
  17. [root@bogon ~]# mysql -uroot -p -e 'select * from client.user_info;'
  18. Enter password:
  19. +--------------+--------+--------+--------+----------+
  20. | IdentityCard | name   | gender | UserID | expenses |
  21. +--------------+--------+--------+--------+----------+
  22. | 000006       | 张三   | 男     | 016    |       10 |
  23. | 000007       | 李四   | 女     | 017    |       91 |
  24. | 000008       | 王五   | 女     | 018    |       23 |
  25. | 000009       | 赵六   | 男     | 019    |       37 |
  26. +--------------+--------+--------+--------+----------+
  27. # 恢复 孙七 之后的内容 基于位置 623
  28. [root@bogon ~]# mysqlbinlog --no-defaults --start-position='623' /mysql_bak/mysql-bin.000002 | mysql -uroot -p
  29. Enter password:
  30. [root@bogon ~]# mysql -uroot -p -e 'select * from client.user_info;'
  31. Enter password:
  32. +--------------+--------+--------+--------+----------+
  33. | IdentityCard | name   | gender | UserID | expenses |
  34. +--------------+--------+--------+--------+----------+
  35. | 000006       | 张三   | 男     | 016    |       10 |
  36. | 000007       | 李四   | 女     | 017    |       91 |
  37. | 000008       | 王五   | 女     | 018    |       23 |
  38. | 000009       | 赵六   | 男     | 019    |       37 |
  39. | 000010       | 孙七   | 男     | 020    |       36 |
  40. | 000011       | 张三   | 男     | 021    |       35 |
  41. | 000012       | 李四   | 男     | 022    |       37 |
  42. +--------------+--------+--------+--------+----------+
复制代码
3.基于时间点恢复

  1. --start-datetime
  2. --stop-datetime
  3. mysqlbinlog --no-defaults --start-datetime='2024-07-28 22:13:33' /mysql_bak/mysql-bin.000002 | mysql -uroot -p
  4. mysqlbinlog --no-defaults --stop-datetime='2024-07-28 22:13:33' /mysql_bak/mysql-bin.000002 | mysql -uroot -p
  5. [root@bogon ~]# mysql -uroot -p -e 'select * from client.user_info;'
  6. Enter password:
  7. +--------------+--------+--------+--------+----------+
  8. | IdentityCard | name   | gender | UserID | expenses |
  9. +--------------+--------+--------+--------+----------+
  10. | 000006       | 张三   | 男     | 016    |       10 |
  11. | 000007       | 李四   | 女     | 017    |       91 |
  12. | 000008       | 王五   | 女     | 018    |       23 |
  13. +--------------+--------+--------+--------+----------+
  14. # 恢复 孙七 之前的内容 基于时间 2024-07-29 10:13:20
  15. [root@bogon ~]# mysqlbinlog --no-defaults --stop-datetime='2024-07-29 10:13:20' /mysql_bak/mysql-bin.000002 | mysql -uroot -p
  16. Enter password:
  17. [root@bogon ~]# mysql -uroot -p -e 'select * from client.user_info;'
  18. Enter password:
  19. +--------------+--------+--------+--------+----------+
  20. | IdentityCard | name   | gender | UserID | expenses |
  21. +--------------+--------+--------+--------+----------+
  22. | 000006       | 张三   | 男     | 016    |       10 |
  23. | 000007       | 李四   | 女     | 017    |       91 |
  24. | 000008       | 王五   | 女     | 018    |       23 |
  25. | 000009       | 赵六   | 男     | 019    |       37 |
  26. +--------------+--------+--------+--------+----------+
  27. # 恢复 孙七 之后的内容 基于时间 2024-07-29 10:13:20
  28. [root@bogon ~]# mysqlbinlog --no-defaults --start-datetime='2024-07-29 10:13:20' /mysql_bak/mysql-bin.000002 | mysql -uroot -p
  29. Enter password:
  30. [root@bogon ~]# mysql -uroot -p -e 'select * from client.user_info;'
  31. Enter password:
  32. +--------------+--------+--------+--------+----------+
  33. | IdentityCard | name   | gender | UserID | expenses |
  34. +--------------+--------+--------+--------+----------+
  35. | 000006       | 张三   | 男     | 016    |       10 |
  36. | 000007       | 李四   | 女     | 017    |       91 |
  37. | 000008       | 王五   | 女     | 018    |       23 |
  38. | 000009       | 赵六   | 男     | 019    |       37 |
  39. | 000010       | 孙七   | 男     | 020    |       36 |
  40. | 000011       | 张三   | 男     | 021    |       35 |
  41. | 000012       | 李四   | 男     | 022    |       37 |
  42. +--------------+--------+--------+--------+----------+
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表