Chinaunix首页 | 论坛 | 博客
  • 博客访问: 143624
  • 博文数量: 22
  • 博客积分: 1050
  • 博客等级: 少尉
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 16:41
文章分类

全部博文(22)

文章存档

2009年(5)

2008年(17)

我的朋友

分类: Mysql/postgreSQL

2008-07-31 20:02:23

mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。mysqldump 比直接拷贝要慢些。关于mysqldump的更详细解释见最后的附录。
对于中等级别业务量的系统来说,备份策略可以这么定:第一次完全备份,每天一次增量备份,每周再做一次完全备份,如此一直重复。而对于重要的且繁忙的系统来说,则可能需要每天一次全量备份,每小时一次增量备份,甚至更频繁。为了不影响线上业务,实现在线备份,并且能增量备份,最好的办法就是采用主从复制机制(replication),在 slave 机器上做备份。

备份策略布置:


(1)、创建备份目录


Shell> mkdir /tmp/mysqlbackup


Shell> mkdir /tmp/mysqlbackup/daily


(2)、启用二进制日志


采用 binlog 的方法相对来说更灵活,省心省力,而且还可以支持增量备份。
启用 binlog 时必须要重启 mysqld。首先,关闭 mysqld,打开 /etc/my.cnf,加入以下几行:
[mysqld]
log-bin

然后启动 mysqld 就可以了。运行过程中会产生 HOSTNAME-bin.000001 以及 HOSTNAME-bin.index,前面的文件是 mysqld 记录所有对数据的更新操作,后面的文件则是所有 binlog 的索引,都不能轻易删除。关于 binlog 的更详细信息请查看手册。


(3)、配置SSH密钥登录,用于将MySQL备份传送到备份服务器(如果备份服务器为Windows,请跳过此部)。


1)、在MySQL所在服务器(192.168.0.20)生成SSH密钥


[root@lab ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
//直接回车
Enter passphrase (empty for no passphrase):
//直接回车,不使用密码
Enter same passphrase again:
//直接回车,不使用密码
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
c2:96:9f:2d:5a:8e:08:42:43:35:2f:85:5e:72:f8:1c root@lab

2)、在备份服务器(192.168.0.200)上创建目录,修改权限,并传送公钥。
[root@lab ~]# ssh 192.168.0.200 "mkdir .ssh;chmod 0700 .ssh"
The authenticity of host '192.168.0.200 (192.168.0.200)' can't be established.
RSA key fingerprint is 37:57:55:c1:32:f1:dd:bb:1b:8a:13:6f:89:fb:b8:9d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.200' (RSA) to the list of known hosts.
root@192.168.0.200's password:
//输入备份服务器的root密码
[root@lab ~]# scp .ssh/id_rsa.pub 192.168.0.200:.ssh/authorized_keys2
root@192.168.0.200's password:
id_rsa.pub                                             100%  218     0.2KB/s   00:00   
3)、测试SSH登录
[root@lab ~]# ssh 192.168.0.200       //测试SSH登录
Last login: Fri Nov 16 10:34:02 2007 from 192.168.0.20
[root@lib ~]#

 


(4)、设置crontab任务,每天执行备份脚本


shell> crontab -e


#每个星期日凌晨3:00执行完全备份脚本


0 3 * * 0 /root/MySQLBackup/mysqlFullBackup.sh >/dev/null 2>&1


#周一到周六凌晨3:00做增量备份


0 3 * * 1-6 /root/MySQLBackup/mysqlDailyBackup.sh >/dev/null 2>&1

mysqlFullBackup.sh注释:

