mysql数据库全量备份和增量备份(docker容器部署方式)

 

1、创建备份数据库容器(参考监控相关下面的mysql安装)

# 建立挂载的数据卷

mkdir -p /opt/mysql/data
 
# 虚拟机 3307 端口和容器里的3306端口对应,虚拟机路径和容器里路径(下图,来自头部参考地址)对应
docker run -p 3307:3306 --restart="always" --name iptv-mysqlbackup -v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysqlbackup/daily:/opt/mysqlbackup/daily -v /opt/mysqlbackup/backup:/opt/mysqlbackup/backup -e MYSQL_ROOT_PASSWORD=123456 -d --privileged=true iptv-mysqlbackup
 
 

2、yum安装包存放在目录/var/cache/yum/package,将之拷贝到容器里

docker cp crontabs-1.11-6.20121102git.el7.noarch.rpm mysql:/usr/share/package
 
 
进入到容器的当前目录下通过rpm离线安装相关软件
 
rpm -Uvh --force --nodeps *.rpm
 
 
以上方式可通过apt安装,貌似要联网
安装vim apt-get update && apt-get install vim
安装定时任务 apt-get install cron  
安装yum指令 apt-get install yum
 
 

3、新建备份脚本

 
备份准备工作
创建目录
mkdir -p  /opt/mysqlbackup
touch  backup.sh
 
文件赋权
chmod +x /opt/mysqlbackup/backup.sh
 
全量备份脚本
cat >/opt/mysqlbackup/backup.sh <<EOF
#!/bin/sh
zcDATE=$(date +%Y%m%d)
mkdir -p /opt/mysqlbackup/backup/$zcDATE
mysqldump -h '192.168.1.36' -uroot -p'123456'  --quick --events  --databases mysql --flush-logs --delete-master-logs --single-transaction > /opt/mysqlbackup/backup/$zcDATE/mysql.sql
EOF
 
 
 
MySQL上存在两个数据库,名称分别是 db1 和 db2,利用这种方式在硬盘上备份数据。-h表示远程的服务器IP。-u 和 -p 分别是远程服务器的用户名和密码。这里不建议使用 mysqldump 的 –-all-database 选项。因为该选项会把远程MySQL里的系统数据库也备份下来,包括 root 用户的密码等内容。如果你要把导出的内容导入到别的机器上,这些系统设置(比如用户名和密码)会覆盖你的机器上原来的设置
增量备份数据库设置
查看mysql日志是否开启show variables like '%log_bin%'
进入到mysql容器 docker exec -ti mysql bash
修改配置文件vim /etc/mysql/mysql.conf.d/mysqld.cnf
加上两行
log-bin=/var/lib/mysql/mysql-bin
server-id=123454
set global expire_logs_days = 3;
 
重启mysql   docker restart mysql
 
 
增量备份命令sh文件,内容如下
 
BakDir=/opt/mysqlbackup/daily
BinDir=/var/lib/mysql
BinFile=/var/lib/mysql/mysql-bin.index
 
mysqladmin -h '192.168.1.36' -uroot -p123456 flush-logs
Counter=`wc -l $BinFile | awk '{print $1}'`
NextNum=0
chomd +x BinDir
for file in `cat $BinFile`
do
        base=`basename $file`
        NextNum=`expr $NextNum + 1`
        if [ $NextNum -eq $Counter ]
        then
                echo $base skip! >> $LogFile
        else
                dest=$BakDir/$base
                if(test -e $dest)
                then
                        echo $base exist! >> $LogFile
                else
                        cp $BinDir/$base $BakDir
                        echo $base copying >> $LogFile
                fi
        fi
done
 
 
echo `date +"%Y%m%d %H:%M:%S"` $Next Bakup succ! >> $LogFile
 
 
 

4、设置定时任务

 
crontab -e
加上如下配置
 
