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 ...
随机推荐
- php爬取微信文章内容
php爬取微信文章内容 在做官网升级的时遇到新的需求,需要将公司公众号文章显示在官网的文章模块下.但存在的问题是:微信文章的链接会失效,并且需要对文章部分内容做修改,同时要减少微信运营人员的工作量,避 ...
- 【死磕 Spring】----- IOC 之 获取验证模型
原文出自:http://cmsblogs.com 在上篇博客[死磕Spring]----- IOC 之 加载 Bean 中提到,在核心逻辑方法 doLoadBeanDefinitions()中主要是做 ...
- js原生数组去重
// ['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b']; 取消重复的元素 数组去重 (for循环) // 把旧数组里面 不重复的元素选取出来放到新数组中 重复 ...
- vue2.0 配置环境总结(都是泪啊)
最近有点空闲时间,终于把一直想学的vue提上了日程,以下是收集的一些帮助入门的链接 1:https://vuefe.cn/v2/guide/ vue2.0中文官网 2:https://router.v ...
- Python爬虫入门教程 51-100 Python3爬虫通过m3u8文件下载ts视频-Python爬虫6操作
什么是m3u8文件 M3U8文件是指UTF-8编码格式的M3U文件. M3U文件是记录了一个索引纯文本文件, 打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放. ...
- 配置完IDEA开发lua后用idea竟然打不开lua的文件。
1.文件没关联上 File > setting > File Types 完成后即可打开lua文件
- javaScript设计模式之面向对象编程(object-oriented programming,OOP)--寄生组合式继承
组合式继承:将类式继承同构造函数继承组合使用,但是存在一个问题,子类不是父类的实例,而子类的原型式父类的实例,所以才有了寄生组合式继承. 意思就是说,寄生就是寄生式继承,寄生式继承就是依托于原型继承, ...
- Ubuntu16.04 部署配置GO语言开发环境 & 注意事项
1. 安装GO 安装go语言包: $ curl -O https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz 下载完成后 ...
- Java中的基本类型转换,数据溢出原理
java中的数据类型 java是一种强类型语言,在java中,数据类型主要有两大类,基本数据类型和引用数据类型,不同的数据类型有不同的数据存储方式和分配的内存大小. 基本数据类型中,各数据类型所表示的 ...
- 【Javascript】JS遍历数组的三种方法:map、forEach、filter
前言 近一段时间,因为项目原因,会经常在前端对数组进行遍历.处理,JS自带的遍历方法有很多种,往往不加留意,就可能导致知识混乱的现象,并且其中还存在一些坑.前端时间在ediary中总结了js原生自带的 ...