Ubuntu下MySQL数据库自执行备份脚本的实现

2017年11月18日 99 字 工作记录


为保证数据的安全,防止异常问题造成数据库文件破坏/丢失,大型项目通常需要每天执行1~2次数据库备份。
因为数据库的备份工作有其重复性和规律性,所以通过自执行脚本的方式可以提高备份的效率和可靠性。
本文介绍了在Ubuntu下设置mysql自动定时备份的方法。

1. 基本技术依据和系统环境

系统: Ubuntu 16.04系统
数据库: MySQL
主要实现语言: Shell脚本 +scp命令(SSH远程文件传输)

2. 主要实现步骤

2.1. 编写备份及远程存档脚本

2.1.1. 设置本地数据库备份文件储存位置并创建备份程序

在数据库服务器上设置一个专门用于保存数据库备份文件的路径,如mkdir /home/ubuntu/database_backup/mysqlDb_dumps/ 。后续脚本执行产生的备份文件即将保存在此路径下。

随后创建backup_mysql_database.sh文件,位置可自行定义,如本文则放置于/home/ubuntu/database_backup/路径下。

通过nano /home/ubuntu/database_backup/backup_mysql_database.sh 命令编辑脚本文件,开始编写程序。

2.1.2. 备份主程序的编写

  1. 首先定义几个常用的变量,在后续代码中可以直接引用:

     #预定义
     rq=`date +%Y%m%d-%H%M%S`
     ip=120-27-151-217
     new_file_path=${rq}
     user='dump'
     psw='db_dump@217#'
     dump_file_path_base_str=/home/ubuntu/database_backup/mysqlDb_dumps/
     dump_file_path_str=${dump_file_path_base_str}${new_file_path}'/'
    
  2. 以当前日期及时间为标识(为避免重名,可另行随意设计),创建一个子目录,用于保存当前时间生成的备份文件。

     cd ${dump_file_path_base_str}
     mkdir ${new_file_path}
    
  3. 使用mysqldump命令实现数据库备份及备份文件本地路径保存

主要命令脚本如下:

mysqldump -u<用户名> -p<密码> -h<host名称或ip地址> <要备份的数据库名称> ><生成备份脚本的文件命名与路径>.sql

如:

    #备份oa_supervaliant_database数据库
    db_name_1=oa_supervaliant_database
    dump_file_name_1=${dump_file_path_str}'mysqldb_'${ip}'_'${db_name_1}'_'${rq}
    mysqldump -u${user} -p${psw} -hlocalhost ${db_name_1}>${dump_file_name_1}.sql
    #备份information_schema数据库
    db_name_2=information_schema
    dump_file_name_2=${dump_file_path_str}'mysqldb_'${ip}'_'${db_name_2}'_'${rq}
    mysqldump -u${user}-p${psw} -hlocalhost ${db_name_2}>${dump_file_name_2}.sql

这段代码执行完,将会在/home/ubuntu/database_backup/mysqlDb_dumps/ 路径下生成一个以当前日期时间命名的文件夹,其中储存了上一步生成的数据库备份文件:

2.1.3. 使用scp命令打包备份文件并发送至远程地址

为了多一层数据安全保障,本地生成的数据库备份文件可以打包并发送至另一台服务器。
具体实现方式如下:

  1. 设置压缩文件的名称及储存位置

首先预定义压缩文件及文件路径等基本属性:

    dump_tar_file_name='mysqldb_'${ip}'_'${rq} #定义压缩文件命名
    cd ${dump_file_path_base_str} #进入备份文件路径,打包生成的文件将保存在此处
  1. 按照上一步的设置,打包前几步生成的数据库备份文件

     tar -cvf ${dump_tar_file_name}.tar ${dump_file_path_str} 
     #将最新生成的文件夹内全部sql备份文件打包
    
  2. 用scp命令发送打包好的包文件至指定远程服务器的ip及路径

scp命令及Linux免登陆传送文件技术见:https://shawn-nie.github.io/2017/11/18/Linux%E7%B3%BB%E7%BB%9F%E5%8F%91%E9%80%81%E6%9C%AC%E6%9C%BA%E6%96%87%E4%BB%B6%E8%87%B3%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8_%E4%BB%A5SSH%E6%96%B9%E5%BC%8F/

