1、创建备份数据库容器(参考监控相关下面的mysql安装)
# 建立挂载的数据卷
# 虚拟机 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服务