说明:
本文实现利用shell实现远程mysql数据库备份。通过在数据服务器mysqldump导出需要备份的数据库,scp拷贝到指定的备份服务器。为了不需要输入密码就能直接scp,这里,会先生成ssh key。
数据库服务器为A,用来远程存放备份的服务器为B
实现:
1.生成ssh key认证,避免SSH输入密码
openssh在A服务器用openssh生成一堆密钥
# ssh-keygen -d //passphrase一定留空,否则又要输入密码。会生成~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub文件 # chmod 600 ~/.ssh/id_rsa //设置属性 把~/.ssh/id_rsa.pub文件的内容复制后添加到B服务器用户目录~/.ssh/authorized文件里,设置属性 # chmod 600 ~/.ssh/authorized
puttygen在A服务器生成密钥对
菜单|Conversions|Export OpenSSH Key //导出OpenSSH格式的私钥,保存为id_rsa,放到A服务器用户目录~/.ssh/下 # chmod 600 ~/.ssh/id_rsa //设置属性 公钥在puttygen最上面那一堆最长的字符串就是,复制后添加到B服务器用户目录~/.ssh/authorized文件里,同样设置属性 # chmod 600 ~/.ssh/authorized
2.在数据库服务器A新建sql_backup.sh,用于mysqldump导出要备份的数据库,scp到备份服务器上
# vim sql_bakup.sh //添加以下内容
#!/bin/bash sqlfile=$(date -d yesterday "+%Y%m%d")".sql" #指定要拷贝的数据库文件名,以日期(减一天)命名 /usr/local/webserver/mysql/bin/mysqldump -u***** -p*** test > $sqlfile gzip $sqlfile #压缩,对于大数据库非常必要 scp $sqlfile".gz" root@192.168.0.2:/www/backup/mysql/ echo `date -d yesterday "+%Y%m%d"` succ >> /root/shell/sum.txt #将备份操作记录到sum.txt中去
mysql_backup.sh还有一种写法,写得更紧凑。实现本地不保存,直接备份到B服务器。mysqldump -udbuser -pdbpass dbname|gzip -c|ssh remoteuser@remoteip ‘cat > ~/’`date “+%Y%m%d%H%M%S”`’.sql.gz’其中dbuser是数据库用户名,dbpass是数据库密码,dbname是数据库名,remoteuser是远程B服务器的用户名,remoteip是远程B服务器的IP
3.数据库服务器A上编辑crontab,让mysql_backup脚本定期执行
# crontab -e //每天0点备份昨天A的test数据库到B的/www/backup/mysql
00 00 * * * /bin/bash /root/shell/sql_bakup.sh
4.还原数据库
# gzid -d 20121127.sql.gz #解压 # mysql -u**** -p*** -S /tmp/mysql > use test #没有就新建个数据库 > source /www/backup/mysql/20121127.sql