mysql容灾备份脚本
一,环境需求
**安装前准备
操作系统环境:Centos 7.2
[root@localhost soft]# rpm -qa | grep mariadb
[root@localhost soft]# rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
[root@localhost soft]# rpm -e --nodeps mariadb-5.5.60-1.el7_5.x86_64
[root@localhost soft]# rpm -e --nodeps mariadb-server-5.5.60-1.el7_5.x86_64
1、解决依赖包并下载源码包至/soft/目录下
yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bison
cd /soft/
wget https://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
tar -zxvf boost_1_59_0.tar.gz #解压
mv boost_1_59_0 /usr/local/boost #移动至/usr/local/boost/目录下
wget http://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz
tar -zxvf mysql-5.7.17.tar.gz
2、新建MySQL用户和用户组,创建/data/mysql 目录存放mysql数据
groupadd -r mysql && useradd -r -g mysql -s /sbin/nologin -M mysql
mkdir -pv /data/mysql
3、预编译及编译安装
cd mysql-5.7.17
[root@node03 mysql-5.7.17]#
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock\
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BOOST=/usr/local/boost \
-DMYSQL_USER=mysql \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
注:
DCMAKE_INSTALL_PREFIX=/usr/local/mysql:安装路径
DMYSQL_DATADIR=/data/mysql:数据文件存放位置
DSYSCONFDIR=/etc:my.cnf路径
DWITH_MYISAM_STORAGE_ENGINE=1:支持MyIASM引擎
DWITH_INNOBASE_STORAGE_ENGINE=1:支持InnoDB引擎
DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock:连接数据库socket路径
DMYSQL_TCP_PORT=3306:端口
DENABLED_LOCAL_INFILE=1:允许从本地导入数据
DWITH_PARTITION_STORAGE_ENGINE=1:安装支持数据库分区
DEXTRA_CHARSETS=all:安装所有的字符集
DDEFAULT_CHARSET=utf8:默认字符
DWITH_EMBEDDED_SERVER=1:嵌入式服务器
[root@node03 mysql-5.7.17]# make
[root@node03 mysql-5.7.17]#make install #编译安装
[root@mysqltest ~]# chown -R root.mysql /usr/local/mysql/
[root@mysqltest ~]# chown -R root.mysql /data/mysql/
错误
错误1: CMake Error: your C compiler: "CMAKE_C_COMPILER-NOTFOUND" was not found. Please set CMAKE_C_COMPILER to a valid compiler path or name.
CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Please set CMAKE_CXX_COMPILER to a valid compiler path or name.
CMake Error at cmake/os/Linux.cmake:41 (MESSAGE):
Unsupported compiler!
Call Stack (most recent call first):
CMakeLists.txt:162 (INCLUDE) 解决办法: # yum groupinstall -y "Development Tools" "Server Platform Development" "Desktop Platform Development" 错误2: CMake Error at cmake/readline.cmake:64 (MESSAGE):
Curses library not found. Please install appropriate package, 解决办法: [root@node02 ~]# yum install -y ncurses-devel.x86_64
后续
初始化数据库
[root@mysql57 ~]#/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql 错误:
如果datadir目录有文件,则会报以下错:
[root@localhost mysq]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
2019-02-15T05:55:08.647604Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-02-15T05:55:08.647656Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2019-02-15T05:55:08.647660Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2019-02-15T05:55:08.649468Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2019-02-15T05:55:08.649496Z 0 [ERROR] Aborting
所以要把data directory文件删除掉再执行,如果删除目录下的文件还是报同样的错,可以试试把目录删除掉,再创建一个,然后授权:
vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=Mysql
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/mysql/data/XXX.pid
ExecStart=/usr/local/mysql/support-files/mysql.server start
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=false
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
报错
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/ecapp/data_mysql/mysql.sock-DENABLED_LOCAL_INFILE=1' (2)
解决办法
ln -s mysql.sock /ecapp/data_mysql/mysql.sock-DENABLED_LOCAL_INFILE=1
复制MySQL配置文件
[root@node02 ~]# cd /usr/local/mysql/support-files/
[root@node02 support-files]# cp my-default.cnf /etc/my.cnf
[root@node02 support-files]# vim /etc/my.cnf
[mysqld]
...
basedir=/usr/local/mysql
datadir=/data/mysql
port=3306
server_id=121
socket=/data/mysql/mysql.sock
启动mysql服务
[root@mysqltest data]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
[root@mysqltest data]# ss -antp | grep mysqld
LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=63756,fd=20))
[root@mysqltest data]#
修改环境变量PATH
[root@mysqltest data]# cat /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin [root@mysqltest data]# source /etc/profile.d/mysql.sh
[root@mysqltest data]# mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Www.1.com';
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
设置源码mysql服务开机自启动
# vim /etc/rc.d/rc.local
/usr/local/mysql/bin/mysqld_safe --user=mysql &
[root@node02 bin]# chmod a+x /etc/rc.d/rc.local
复制mysql服务控制脚本 [root@db_server_01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@db_server_01 ~]# chmod a+x /etc/init.d/mysqld [root@db_server_01 ~]# chkconfig --add mysqld >>>将mysqld服务添加为系统服务
[root@db_server_01 ~]# chkconfig --level 2345 mysqld on >>>设置mysqld服务开机自启动
2345:
linux启动模式
3:字符模式
5:图形模式
2:字符,无网络
4:预留
编辑/etc/my.cnf文件添加在[mysqld]版块下添加如下变量,添加后重启服务。
#开启,并且可以将mysql-bin改为其它的日志名
log-bin=mysql-bin #添加id号,如果做主从,就不能一样
server-id=1 #超过200M将生产新的文件,最大和默认值是1GB
max_binlog_size=1G #此参数表示binlog使用最大内存的数,默认1M。
max_binlog_cache_size=1M #此参数表示binlog日志保留的时间,默认单位是天。
expire_logs_days=7
二,准备脚本
前戏mkdir -pv /ops/{bak,log}
1.全量脚本:mybak-all.sh,对脚本变量部分进行配置
#!/bin/bash #使用:./xx.sh -uroot -p'123456',使用前修改脚本进行变量配置 #过程:备份并刷新binlog,将最新的binlog文件名记录并整体压缩打包 #恢复:先进行全量备份,再对根据tim-binlog.txt中的记录,进行逐个恢复 #提示:最多每分钟执行一次,否则会覆盖同分钟内的文件,可以修改脚本来改善 # 出现问题会退出,可以到指定的日志目录查看日志输出 # 同年的tar包超过指定天数的会删除掉 #[变量] begin_time=`date +%F-%H-%M-%S` my_sql="/usr/local/mysql/bin/mysql" bak_sql="/usr/local/mysql/bin/mysqldump" binlog_dir=/data/mysql/ bak_dir=/ops/bak log_dir=/ops/log/mybak-all.log
#保存的天数,4周就是28天 save_day=28 #[自动变量] #当前年月 date_nian=`date +%Y-`
#所有天数的数组 save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days "+%F";done)) #开始 /usr/bin/echo >> ${log_dir} /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:开始全备份" >> ${log_dir} #检查 ${my_sql} $* -e "show databases;" &> /tmp/info_error.txt if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:登陆命令错误" >> ${log_dir} /usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息 exit 1 fi #移动到目录 cd ${bak_dir} bak_time=`date +%F-%H-%M` bak_timetwo=`date +%F` #备份 ${bak_sql} $* --all-databases --flush-privileges --single-transaction --flush-logs --triggers --routines --events --hex-blob > mybak-all-${bak_time}.sql if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:备份失败" /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:备份失败" >> ${log_dir} /usr/bin/cat /tmp/bak_error.txt #如果错误则显示错误信息 exit 1 else bin_dian=`tail -n 1 ${binlog_dir}/mysql-bin.index` echo "${bin_dian}" > ${bak_time}-binlog.txt fi #压缩 if [[ -f mybak-all-${bak_time}.tar.gz ]];then /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:压缩包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir} /usr/bin/rm -irf mybak-all-${bak_time}.tar.gz ${bak_sql}-binlog.txt fi /usr/bin/tar -cf mybak-all-${bak_time}.tar.gz mybak-all-${bak_time}.sql ${bak_time}-binlog.txt if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date +%F-%H-%M-%S) error:压缩失败" >> ${log_dir} exit 1 fi #删除sql文件 /usr/bin/rm -irf mybak-all-${bak_time}.sql ${bak_time}-binlog.txt if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:删除sql文件失败" >> ${log_dir} exit 1 fi #整理压缩的日志文件 for i in `ls | grep .tar.gz$` do echo $i | grep "^mybak-all.*tar.gz$" &> /dev/null if [[ $? -eq 0 ]];then a=`echo ${i%%.tar.gz}` b=`echo ${a:(-16)}` c=`echo ${b%-*}` d=`echo ${c%-*}` #看是否在数组中,不在则删除 echo ${save_day_zu[*]} |grep -w $d &> /dev/null if [[ $? -ne 0 ]];then [[ "$d" != "$bak_timetwo" ]] && rm -rf $i fi else #不是当月的,其他类型压缩包,跳过 continue fi done #结束 last_time=`date +%F-%H-%M-%S` /usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir} /usr/bin/echo "time:$(date +%F-%H-%M-%S) info:全备份完成" >> ${log_dir} /usr/bin/echo >> ${log_dir}
2.增量脚本:mybak-section.sh
#!/bin/bash
#使用:./xx.sh -uroot -p'123456',将第一次增量备份后的binlog文件名写到/tmp/binlog-section中,若都没有,自动填写mysql-bin.000001
#过程:增量先刷新binlog日志,再查询/tmp/binlog-section中记录的上一次备份中最新的binlog日志的值
# cp中间的binlog日志,并进行压缩。再将备份中最新的binlog日志写入。
#恢复:先进行全量恢复,再根据全量备份附带的time-binlog.txt中的记录逐个恢复。当前最新的Binlog日志要去掉有问题的语句,例如drop等。
#提示:最多每分钟执行一次,否则会覆盖同分钟内的文件,可以修改脚本来改善
# 出现问题会退出,可以到指定的日志目录查看日志输出
# 同年的tar包超过指定天数的会删除掉
#[变量]
begin_time=`date +%F-%H-%M-%S`
my_sql="/usr/local/mysql/bin/mysql"
bak_sql="/usr/local/mysql/bin/mysqldump"
binlog_dir=/data/mysql/
binlog_index=${binlog_dir}/mysql-bin.index
bak_dir=/ops/bak
log_dir=/ops/log/mybak-section.log
#保存的天数,4周就是28天
save_day=7
#[自动变量]
#当前年
date_nian=`date +%Y-`
#所有天数的数组
save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days "+%F";done))
#开始
/usr/bin/echo >> ${log_dir}
/usr/bin/echo "time:$(date +%F-%H-%M-%S) info:开始增量备份" >> ${log_dir}
#检查
${my_sql} $* -e "show databases;" &> /tmp/info_error.txt
if [[ $? -ne 0 ]];then
/usr/bin/echo "time:$(date +%F-%H-%M-%S) info:登陆命令错误" >> ${log_dir}
/usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息
exit 1
fi
#移动到目录
cd ${bak_dir}
bak_time=`date +%F-%H-%M`
bak_timetwo=`date +%F`
#刷新
${my_sql} $* -e "flush logs"
if [[ $? -ne 0 ]];then
/usr/bin/echo "time:$(date +%F-%H-%M-%S) error:刷新binlog失败" >> ${log_dir}
exit 1
fi
#获取开头和结尾binlog名字
last_bin=`cat /tmp/binlog-section`
next_bin=`tail -n 1 ${binlog_dir}/mysql-bin.index`
echo ${last_bin} |grep 'mysql-bin' &> /dev/null
if [[ $? -ne 0 ]];then
echo "mysql-bin.000001" > /tmp/binlog-section #不存在则默认第一个
last_bin=`cat /tmp/binlog-section`
fi
#截取需要备份的binlog行数
a=`/usr/bin/sort ${binlog_dir}/mysql-bin.index | uniq | grep -n ${last_bin} | awk -F':' '{print $1}'`
b=`/usr/bin/sort ${binlog_dir}/mysql-bin.index | uniq | grep -n ${next_bin} | awk -F':' '{print $1}'`
let b--
#输出最新节点
/usr/bin/echo "${next_bin}" > /tmp/binlog-section
#创建文件
rm -rf mybak-section-${bak_time}
/usr/bin/mkdir mybak-section-${bak_time}
for i in `sed -n "${a},${b}p" ${binlog_dir}/mysql-bin.index | awk -F'./' '{print $2}'`
do
if [[ ! -f ${binlog_dir}/${i} ]];then
/usr/bin/echo "time:$(date +%F-%H-%M-%S) error:binlog文件${i} 不存在" >> ${log_dir}
exit 1
fi
cp -rf ${binlog_dir}/${i} mybak-section-${bak_time}/
if [[ ! -f mybak-section-${bak_time}/${i} ]];then
/usr/bin/echo "time:$(date +%F-%H-%M-%S) error:binlog文件${i} 备份失败" >> ${log_dir}
exit 1
fi
done
#压缩
if [[ -f mybak-section-${bak_time}.tar.gz ]];then
/usr/bin/echo "time:$(date +%F-%H-%M-%S) info:压缩包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir}
/usr/bin/rm -irf mybak-section-${bak_time}.tar.gz
fi
/usr/bin/tar -cf mybak-section-${bak_time}.tar.gz mybak-section-${bak_time}
if [[ $? -ne 0 ]];then
/usr/bin/echo "time:$(date +%F-%H-%M-%S) error:压缩失败" >> ${log_dir}
exit 1
fi
#删除binlog文件夹
/usr/bin/rm -irf mybak-section-${bak_time}
if [[ $? -ne 0 ]];then
/usr/bin/echo "time:$(date +%F-%H-%M-%S) info:删除sql文件失败" >> ${log_dir}
exit 1
fi
#整理压缩的日志文件
for i in `ls | grep "^mybak-section.*tar.gz$"`
do
echo $i | grep ${date_nian} &> /dev/null
if [[ $? -eq 0 ]];then
a=`echo ${i%%.tar.gz}`
b=`echo ${a:(-16)}` #当前日志年月日
c=`echo ${b%-*}`
d=`echo ${c%-*}`
#看是否在数组中,不在其中,并且不是当前时间,则删除。
echo ${save_day_zu[*]} |grep -w $d &> /dev/null
if [[ $? -ne 0 ]];then
[[ "$d" != "$bak_timetwo" ]] && rm -rf $i
fi
else
#不是当月的,其他类型压缩包,跳过
continue
fi
done
#结束
last_time=`date +%F-%H-%M-%S`
/usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir}
/usr/bin/echo "time:$(date +%F-%H-%M-%S) info:增量备份完成" >> ${log_dir}
/usr/bin/echo >> ${log_dir}
周六晚3点i分进行全量备份 周一到周六每天进行增量备份, 全量保存4周 增量保存近一周的每天数据
crontab -e 添加计划任务。
1 3 * * 6 /bin/bash /shell/mybak-all.sh -uroot -p'Www.1.com'
1 2 * * * /bin/bash /shell/mybak-section.sh -uroot -p'Www.1.com'
三.容灾测试
准备
按照第一步,环境需求中,将mysql开启binlog并重启
vim /shell/mybak-all.sh,将全量脚本复制到其中,并 chmod+ x /shell/mybak-all.sh 添加执行权限。
vim /shell/mybak-section.sh,将增量脚本复制到其中,并 chmod +x /shell/mybak-section.sh 添加执行权限
创建测试数据库create database test;
切换数据库use test;
创建测试表create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);
用 vim /root/bin/testsql.sh 命令创建一个数据插入脚本,随机插入一千条数据用于测试。
#!/bin/bash
ku=one
biao=s1 zi() {
zu=(q w e r t y u i o p a s d f g h j k l z x c v b n m) for i in `seq 1 5`
do
a=`echo $[RANDOM%24]`
echo -n ${zu[a]}
done
} for i in `seq 1 1000`
do
b=`zi`
mysql -uroot -p'Www.1.com' -e "use test;insert into s1(name,age) values('${b}',${i});"
done
执行脚本bash /shell/testsql.sh
用如下命令检查表的条目数是否是1000条mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"
测试
第一次:
更改时间date -s 2016-04-04
执行全量脚本bash /shell/mybak-all.sh -uroot -p'Www.1.com'
再执行增量脚本bash /shell/mybak-section.sh -uroot -p'Www.1.com'
查看是否有2个tar包。可以看到tar包ls /ops/bak
mybak-all-2016-04-04-00-00.tar.gz
mybak-section-2016-04-04-00-00.tar.gz
执行脚本插入1000条数据bash /shell/testsql.sh
用如下命令检查表的条目数是否是2000条mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"
第二次:
更改时间date -s 2016-04-05
执行全量脚本bash /shell/mybak-all.sh -uroot -p'Www.1.com'
再执行增量脚本bash /shell/mybak-section.sh -uroot -p'Www.1.com'
用查看是否有4个tar包。可以看到如下ls /ops/bak
mybak-all-2016-04-04-00-00.tar.gz / mybak-section-2016-04-04-00-00.tar.gz
mybak-all-2016-04-05-00-00.tar.gz / mybak-section-2016-04-05-00-00.tar.gz
执行脚本插入1000条数据bash /shell/testsql.sh
用如下命令检查表的条目数是否是3000条mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"
第三次
更改时间date -s 2016-04-06
执行全量脚本bash /shell/mybak-all.sh -uroot -p'Www.1.com'
再执行增量脚本bash /shell/mybak-section.sh -uroot -p'Www.1.com'
用查看是否有4个tar包。可以看到如下ls /ops/bak
mybak-all-2016-04-04-00-00.tar.gz / mybak-section-2016-04-04-00-00.tar.gz
mybak-all-2016-04-05-00-00.tar.gz / mybak-section-2016-04-05-00-00.tar.gz
mybak-all-2016-04-06-00-00.tar.gz / mybak-section-2016-04-06-00-00.tar.gz
执行脚本插入1000条数据bash /shell/testsql.sh
用如下命令检查表的条目数是否是4000条mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"
误删除
删除:
登陆mysql服务器
mysql -uroot -p’Www.1.com’
删除test数据库,用来模拟误操作drop database test;
恢复第一步:准备
移动到备份所在的目录cd /ops/bak
解开最近时间点的全量备份包,最近时间是2016-04-06tar -xf mybak-all-2016-04-06-00-00.tar.gz
解压后可以看到 mybak-all-2016-04-06-00-00.sql 和 2016-04-06-00-00-binlog.txt
其中mybak-all-2016-04-06-00-00.sql 是sql语句,用于恢复某个时间点的全部内容,如果只误操作某个库,可以单独恢复某个库。2016-04-06-00-00-binlog.txt中记录了全备过程中刷新的Binlog文件名。
解压增量备份的文件夹 ,因为这2个脚本是先后执行的,所以不需要解压6号前的,只解压6号及以后的。tar -xf mybak-section-2016-04-06-00-00.tar.gz
解压后可以看到 mysql-bin.000008 和 mysql-bin.000009 2个binlog日志
恢复第二步:全备份恢复
导入数据进去mysql -uroot -p'Www.1.com' < mybak-all-2016-04-06-00-00.sql
用如下命令检查表的条目数是否是3000条,6号备份完成后,才添加的最后1000条。mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"
恢复第三步:增量恢复
查看应该从哪个binlog文件恢复。当前获得 ./mysql-bin.000014cat 2016-04-06-00-00-binlog.txt
将 mybak-section-2016-04-06-00-00 文件夹中的 mysql-bin.000014 恢复,因为操作有问题的binlog日志在15中,14日志可以直接用于恢复mysqlbinlog mybak-section-2016-04-06-00-00/ysql-bin.000014 | mysql -uroot -p'Www.1.com'
检查表的条目数是否是3000条,因为在写入3000条后,mysqldmp全备刷新了一下binlog,这个最新的是14,而还没有写入任何东西时便执行增量备份了,刷新了一下binlog,最新的是15,这时候才导入了最新的1000条。如果是持续的在写入,恢复14后会有数据变化。mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"
在mysql数据目录/ops/server/mysql/data/下找到mysql-bin.000015
找出binlog日志中有删除数据库语句的行数,当前为728mysql -uroot -p'Www.1.com' -e "show binlog events in 'mysql-bin.000015'\G" | grep -n "drop database "

