Code前端首页关于Code前端联系我们

关于定期 MySQL 完整备份和增量备份的实用说明

terry 2年前 (2023-09-26) 阅读数 77 #数据库

1。 介绍

产品推出后,我们的数据非常重要,容不得任何错误。我们应该做好充分的准备。如果有一天被黑或者被故意删除,那就gg了。因此,我们必须定期对在线数据库进行全量和增量备份。例如:每天进行一次增量备份,每周进行一次完整备份。

GitHub地址:

  1. https://github.com/zonezoen/MySQL_backup

2.全量备份

  1. /usr/bin/mysqldump -uroot -p123456 --lock-all-tables --flush -logs test > /home/backup.sql

前面代码提到过,它的作用是完全备份备份测试数据库。 MySQL用户名是:root,密码是:123456。备份文件路径是:/home。当然,这条路线也可以根据个人意愿进行修改。备份文件名称为backup.sql

参数—flush-logs:使用新的日志文件记录下一条日志;

参数—lock-all-tables:锁定所有数据库;

以下是我使用的脚本文件:

脚本文件的功能并不算太复杂。首先是不同变量的赋值。然后备份数据库,指定备份文件所在目录,然后压缩备份文件。倒数第三行是使用nodejs将备份文件上传到七牛云。这里我就不做过多阐述了。这与本文的主题相悖。如果想看具体的实现,可以查看GitHub源码。

  1. #!/bin/bash
  2. #使用前提前创建以下目录
  3. #获取当前时间
  4. date_now=$(date "+%Y%m%d-%H% M%S ")
  5. backUpFolder=/home/db/backup/mysql
  6. 用户名=“root”
  7. 密码=“123456”
  8. 文件名db_name“db_name”名称
  9. 文件名="$ {db_name}_${date_now}.sql"
  10. #定义备份文件目录
  11. backUpFileName="${backUpFolder}/$o "{文件开头}"备份mysql ${ db_name} o $ {date_now}。"
  12. /usr/bin/mysqldump -u${用户名} -p${密码} --lock-all-tables --flush-logs ${db_name} > $ {backUpFileName }
  13. #进入备份文件目录
  14. cd ${backUpFolder}
  15. #压缩备份文件
  16. tar zcvf $}. # 使用nodejs在别处上传备份文件
  17. #NODE_ENV=$backUpFolder@$backUpFileName node /home/tasks/upload.js
  18. date_end=$(date "+%Y%m%d-%H%M % S" )
  19. echo "在 ${date_end} 之前完成数据库 ${db_name} 的 mysql 备份。"

