定时备份
MySQL备份脚本 mysql_backup.sh
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
retain_files_num=10
log=/data/backup/mysql/mysql_backup.log
time_str=`date "+%Y_%m_%d_%H_%M_%S"`
# 清理日志文件 mysql_backup.log
log_size=`ls -la /data/backup/mysql/mysql_backup.log | awk '{print $5}'`
# 如果文件大于30M,那么删除
if [ $log_size -ge 31457280 ]
then
rm -rf /data/backup/mysql/mysql_backup.log
printf "`date "+%Y-%m-%d %H:%M:%S"` mysql_backup.log size $log_size 大于30M 删除此文件\n" >> ${log}
else
printf "`date "+%Y-%m-%d %H:%M:%S"` mysql_backup.log size $log_size 小于30M 不做处理\n" >> ${log}
fi
# 备份mysql数据
echo "`date "+%Y-%m-%d %H:%M:%S"` 开始备份,本次备份的文件是 ${time_str}.sql" >> ${log}
docker exec mysql_server mysqldump -hip -P3306 -uroot -p'密码' --single-transaction -E -R --triggers --all-databases --master-data=2 --add-drop-database --add-drop-table --verbose > /data/backup/mysql/${time_str}.sql
echo "`date "+%Y-%m-%d %H:%M:%S"` 结束备份" >> ${log}
# 删除旧的备份
files=`ls -lt /data/backup/mysql/ | grep sql | grep -v sh | grep -v log | awk '{print $NF}'`
num=0
for one_file in ${files}
do
((num++))
echo "`date "+%Y-%m-%d %H:%M:%S"` 循环处理文件 num: ${num} one_file: ${one_file}" >> ${log}
if [ ${num} -le ${retain_files_num} ]
then
echo "`date "+%Y-%m-%d %H:%M:%S"` 文件${one_file} 符合最新的${retain_files_num}个范围内,保留" >> ${log}
continue
fi
echo ${one_file} | grep sql >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "`date "+%Y-%m-%d %H:%M:%S"` 文件${one_file} 超过最新的${retain_files_num}个范围内,删除" >> ${log}
rm -rf /data/backup/mysql/${one_file}
else
echo "`date "+%Y-%m-%d %H:%M:%S"` 文件${one_file} 不包含sql字符,不删除" >> ${log}
fi
done
echo "" >> ${log}
echo "" >> ${log}
crontab任务
crontab -e
#每日1点、13点执行
0 1,13 * * * sh /data/backup/mysql/mysql_backup.sh
一次性迁移(备份)、设置主从(mysqldump)
在master上执行
mysqldump -h127.0.0.1 -P3306 -uroot -p'xxxx' --single-transaction -E -R --triggers --all-databases --master-data=2 --add-drop-database --add-drop-table --verbose> xxx.sql
在slave上执行
reset master;
stop slave;
reset slave all;
show slave status\G;
change master to master_auto_position=0;
mysql -h 127.0.0.1 -P3306 -uroot -p'xxxx' -e 'reset master; source xxx.sql;'
CHANGE MASTER TO MASTER_HOST='xxxx', MASTER_PORT=3306, MASTER_USER='slave', MASTER_PASSWORD='xxxx', master_auto_position=1;
start slave;
一次性迁移(备份)、设置主从(xtrabackup)
在master上导出
xtrabackup --host=ip --port=3306 --user=root --password='xxx' --backup --target-dir=备份的目录 --datadir=mysql数据目录
传到另外一台机器
scp -r
在另一台恢复
停掉mysql
mysql原目录删除,或者mv移动
xtrabackup --decompress --target-dir=备份的目录
xtrabackup --prepare --target-dir=备份的目录
xtrabackup --copy-back --target-dir=备份的目录 --datadir=将要恢复的mysql数据目录
查看备份的目录/xtrabackup_info,找到GTID of the last change 'xxx'
启动mysql
登录mysql命令行
reset master;
stop slave;
reset slave all;
show slave status\G;
change master to master_auto_position=0;
SET @@GLOBAL.GTID_PURGED='xxx'
CHANGE MASTER TO MASTER_HOST='xxx', MASTER_PORT=3306, MASTER_USER='slave', MASTER_PASSWORD='xxx', master_auto_position=1;
再检查
show slave status\G;
start slave;
解决 Relay log read failure ...
排查是否是relay 文件损坏 stackoverflow.com/questions/7…
解决 从库的relay log文件损坏
1、删除从库的relay log
2、重启从库
3、如果不行,那么从库设置
stop slave;
reset slave all;
CHANGE MASTER TO MASTER_HOST='xxxx', MASTER_PORT=3306, MASTER_USER='slave', MASTER_PASSWORD='xxxx', master_auto_position=1;
start slave;
4、再观察
5、如果开始复制了,但出现了主键冲突错误,加上--slave-skip-errors=1062 启动
6、待从库复制追上后,再去掉--slave-skip-errors参数