找出728前后几行的内容,可以看到出现问题的pos点为5519,恢复到5519之前的数据即可。mysql -uroot -p'Www.1.com' -e "show binlog events in 'mysql-bin.000015'\G" | sed -n '715,730p'

进行恢复,stop-position是指定恢复截止的pos点。mysqlbinlog --stop-position=5519 mysql-bin.000015 | mysql -uroot -p'Www.1.com'
检查表的条目数是否是4000条mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"
报错:
[root@localhost mysql]# mysql -u root -p Enter password: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysqld.sock-DENABLED_LOCAL_INFILE=1' (2) 解决方法: [root@localhost mysql]# mv mysqld.sock mysqld.sock-DENABLED_LOCAL_INFILE=1
mysql容灾备份脚本的更多相关文章
- mysql 容灾备份
跨服务器备份: 服务器A:192.168.5.193 测试数据库TestDB 服务器B:192.168.5.194 目标:将服务器A上的测试数据库定时备份到服务器B中 需要技术:mysqldump + ...
- mysql数据库分库备份脚本
mysql数据库分库备份脚本 版本1 for dbname in `mysql -uroot -poldboy123 -e "show databases;" |grep -Evi ...
- MySQL binlog 自动备份脚本
MySQL binlog 自动备份脚本 1 利用shell进行备份 #!/bin/sh #mysql binlog backup script /usr/local/mysql/bin/mysqlad ...
- Redis全方位详解--磁盘持久化和容灾备份
序言 在上一篇博客中,博客介绍了redis的数据类型使用场景和redis分布式锁的正确姿势.我们知道一旦Redis重启,存在redis里面的数据就会全部丢失.所以这篇博客中向大家介绍Redis的磁盘持 ...
- 删库到跑路?还得看这篇Redis数据库持久化与企业容灾备份恢复实战指南
本章目录 0x00 数据持久化 1.RDB 方式 2.AOF 方式 如何抉择 RDB OR AOF? 0x01 备份容灾 一.备份 1.手动备份redis数据库 2.迁移Redis指定db-数据库 3 ...
- [运维笔记] Mysql单库备份脚本
工作中用到的Mysql单库备份Shell脚本,压缩备份,并在Crontab中添加计划任务,最多保存60天的备份 #!/bin/bash . /etc/profile USERNAME=zabbix P ...
- mysql完美增量备份脚本
是否因为mysql太大,来回备份浪费资源带宽而发愁,如果想解决这个麻烦就需要增量备份. vi /etc/my.cnf开启日志及定期清理日志log-bin=mysql-binbinlog_format= ...
- mysql 容灾 灾备 备份
一.数据备份 1.使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件.表的结构和表中的数据将存储在生成的文本文件中. mysqldump命令的工作原理很简单.它先 ...
- Python 生产环境MySQL数据库增量备份脚本
MySQL数据库常用的办法是通过MySQLdump导出sql进行备份,但是不适合数据量很大的数据库,速度,锁表是两个严重的问题.前面写了一遍文章介绍xtrabackup的热备工具,见 http://w ...
随机推荐
- requirement failed: Unacceptable value for property 'kafka.timeline.metrics.host_in_memory_aggregation', boolean values must be either 'true' or 'false
requirement failed: Unacceptable value for property 'kafka.timeline.metrics.host_in_memory_aggregati ...
- ambari2.6.50 openssl 版本问题:SSLError: Failed to connect. Please check openssl library versions. Openssl error upon host registration
I'm trying to register hostnames in Ambari but getting the error below. We tried to run yum update o ...
- MonacoEditor 主动触发代码提示功能
MonacoEditor是微软提供的代码编辑器 vscode即是使用它作为编辑器. 它的开发语言是ts,可以嵌入到浏览器中. 代码提示或者说代码补全功能是我们经常需要定制的部分. 目前它提供的快捷键是 ...
- emscripten、 WebAssembly,传递字符串给c函数
下面看具体的实例. 下面的代码是一个C函数,实现简单的字符串拼接,然后返回拼接的字符串. #include <stdio.h> #include <string> char* ...
- Spring的PropertyPlaceholderConfigurer强制使用默认值的坑
1.问题 dubbo client配置: <dubbo:reference id="channelCustomerClient" interface="com.gt ...
- 如何使用SignTool签署应用程序包
备注 有关签署UWP应用程序包的信息,请参阅使用SignTool签署应用程序包. 了解如何使用SignTool对Windows应用商店应用包进行签名,以便部署它们.SignTool是Windows软件 ...
- jdk安装 java环境配置
登录http://www.oracle.com,下载JDK(J2SE) JDK 1.0,1.1,1.2,1.3,1.4 1.5 (JDK5.0) à支持注解.支持泛型 1.6(JDK6.0) à Se ...
- LinkedBlockingQueue源码解析
上一篇博客,我们介绍了ArrayBlockQueue,知道了它是基于数组实现的有界阻塞队列,既然有基于数组实现的,那么一定有基于链表实现的队列了,没错,当然有,这就是我们今天的主角:LinkedBlo ...
- 【反编译系列】二、反编译代码(jeb)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 一般情况下我们都是使用dex2jar + jd-gui的方式反编译代码,在实际使用过程中,有时候发现反编译出来的代码阅读效果不是很好 ...
- 个人完善的springboot拦截器
import lombok.extern.slf4j.Slf4j; import org.manage.management.permission.interceptor.LoginIntercept ...