关于定期 MySQL 完整备份和增量备份的实用说明
1。 介绍
产品推出后,我们的数据非常重要,容不得任何错误。我们应该做好充分的准备。如果有一天被黑或者被故意删除,那就gg了。因此,我们必须定期对在线数据库进行全量和增量备份。例如:每天进行一次增量备份,每周进行一次完整备份。
GitHub地址:
https://github.com/zonezoen/MySQL_backup
2.全量备份
/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源码。
#!/bin/bash
#使用前提前创建以下目录
#获取当前时间
date_now=$(date "+%Y%m%d-%H% M%S ")
backUpFolder=/home/db/backup/mysql
用户名=“root”
密码=“123456”
文件名db_name“db_name”名称
文件名="$ {db_name}_${date_now}.sql"
#定义备份文件目录
backUpFileName="${backUpFolder}/$o "{文件开头}"备份mysql ${ db_name} o $ {date_now}。"
/usr/bin/mysqldump -u${用户名} -p${密码} --lock-all-tables --flush-logs ${db_name} > $ {backUpFileName }
#进入备份文件目录
cd ${backUpFolder}
#压缩备份文件
tar zcvf $}. # 使用nodejs在别处上传备份文件
#NODE_ENV=$backUpFolder@$backUpFileName node /home/tasks/upload.js
date_end=$(date "+%Y%m%d-%H%M % S" )
echo "在 ${date_end} 之前完成数据库 ${db_name} 的 mysql 备份。"
3.恢复完整备份
mysql -h localhost -uroot -p123456
或
mysql> source /path/backup/bakdup.sql 这一切都需要完全恢复。似乎没有什么需要多说的了。对了,恢复全量备份后,增量备份也必须恢复到全量备份后的数据库中。
4。增量备份
在进行增量备份之前,首先要检查配置文件,并检查日志记录是否开启,因为增量备份必须先开启日志记录。首先进入mysq命令行,输入以下命令:
show Variables as '%log_bin%';
如以下命令所示,不允许
mysql> show Variables as '%log_bin%' ';
+--------------------------------+--------------------+
|变量名 |
|日志箱|
| log_bin_trust_function_creators | log_bin_trust_function_creators |关 |
| log_bin_use_v1_row_events | log_bin_use_v1_row_events | log_bin_use_v1_row_events |
+ ----------------------------------+-----+
将 MySQL 配置条目编辑为以下代码片段: vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 版权所有 (c) 2014、2016,Oracle 和/或其附属公司。保留所有权利。
#
#本程序是免费软件;您可以根据
# 自由软件基金会发布的 GNU 通用公共许可证条款重新分发和/或修改它
#;版本 2 许可证。
#
#分发此程序是希望它有用,
#,但不提供任何保证;甚至没有暗示的适销性或特定用途适用性的保证。有关详细信息,请参阅
# GNU 通用公共许可证。
#
# 您应该通过此程序收到一份 GNU 通用公共许可证
#;如果没有,请编写 Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# MySQL 服务器配置文件。
## #有关说明,请参阅
# http://dev.mysql .com/doc/mysql/en/server-system-variables.html
[mysqld]
pid-file = /var/ /mysqld/mysqld .pid
socket = /var/run/mysqld /mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql
#默认情况下我们接受仅来自 localhost 的连接
#bind -address = 127.0.0.1
# 建议禁用符号链接以防止不同的安全性Risks
symbolic-links=0
#binlog设置,启用增量备份的关键
log-bin=/var/lib/mysql/mysql-bin
44server-id=123修改后重启mysql服务,输入:
show Variables as '%log_bin%';
状态如下:
mysql> show Variables as '%log_bin%';+ ---- --- ------------------------+------------------ --- - -- ---------+
|变量名 日志箱: log_bin_basename | log_bin_basename | /var/lib/mysql/mysql-bin |
|日志_bin_索引 | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | log_bin_trust_function_creators |关 |
| log_bin_use_v1_row_events | log_bin_use_v1_row_events | log_bin_use_v1_row_events关 |
| sql_log_bin | sql_log_bin | ------------------------------+
好的,我已经做好充分准备了。接下来我们开始学习增量备份
查看当前使用的日志文件mysql_bin.000*,
show master server status;
状态如下:❝mysq‸show master server status;-‸ ---- --------------+----------+--------------+----- - - - -----------+----------------+
|文件 | +------------------+----------+--------------+--- - -----------------+----------------+
| mysql-bin.000015 | 610 | 610
+----------------+---------+-------------+- --- ---------------+-----------------+
当前正在记录的文件名为 mysql - bin.000015。
当前数据库包含以下数据:
mysql> select * from users;
+------+-------+----+
|名称 |性别 | id |
+-------+-----+----+
|区域 | 0 | 1 |
|区域 1 | 1 | 2 |
|区域2 | 0 | 3、name`, `sex`, `id`) 值( 'zone3', '0', '4');
显示效果:
mysql> select * from users;
+ -------+-----+----+
|名称 |性别 | id |
+-------+-------+- ---+
|区域 | 0 | 1 |
|区域 1 | 1 | 2 |
|区域2 | 0 | 3 |
|区域 3 | 0 | 4 |
+-- -----+------+----+
` 要使用新的日志文件,我们执行以下命令:
mysqladmin -uroot - 123456lush-logs
日志文件从mysql-bin.000015将更改为mysql-bin.000016,并且mysql-bin.000015当前正在记录插入命令日志。前面代码的效果如下:
mysql> show master status;
+----------------+--------- - -+ ---------------+----------------+------------------------ --- - ---+
|文件 |位置 | Binlog_Do_DB | Binlog_Ignore_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+------------------------+------------ + - ------------------+-------------- -----+
| mysql-bin.000016 | 154 | 154第154章--+--------------+----------------+---------- -- ------+
所以到现在为止,增量备份实际上已经完成了。
5。恢复增量备份
现在删除刚刚插入的数据,效果如下:
delete from `zone`.`users` where `id`='4'
mysql> select * from users;
+ -------+-----+----+
|名称 |性别 | id |
+-----+ ------+----+
|区域 | 0 | 1 |
|区域 1 | 1 | 2 |
|区域2 | 0 | 3 |
+---- ---+------+----+
现在是从mysql-bin.000015恢复数据的关键时刻:
mysqlbinlog /var /lib/mysql/mysql-bin .000015 | mysql -uroot -p123456 zone;
上一行代码指定了需要恢复的mysql_bin文件。输入用户名:root,密码:123456,数据库名称:zone。效果如下:
mysql> select * from users;
+-------+------+----+
|名称 |性别 | id |
+--------+-----+----+
|区域 | 0 | 1 |
|区域 1 | 1 | 2 |
|区域2 | 0 | 3 |
|区域 3 | 0 | 4 |
+-------+------+----+
好了,整个增量备份操作流程就到这里了,那我们怎么写入到脚本文件中呢?代码如下:
#!/bin/bash
#使用前,提前创建以下目录
BakDir=/usr/local/work /backup/daily
#复制目的地mysql-bin目录,增量备份时00000*,提前手动创建该目录
BinDir=/var/lib/mysql
#mysql数据目录
LogFile=/up/usr/bak.log
BinFile=/var/ lib/mysql/mysql-bin.index
#mysql索引文件路径,位于数据目录
mysqladmin -uroot -p123456#flush-log 这个是用来生成一个new file mysql-bin.00000*
# wc -l 统计行数
# awk 简单的说,awk的意思是逐行处理一个文件,在读取时,每行以空格为切片默认分隔符,然后将切片部分进行各种分析和处理。
Counter=`wc -l $BinFile |awk '{print $1}'`
NextNum=0
#这个for循环用于比较$Counter和$NextNum两个值来确定文件是否不存在或为最新文件或“Cat $ binfile”中的文件
do
base = `Basename $ File`
Echo $ Base
# 用于捕获 mysq00l- ** 00000* 的基本名称文件名,删除 ./mysql-bin.000005 NextNum=`expr $NextNum + 1`
if [ $NextNum -eq then $Counter ]❝❙ echo $base 跳过! >> $LogFile
else
dest=$BakDir/$base
if(test -e $dest)
#test -e 用于查看目标文件是否存在。如果存在,就写存在!转到位于
的 $ 日志文件,然后
echo $ Base Exist! >> $ 日志文件
Else
CP $ Bindir/$ BASE $ BAKDIR
Echo $ 复制基础 >> $ 日志文件
Fi Fi‸‸‸ fi 回显'日期+ " %Y 年 %m 月 %d 日 %H:%M:%S"` $下次备份成功! >> $LogFile
#NODE_ENV= $backUpFolder@$backUpFileName /root/.nvm/versions/node/v8.11.3/bin/node /usr/local/work/script/upload.js
6. 计划backup
输入以下命令,进入定时备份任务编辑界面:
crontab -e
添加以下命令,意思是:每分钟运行一次备份脚本。具体的crontab规则会另外写,与本文主题无关。 Docker 中的实现
Docker 中的实现实际上是完全不同的。上面的步骤我就不再重复了。我直接展示一下我在Docker中遇到的坑。送给大家。
1。安装vim
我使用的是官方MySQL镜像,Docker-MySQL镜像中使用的Debian系统。版本比较旧,没有vim。首先,我们需要运行以下代码来安装vim:
apt-get update
apt-get install vim
安装好vim后,就可以愉快地编辑vim /etc/mysql/mysql.conf.d了/mysqld.cnf。我忘了说这个文件无法映射到容器,因为容器本身就有这个文件。
2。调整时区
我们在备份数据库的时候,会用到时间因素,但是Docker容器中默认的时区是+0时区,而我们的时区是+8时区。只有在那里我们才会映射主机时区文件。
-v /etc/localtime:/etc/localtime:ro
还可以通过进入容器来调整时区。这取决于个人选择。具体编辑方法见博客地址:http://coolnull.com/235.html
3。定时备份
如何在容器中实现定时备份?有人可能会说用crontab吗?如果你这么认为,不幸的是官方 Docker-MySQL 镜像中没有 crontab。还有人说我们不能安装crontab吗?然而,Docker 支持“每个容器一个进程”的方法。那么查找资料未果后我想,将计划任务分配给我们的宿主机不就可以了吗?让主机定期向容器发送命令来实现我们的目标。
输入以下命令进入定时任务编辑界面:
crontab -e
添加以下命令,其中包含:每分钟运行一次备份脚本
* * * * * docker exec ${docker_name } /bin/sh /usr/vaša/cesta/mysqlbackup.sh
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。