代码
  1. #!/bin/sh  
  2.  
  3.  
  4.  
  5. # Name:mysqlFullBackup.sh  
  6.  
  7.  
  8.  
  9. # PS:MySQL DataBase Full Backup.  
  10.  
  11.  
  12.  
  13. # Write by:i.Stone  
  14.  
  15.  
  16.  
  17. # Last Modify:2007-11-17  
  18.  
  19.  
  20.  
  21. #  
  22.  
  23.  
  24.  
  25. # Use mysqldump --help get more detail.  
  26.  
  27.  
  28.  
  29. #  
  30.  
  31.  
  32.  
  33. # 定义变量,请根据具体情况修改  
  34.  
  35.  
  36.  
  37. # 定义脚本目录   
  38.   
  39.   
  40.   
  41. scriptsDir=`pwd`  
  42.  
  43.  
  44.  
  45. # 定义数据库目录   
  46.   
  47.   
  48.   
  49. mysqlDir=/usr/local/mysql  
  50.  
  51.  
  52.  
  53. # 定义用于备份数据库的用户名和密码   
  54.   
  55.   
  56.   
  57. user=root   
  58.   
  59.   
  60.   
  61. userPWD=111111  
  62.  
  63.  
  64.  
  65. # 定义备份目录   
  66.   
  67.   
  68.   
  69. dataBackupDir=/tmp/mysqlbackup  
  70.  
  71.  
  72.  
  73. # 定义邮件正文文件   
  74.   
  75.   
  76.   
  77. eMailFile=$dataBackupDir/email.txt  
  78.  
  79.  
  80.  
  81. # 定义邮件地址   
  82.   
  83.   
  84.   
  85. eMail=alter@somode.com  
  86.  
  87.  
  88.  
  89. # 定义备份日志文件   
  90.   
  91.   
  92.   
  93. logFile=$dataBackupDir/mysqlbackup.log   
  94.   
  95.   
  96.   
  97. DATE=`date -I`   
  98.   
  99.   
  100.   
  101.   
  102.   
  103.   
  104. echo "" > $eMailFile   
  105.   
  106.   
  107.   
  108. echo $(date +"%y-%m-%d %H:%M:%S";-) >> $eMailFile   
  109.   
  110.   
  111.   
  112. cd $dataBackupDir  
  113.  
  114.  
  115.  
  116. # 定义备份文件名   
  117.   
  118.   
  119.   
  120. dumpFile=mysql_$DATE.sql   
  121.   
  122.   
  123.   
  124. GZDumpFile=mysql_$DATE.sql.tar.gz  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131. # 使用mysqldump备份数据库,请根据具体情况设置参数   
  132.   
  133.   
  134.   
  135. $mysqlDir/bin/mysqldump -u$user -p$userPWD \   
  136.   
  137.   
  138.   
  139. --opt --default-character-set=utf8 --extended-insert=false \   
  140.   
  141.   
  142.   
  143. --triggers -R --hex-blob --all-databases \   
  144.   
  145.   
  146.   
  147. --flush-logs --delete-master-logs \   
  148.   
  149.   
  150.   
  151. --delete-master-logs \   
  152.   
  153.   
  154.   
  155. -x > $dumpFile  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162. # 压缩备份文件   
  163.   
  164.   
  165.   
  166. if [[ $? == 0 ]]; then   
  167.   
  168.   
  169.   
  170.   
  171. tar czf $GZDumpFile $dumpFile >> $eMailFile 2>&1   
  172.   
  173.   
  174.   
  175.   
  176. echo "BackupFileName:$GZDumpFile" >> $eMailFile   
  177.   
  178.   
  179.   
  180.   
  181. echo "DataBase Backup Success!" >> $eMailFile   
  182.   
  183.   
  184.   
  185.   
  186. rm -f $dumpFile  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193. # Delete daily backup files.   
  194.   
  195.   
  196.   
  197.   
  198. cd $dataBackupDir/daily   
  199.   
  200.   
  201.   
  202.   
  203. rm -f *  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210. # Delete old backup files(mtime>2).   
  211.   
  212.   
  213.   
  214.   
  215. $scriptsDir/rmBackup.sh  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222. # 如果不需要将备份传送到备份服务器或备份服务器为Windows,请将标绿的行注释掉  
  223.  
  224.  
  225.  
  226. # Move Backup Files To Backup Server.  
  227.  
  228.  
  229.  
  230. #适合Linux(MySQL服务器)到Linux(备份服务器)   
  231.   
  232.   
  233.   
  234.   
  235. $scriptsDir/rsyncBackup.sh   
  236.   
  237.   
  238.   
  239.   
  240. if (( !$? )); then   
  241.   
  242.   
  243.   
  244.     echo "Move Backup Files To Backup Server Success!" >> $eMailFile   
  245.   
  246.   
  247.   
  248.     else   
  249.   
  250.   
  251.   
  252.     echo "Move Backup Files To Backup Server Fail!" >> $eMailFile   
  253.   
  254.   
  255.   
  256.   fi   
  257.   
  258.   
  259.   
  260.   
  261.   
  262.   
  263. else   
  264.   
  265.   
  266.   
  267.   
  268. echo "DataBase Backup Fail!" >> $emailFile   
  269.   
  270.   
  271.   
  272. fi  
  273.  
  274.  
  275.  
  276. # 写日志文件   
  277.   
  278.   
  279.   
  280. echo "--------------------------------------------------------" >> $logFile   
  281.   
  282.   
  283.   
  284. cat $eMailFile >> $logFile  
  285.  
  286.  
  287.  
  288. # 发送邮件通知   
  289.   
  290.   
  291.   
  292. cat $eMailFile | mail -s "MySQL Backup" $eMail   

(5) 、恢复数据库到备份时的状态


用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,直接用 mysql 客户端导入就可以了。

/usr/local/mysql/bin/mysql -uroot -pUserPWD db_name < db_name.sql
对于任何可适用的更新日志,将它们作为 mysql 的输入:
  % ls -t -r -1 HOSTNAME-bin* | xargs mysqlbinlog | mysql -uUser -pUserPWD

ls 命令生成更新日志文件的一个单列列表,根据服务器产生它们的次序排序(注意:如果你修改任何一个文件,你将改变排序次序,这将导致更新日志以错误的次序被运用。)


本套备份策略只能恢复数据库到最后一次备份时的状态,要想在崩溃时丢失的数据尽量少应该更频繁的进行备份,要想恢复数据到崩溃时的状态请使用主从复制机制(replication)。如果使用本套备份脚本,将日志文件和数据文件放到不同的磁盘上是一个不错的主义,这样不仅可以提高数据写入速度,还能使数据更安全。
阅读(1167) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~