*/1 * * * *  /opt/mysqlbackup/backup.sh    (测试设置每分钟试试)
0 19 * * 1,3,5 /opt/mysqlbackup/backup.sh   (线网稳定后设置每周1,3,5执行)
50 1 * * *  /opt/mysqlbackup/backup.sh     (线网稳定前设置每天执行)
 
举例
# Use the hash sign to prefix a comment
    # +---------------- minute (0 - 59)
    # |  +------------- hour (0 - 23)
    # |  |  +---------- day of month (1 - 31)
    # |  |  |  +------- month (1 - 12)
    # |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *  command to be executed
    #--------------------------------------------------------------------------
    # Run my cron job every Monday, Wednesady and Friday at 7:00PM
0 19 * * 1,3,5 nohup /home/lathonez/script.sh > /tmp/script.log 2>&1
 
●30 5 * * * root /sbin/init 6 这样就将系统配置为了每天早上5点30自动重新启动。
● 0 /2 * * /sbin/service httpd restart 意思是每两个小时重启一次apache
● 50 1 * * * /sbin/service sshd start 意思是每天1:50开启ssh服务
● 50 22 * * * /sbin/service sshd stop 意思是每天22:50关闭ssh服务
● 0 0 1,15 * * fsck /home 每月1号和15号检查/home 磁盘
● 1 * * * * /home/bruce/backup 每小时的第一分执行 /home/bruce/backup这个文件
● 00 03 * * 1-5 find /home “.xxx” -mtime +4 -exec rm {} /; 每周一至周五3点钟,在目录/home中,查找文件名为.xxx的文件,并删除4天前的文件。
● 30 6 /10 * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令

5、启动定时任务

 
命令: service cron start 开启服务
命令: service cron stop 关闭服务
命令: service cron restart 重启服务
命令: service cron reload 重新载入配置
service cron status 查看状态
 
 
由于定时任务依赖于时间,所以还需要对时区进行设置
linux下时区设置:================================
tzselect #设置时区  依次选择5 9 1 1
export TZ=Asia/Shanghai
 
docker下时区设置:================================
cp /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime
 
 

6、想要查看定时任务日志,需要安装syslog

 
安装syslog apt-get install rsyslog
编辑日志配置文件 vi /etc/rsyslog.conf
cron.*    /var/log/cron.log #将cron前面的注释符去掉
重启rsyslog 
service rsyslog  restart
查看日志文件
tail -f /var/log/cron.log
 
 
 

7、恢复数据库导入

 
按照位置生成恢复日志
show master status ;  查询出当前位置和日志文件
 
show binlog events in 'mysql-bin.000115';  查看日志文件对应的操作
 
mysqlbinlog  --stop-position=514 /opt/mysqlbackup/daily/mysql-bin.000114>backup.sql
 
 
按照时间恢复
mysqlbinlog --start-datetime='2019-11-26 16:26:03' --stop-datetime='2019-11-27 10:34:00' /opt/mysqlbackup/daily/mysql-bin.000122 >backup.sql
 
 
将sql文件重新执行一遍用作恢复
mysql -uroot -p123456 mysql<backup.sql
 
 

8、还原数据太慢解决方法

 
 
1.查看变量 innodb_flush_log_at_trx_commit的值
SHOW  VARIABLES LIKE 'innodb_flush_log_at_trx_commit' ;
 
2.查询结果如果是1的话,将其修改成0
SET GLOBAL innodb_flush_log_at_trx_commit =0;
 
3.这时候再source,会发现速度快了很多,在结束后记得把这个变量重新设置成1
SET GLOBAL innodb_flush_log_at_trx_commit =1;
 
 
速度虽然快了很多,但是不安全,所以导入完之后需要把参数改回去
 
 

9、查看系统操作日志

 
show variables like 'general_log_file';
 
进入mysql把日志拷贝出来
docker cp mysql:/var/lib/mysql/cfedc2a3bf2a.log /opt/mysqlbackup/
 
 

10、查看logbin

show binary logs;
show variables like '%log_bin%';
show master status ;
 
 
服务器部署的时候记得进入容器启动cron服务
 
 
 
 
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章