示例代码如下:

    #发送至120.27.151.228服务器
    remote_server1_ip=120.27.151.228
    remote_server1_file_addr=/usr/local/mysqlDB_dumps_remote/120-27-151-217/
    scp ${dump_file_path_base_str}${dump_tar_file_name}.tar root@${remote_server1_ip}:${remote_server1_file_addr}${dump_tar_file_name}.tar
    set timeout 300 

    #发送至118.89.106.215服务器
    remote_server2_ip=118.89.106.215
    remote_server2_file_addr=/usr/local/mysqlDB_dumps_remote/120-27-151-217/
    scp ${dump_file_path_base_str}${dump_tar_file_name}.tar root@${remote_server2_ip}:${remote_server2_file_addr}${dump_tar_file_name}.tar
    set timeout 300 

2.1.4. 附完整代码如下

    #预定义
    rq=`date +%Y%m%d-%H%M%S`;
    ip=47-100-64-208;
    new_file_path=${rq}; 
    dump_file_path_base_str=/home/ubuntu/database_backup/mysqlDb_dumps/;
    dump_file_path_str=${dump_file_path_base_str}${new_file_path}'/';
    
    cd ${dump_file_path_base_str};
    mkdir ${new_file_path};
    
    
    #备份选定MySQL数据库
    do_dump_MySQL_database(){
        ip=47-100-64-208;
        user=dump;
        psw=mysql_dump_psw;

        db_name=$1;
        dump_file_path_str=$2;
        new_file_path=$3;

        dump_file_name=${dump_file_path_str}'mysqldb_'${ip}'_'${db_name}'_'${new_file_path};
        echo ${dump_file_name};
    
        mysqldump -u${user} -p${psw} -hlocalhost ${db_name}>${dump_file_name}.sql;
    }
    #以scp命令发送文件至远程服务器
    scp_send_file_to_remote_server(){
        dump_file_path_base_str=$1;
        dump_tar_file_name=$2;
        remote_server_ip=$3;
        remote_server_file_addr=$4;
        
        scp ${dump_file_path_base_str}${dump_tar_file_name}.tar root@${remote_server_ip}:${remote_server_file_addr}${dump_tar_file_name}.tar;
    
        #set timeout 300;
    }
    
    
    #执行数据库备份并保存至本地路径
    ###备份oa_center_database中央数据库
    do_dump_MySQL_database oa_center_database ${dump_file_path_str} ${new_file_path};
    ###备份oa_database数据库
    do_dump_MySQL_database oa_database ${dump_file_path_str} ${new_file_path};
    
    #打包备份文件
    ##定义备份文件范围及新备份压缩文件名称路径
    dump_tar_file_name=mysqldb_${ip}_${rq};

    #执行打包
    cd ${dump_file_path_base_str};
    tar zcvfP ${dump_tar_file_name}.tar ${dump_file_path_str};
    

    #发送打包备份文件至其他服务器
    scp_send_file_to_remote_server ${dump_file_path_base_str} ${dump_tar_file_name} 106.15.226.150 /usr/local/mysqlDB_dumps_remote/${ip}/;
    scp_send_file_to_remote_server ${dump_file_path_base_str} ${dump_tar_file_name} 118.89.106.215 /usr/local/mysqlDB_dumps_remote/${ip}/;
    

2.2. 将执行脚本添加到系统任务列表

到这一步,数据库备份,备份文件远程传输等主要功能已完成,但需要手动执行,而不能自动执行。
如需设置脚本自动执行,则需要把计划任务添加到列表。系统每分钟会扫描一次任务列表,探测当前时间下是否有待执行的任务。
具体执行步骤如下:

2.2.1. 为脚本设置可执行权限

进入脚本文件所在路径,输入chmod +x <脚本文件名称>命令,授予这个文件的执行权限。
通过这一步设置,只要直接输入文件名称,脚本将会直接运行。

现在可以尝试运行脚本,确认脚本内容可正确执行(这是进行下一步设置的必要条件,否则脚本不会执行成功)。

在这一步测试中,脚本文件可能会报$'\r': command not found错误。这通常是因为脚本文件中的换行符出现了问题。通过sed -i 's/\r$//' <filename>命令,将脚本内容转为unix格式,即可修复。

2.2.2. 修改/etc/crontab文件,向系统计划任务清单中添加上述脚本

输入nano -w /etc/crontab命令,在列表中添加:

0 2  * * *   root  /home/ubuntu/database_backup/backup_mysql_database.sh 

表示每天2:00以root用户执行/home/ubuntu/database_backup/backup_mysql_database.sh

如需对脚本执行事件进行记录,可以将任务指向日志文件,如:

0 2  * * *   root  /home/ubuntu/database_backup/backup_mysql_database.sh >> /home/ubuntu/database_backup/backup_logs

2.2.3. 重启crontab,使其生效:

    /etc/init.d/cron restart

至此,上述脚本将在设定的时间下自动执行。