Linux-定时脚本将一台服务器上的mysql数据库自动备份到另一台服务器的数据库中

Linux-定时脚本将一台服务器上的mysql数据库自动备份到另一台服务器的数据库中

有两台服务器,一台正式服务器A,一台测试服务器B,现需要将正式服务器A中的数据库每天备份到测试服务器B,提高数据库的容灾性以及防止数据库在测试中出现错误。

1.从正式服务器A中导出需要备份的数据库

使用mysqldump指令导出数据库文件

/usr/sbin/mysqldump -u root -ppassword database | gzip > bakdatabaseName.sql.gz

password为数据库密码,database为需要备份的数据库名

2.将备份的数据库文件发送至测试服务器B

使用scp指令发送备份的数据库文件

scp bakdatabaseName.sql.gz root@测试服务器B的IP:/root/mysqlbak/bakdatabaseName.sql.gz

该操作需要输入测试服务器B的密码,所以通过另外一个expect脚本实现与终端的交互从而实现自动输入密码,expect需要安装。

3.通过expect脚本实现运行scp指令后自动输入密码

 

#!/usr/bin/expect

#FileName:scp.exp

set timeout 60

if { [llength $argv] < 2} {

puts "Usage:"

puts "$argv0 local_file remote_path"

exit 1

}

set local_file [lindex $argv 0]

set remote_path [lindex $argv 1]

set passwd yourpassword

set passwderror 0

spawn scp $local_file $remote_path

expect {

"*assword:*" {

if { $passwderror == 1 } {

puts "passwd is error"

exit 2

}

set timeout 1000

set passwderror 1

send "$passwd\r"

exp_continue

}

"*es/no)?*" {

send "yes\r"

exp_continue

}

timeout {

puts "connect is timeout"

exit 3

}

}

 

只需将代码中的yourpassword改为测试服务器B的密码,配置完之后运行下面指令

/usr/sbin/scp.exp bakdatabaseName.sql.gz root@测试服务器B的IP:/root/mysqlbak/bakdatabaseName.sql.gz

完整代码

bakmysql.sh

#!/bin/bash

    backupdir=/home/backup

    mysql_bin_dir=/usr/bin    #mysqldump的路径

    databaseName=test    #备份的数据库名字

    bakdatabaseName=backup_test    #备份的数据库全部表的文件名

    mysqluser=root    #正式服务器A的mysql用户名

    [email protected]    #正式服务器A的mysql密码

    targetServerUser=root    #测试服务器B的用户名

    targetServerIP=172.16.3.35    #测试服务器B的IP地址

    targetpath=/home/backup    #测试服务器B备份路径

    time=`date +%Y%m%d`    #当天的日期年月日

#从数据库导出数据库备份文件

 $mysql_bin_dir/mysqldump -u$mysqluser -p$mysqlpwd $databaseName | gzip > $backupdir/$bakdatabaseName$time.sql.gz

#保留3天内的备份文件,时间可通过-mtime 后的 +2 修改

    find $backupdir -name "$bakdatabaseName*.sql.gz" -type f -mtime +2 -exec rm -f {} \; > /dev/null 2>&1

#将备份文件发送到测试服务器B

    /home/backup/scp.exp $backupdir/$bakdatabaseName$time.sql.gz $targetServerUser@$targetServerIP:$targetpath/$bakdatabaseName$time.sql.gz

添加脚本执行权限

chmod a+x /home/backup/scp.exp

chmod a+x /home/backup/bakmysql.sh

  #添加脚本执行权限

5、编辑系统任务执行计划

crontab -e

#输入一下信息“:

00 01 * * * /DATA/bakdata/bakdata.sh#每天凌晨1点,以oracle用户执行ordatabak.sh备份文件

:wq! #保存退出

#重启crontab

service crond restart

#从此每天的凌晨1点 系统会自动完成数据库的备份,压缩,并上传到远程服务器的指定路径下!

 

4.将备份的数据库文件导入到测试服务器B的mysql中

gzip -dc /root/mysqlbak/bakdatabaseName.sql.gz | mysql -u user -ppasswd database

完整代码

#!/bin/bash

# FileName:updatemysql.sh

# This is a ShellScript For Auto DB Backup and Delete old Backup

#

backupdir=/root/mysqlbak           #测试服务器B数据库备份文件路径

mysql_bin_dir=/usr/sbin            #测试服务器B的mysql的安装路径

databaseName=database              #数据库名字

bakdatabaseName=database_bak_      #备份的数据库的文件名

mysqluser=user                     #测试服务器B的mysql用户名

mysqlpwd=passwd                    #测试服务器B的mysql密码

time=` date +%Y%m%d `              #当天的日期:年月日

#先删除前一天的数据库

$mysql_bin_dir/mysql -u $mysqluser -p$mysqlpwd -e "drop database $databaseName;"

#创建新的数据库

$mysql_bin_dir/mysql -u $mysqluser -p$mysqlpwd -e "create database $databaseName;"

#将备份的数据库文件导入到mysql中

gzip -dc $backupdir/$bakdatabaseName$time.sql.gz | $mysql_bin_dir/mysql -u $mysqluser -p$mysqlpwd $databaseName

#保留3天内的备份文件,时间可通过-mtime 后的 +2 修改

find $backupdir -name "*.sql.gz" -type f -mtime +2 -exec rm -f {} \; > /dev/null 2>&1

 

将updatemysql.sh加入到测试服务器B的crontab定时任务中,定时时间要比bakmysql.sh的定时时间晚一些

注意:

1. 正式服务器A的mysql版本要比测试服务器B的mysql版本高,否则导入会失败

2. 数据库备份文件导入时由于数据量很大,会出现连接超时

    需要修改mysql配置文件/etc/my.cnf

    将[mysqld]中的max_allowed_packet 修改大一点 如20M

    max_allowed_packet = 20M

    重启mysql

    service mysqld restart

    如果还是出现连接超时

    在/etc/my.cnf添加以下代码

 

    [mysqldump]

    quick

    max_allowed_packet = 16M

感谢:

https://blog.csdn.net/ffortunateoy/article/details/79384036

https://blog.csdn.net/qq_35912734/article/details/78903760

https://www.cnblogs.com/intval/p/5763929.html

你可能感兴趣的:(数据库初级)