• 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
    View Code

    二,准备脚本

    前戏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-06
    tar -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.000014
    cat 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日志中有删除数据库语句的行数,当前为728
    mysql -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
  • 相关阅读:
    Android开发之无线遥控器
    那些有意思的代码
    更改Android编译软件版本(make/gcc/bision)
    ubuntu16.04安装virtualbox5.1失败 gcc:error:unrecognized command line option ‘-fstack-protector-strong’
    Android编译环境折腾记
    BM25相关度打分公式
    javascript作用域
    javascript 中关于call方法的详解。
    JavaScript RegExp 对象
    vue runtime 问题
  • 原文地址:https://www.cnblogs.com/charon2/p/10382140.html
Copyright © 2020-2023  润新知