3.恢复完整备份

  1. mysql -h localhost -uroot -p123456

  1. mysql> source /path/backup/bakdup.sql 这一切都需要完全恢复。似乎没有什么需要多说的了。对了,恢复全量备份后,增量备份也必须恢复到全量备份后的数据库中。

    4。增量备份

    在进行增量备份之前,首先要检查配置文件,并检查日志记录是否开启,因为增量备份必须先开启日志记录。首先进入mysq命令行,输入以下命令:

    1. show Variables as '%log_bin%';

    如以下命令所示,不允许

    1. mysql> show Variables as '%log_bin%' ';
    2. +--------------------------------+--------------------+
    3. |变量名                                                                       |
    4. |日志箱|
    5. | log_bin_trust_function_creators | log_bin_trust_function_creators |关 |
    6. | log_bin_use_v1_row_events | log_bin_use_v1_row_events | log_bin_use_v1_row_events |
    7. + ----------------------------------+-----+

    将 MySQL 配置条目编辑为以下代码片段: vim /etc/mysql/mysql.conf.d/mysqld.cnf

    1. # 版权所有 (c) 2014、2016,Oracle 和/或其附属公司。保留所有权利。
    2. #
    3. #本程序是免费软件;您可以根据
    4. # 自由软件基金会发布的 GNU 通用公共许可证条款重新分发和/或修改它
    5. #;版本 2 许可证。
    6. #
    7. #分发此程序是希望它有用,
    8. #,但不提供任何保证;甚至没有暗示的适销性或特定用途适用性的保证。有关详细信息,请参阅
    9. # GNU 通用公共许可证。
    10. #
    11. # 您应该通过此程序收到一份 GNU 通用公共许可证
    12. #;如果没有,请编写 Free Software
    13. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
    14. #
    15. # MySQL 服务器配置文件。
    16. ## #有关说明,请参阅
    17. # http://dev.mysql .com/doc/mysql/en/server-system-variables.html
    18. [mysqld]
    19. pid-file = /var/ /mysqld/mysqld .pid
    20. socket = /var/run/mysqld /mysqld.sock
    21. datadir = /var/lib/mysql
    22. #log-error = /var/log/mysql
    23. #默认情况下我们接受仅来自 localhost 的连接
    24. #bind -address = 127.0.0.1
    25. # 建议禁用符号链接以防止不同的安全性Risks
    26. symbolic-links=0
    27. #binlog设置,启用增量备份的关键
    28. log-bin=/var/lib/mysql/mysql-bin
    29. 44server-id=123修改后重启mysql服务,输入:
      1. show Variables as '%log_bin%';

      状态如下:

      1. mysql> show Variables as '%log_bin%';+ ---- --- ------------------------+------------------ --- - -- ---------+
      2. |变量名 日志箱: log_bin_basename | log_bin_basename | /var/lib/mysql/mysql-bin |
      3. |日志_bin_索引 | /var/lib/mysql/mysql-bin.index |
      4. | log_bin_trust_function_creators | log_bin_trust_function_creators |关 |
      5. | log_bin_use_v1_row_events | log_bin_use_v1_row_events | log_bin_use_v1_row_events关 |
      6. | sql_log_bin | sql_log_bin | ------------------------------+

      好的,我已经做好充分准备了。接下来我们开始学习增量备份

      查看当前使用的日志文件mysql_bin.000*,

      1. show master server status;

      状态如下:❝mysq‸show master server status;-‸ ---- --------------+----------+--------------+----- - - - -----------+----------------+

    30. |文件 | +------------------+----------+--------------+--- - -----------------+----------------+
    31. | mysql-bin.000015 | 610 | 610
    32. +----------------+---------+-------------+- --- ---------------+-----------------+

    当前正在记录的文件名为 mysql - bin.000015。

    当前数据库包含以下数据:

    1. mysql> select * from users;
    2. +------+-------+----+
    3. |名称 |性别 | id |
    4. +-------+-----+----+
    5. |区域 | 0 | 1 |
    6. |区域 1 | 1 | 2 |
    7. |区域2 | 0 | 3、name`, `sex`, `id`) 值​​​​​​( 'zone3', '0', '4');

    显示效果:

    1. mysql> select * from users;
    2. + -------+-----+----+
    3. |名称 |性别 | id |
    4. +-------+-------+- ---+
    5. |区域 | 0 | 1 |
    6. |区域 1 | 1 | 2 |
    7. |区域2 | 0 | 3 |
    8. |区域 3 | 0 | 4 |
    9. +-- -----+------+----+

    ` 要使用新的日志文件,我们执行以下命令:

    1. mysqladmin -uroot - 123456lush-logs

    日志文件从mysql-bin.000015将更改为mysql-bin.000016,并且mysql-bin.000015当前正在记录插入命令日志。前面代码的效果如下:

    1. mysql> show master status;
    2. +----------------+--------- - -+ ---------------+----------------+------------------------ --- - ---+
    3. |文件 |位置 | Binlog_Do_DB | Binlog_Ignore_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    4. +----------------+------------------------+------------ + - ------------------+-------------- -----+
    5. | mysql-bin.000016 | 154 | 154第154章--+--------------+----------------+---------- -- ------+

    所以到现在为止,增量备份实际上已经完成了。

    5。恢复增量备份

    现在删除刚刚插入的数据,效果如下:

    1. delete from `zone`.`users` where `id`='4'
    2. mysql> select * from users;
    3. + -------+-----+----+
    4. |名称 |性别 | id |
    5. +-----+ ------+----+
    6. |区域 | 0 | 1 |
    7. |区域 1 | 1 | 2 |
    8. |区域2 | 0 | 3 |
    9. +---- ---+------+----+

    现在是从mysql-bin.000015恢复数据的关键时刻:

    1. mysqlbinlog /var /lib/mysql/mysql-bin .000015 | mysql -uroot -p123456 zone;

    上一行代码指定了需要恢复的mysql_bin文件。输入用户名:root,密码:123456,数据库名称:zone。效果如下:

    1. mysql> select * from users;
    2. +-------+------+----+
    3. |名称 |性别 | id |
    4. +--------+-----+----+
    5. |区域 | 0 | 1 |
    6. |区域 1 | 1 | 2 |
    7. |区域2 | 0 | 3 |
    8. |区域 3 | 0 | 4 |
    9. +-------+------+----+

    好了,整个增量备份操作流程就到这里了,那我们怎么写入到脚本文件中呢?代码如下:

    1. #!/bin/bash
    2. #使用前,提前创建以下目录
    3. BakDir=/usr/local/work /backup/daily
    4. #复制目的地mysql-bin目录,增量备份时00000*,提前手动创建该目录
    5. BinDir=/var/lib/mysql
    6. #mysql数据目录
    7. LogFile=/up/usr/bak.log
    8. BinFile=/var/ lib/mysql/mysql-bin.index
    9. #mysql索引文件路径,位于数据目录
    10. mysqladmin -uroot -p123456#flush-log 这个是用来生成一个new file mysql-bin.00000*
    11. # wc -l 统计行数
    12. # awk 简单的说,awk的意思是逐行处理一个文件,在读取时,每行以空格为切片默认分隔符,然后将切片部分进行各种分析和处理。
    13. Counter=`wc -l $BinFile |awk '{print $1}'`
    14. NextNum=0
    15. #这个for循环用于比较$Counter和$NextNum两个值来确定文件是否不存在或为最新文件或“Cat $ binfile”中的文件
    16. do
    17. base = `Basename $ File`
    18. Echo $ Base
    19. # 用于捕获 mysq00l- ** 00000* 的基本名称文件名,删除 ./mysql-bin.000005 NextNum=`expr $NextNum + 1`
    20. if [ $NextNum -eq then $Counter ]❝❙ echo $base 跳过! >> $LogFile
    21. else
    22. dest=$BakDir/$base
    23. if(test -e $dest)
    24. #test -e 用于查看目标文件是否存在。如果存在,就写存在!转到位于
    25. 的 $ 日志文件,然后
    26. echo $ Base Exist! >> $ 日志文件
    27. Else
    28. CP $ Bindir/$ BASE $ BAKDIR
    29. Echo $ 复制基础 >> $ 日志文件
    30. Fi Fi‸‸‸ fi 回显'日期+ " %Y 年 %m 月 %d 日 %H:%M:%S"` $下次备份成功! >> $LogFile
    31. #NODE_ENV= $backUpFolder@$backUpFileName /root/.nvm/versions/node/v8.11.3/bin/node /usr/local/work/script/upload.js

    6. 计划backup

    输入以下命令,进入定时备份任务编辑界面:

    1. crontab -e

    添加以下命令,意思是:每分钟运行一次备份脚本。具体的crontab规则会另外写,与本文主题无关。 Docker 中的实现

    Docker 中的实现实际上是完全不同的。上面的步骤我就不再重复了。我直接展示一下我在Docker中遇到的坑。送给大家。

    1。安装vim

    我使用的是官方MySQL镜像,Docker-MySQL镜像中使用的Debian系统。版本比较旧,没有vim。首先,我们需要运行以下代码来安装vim:

    1. apt-get update
    2. apt-get install vim

    安装好vim后,就可以愉快地编辑vim /etc/mysql/mysql.conf.d了/mysqld.cnf。我忘了说这个文件无法映射到容器,因为容器本身就有这个文件。

    2。调整时区

    我们在备份数据库的时候,会用到时间因素,但是Docker容器中默认的时区是+0时区,而我们的时区是+8时区。只有在那里我们才会映射主机时区文件。

    1. -v /etc/localtime:/etc/localtime:ro

    还可以通过进入容器来调整时区。这取决于个人选择。具体编辑方法见博客地址:http://coolnull.com/235.html

    3。定时备份

    如何在容器中实现定时备份?有人可能会说用crontab吗?如果你这么认为,不幸的是官方 Docker-MySQL 镜像中没有 crontab。还有人说我们不能安装crontab吗?然而,Docker 支持“每个容器一个进程”的方法。那么查找资料未果后我想,将计划任务分配给我们的宿主机不就可以了吗?让主机定期向容器发送命令来实现我们的目标。

    输入以下命令进入定时任务编辑界面:

    1. crontab -e

    添加以下命令,其中包含:每分钟运行一次备份脚本

    1. * * * * * docker exec ${docker_name } /bin/sh /usr/vaša/cesta/mysqlbackup.sh

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门