数据的备份与恢复
数据的备份分为逻辑备份与物理备份, 逻辑备份是指备份对数据库进行操作改变数据库结构的语句,如insert create 等,以文本形式存储,比较占用磁盘空间,不过可对其进行压缩存放。 物理备份是指对数据库中的数据进行备份,速度交逻辑备份快,直接将数据从一个地方复制出来即可。从恢复数据范围上来说,又分为完全备份,增量备份和差异备份,完全备份,是指将数据完全备份出来,增量备份是指将数据从上次完全备份或增量备份以来,对发生改变的数据进行的备份,叫做增量备份,差异备份是指从上次完全备份以来到此时对数据库改变的的护具进行备份。
两种备份划分没有必然联系,可以产生交叉。 数据库备份中的常见工具: mysqldump 用作逻辑备份的重要备份工具,可对所有引擎进行备份。但对与innodb可进行 热备份。 select into outfile 对某个数据库中的一个表或表内的部分数据进行备份 ibbackup 同mysqldump一样,可对所有引擎备份,对innodb热备份 snapshot 快照备份 几乎热备份 mysqlhotcopy 对MyISAM 进行备份 那我们要对那些数据进行备份呢?一般有这几项是需要备份的: binary logs 二进制日志用来即时点恢复 innodb log files 事件记录 mysqld option file 数据库的配置文件 slave position information(master.info) 从服务器中的主信息 relay logs 中继日志在备份中如果是innodb引擎,则可以热备份,要是MyISAM则要先将所有表锁住
mysqldump --all-databases > /back/alldatabase 一般有时只备份某个数据库才锁住表 ,否则要是所有表则进行关闭冷被备份以test数据库为例: mysql> flush tables with read lock; # mysqldump --database test > /back/test-`date +%F-%H-%M-%S`.sql mysql> unlock tables; 或者: # mysqldump --database test --lock-all-tables > /back/test-`date +%F-%H-%M-%S`.sql 在备份中,指定这这个时刻的位置,可以添加master-data=2; 进行热备份:并指定位置指定smysqldump --database test --single-transaction --flush-log > /back/test-`date +%F-%H-%M-%S`.sql 备份后可将数据进行压缩以节省空间: bzip2 alldatabase-2012-04%.sql 对数据的恢复 mysql -uuser -h -p < test-*.sql 对于增量备份,可以用通过命令:mysqlbinlog mysql-bin.00000* 查看二进制 内容,从而可知要恢复到那个节点的内容。然后再将其保存至一个 文件内,列如: mysqlnlinlog --stop-position=33456 mysql-bin.000003 > /back/incremental.sql 下面就可以导入这个文件所包含的数据内容了: mysql < /back/test-*.sql mysql < /back/incremental.sql 其实恢复备份的时候,可以将二进制日志关闭,恢复后再将其启动,因为恢复过程的记录没什么用,反而浪费空间。 最后还要提醒,一般二进制日志需要从新弄一个磁盘存放,以防磁盘损坏的时候全军覆没! 下面简单给一个little脚本演示自动备份,如果你想让其在夜间两点完全备份, 那么可以这样写: #/bin/bash backup_dir=/backup mysqldump='/usr/bin/mysqldump -uroot -p'redhat' date=`date +%F-%H-%M-S` $mysqldump --database dataname --single-transaction --flush-logs --master-data=2 > /$backup_dir/database-$date.sql写入自动任务
[root@mail ~]# vim /etc/crontab 添加如下一行 0 2 * * * root /mysqldump.sh以上是基于逻辑备份的内容,下面说说关于物理备份的一种:基于几乎热备份的相关操作内容:基于逻辑快照的方式
例如在数据库中,我们要将数据库data以快照的方式备份及还原。 #mysql -uuser -ppassword mysql>use data mysql>flush tables with read lock 停止数据的写入 mysql>flush logs 刷新日志 mysql>show master status 记录日志位置,以便恢复容易找到 mysql>\q 退出mysql,马上进行快照 lvcreate -L 68M -s -n data-snap -p r /dev/myvg/mydata #mysql -uuser -ppassword 连接到数据库解锁 mysql>unlock mysql>\q 创建挂载点 mkdir /snap mount -r /dev/myvg/data-snap /snap cd /snap ls 查看是否挂载好 为节约空间,可以将其打包: tar jcf /back/all_data-`date +%F-%H-%S'.tar.bz2 data/ 备份好后,就可以卸载快照卷了 umount /snap rm -rf /snap lvremove --force /dev/myvg/data-snap 若要将备份的数据进行恢复,怎样进行呢? 我们知道,物理备份的几乎热备份其实还是冷备份,只不过是快速冷备份。所以要将数据库关掉之后,再进行备份恢复。具体操作命令如下: service mysqld stop 若最近的二进制日志文件与数据在同一个路径下,需要将其拷贝出来,另外存放,所以一般一开始就将其分离出来。 cd /mydata rm -rf data/ tar xf /back/all_data-`date +%F-%H-%S'.tar.bz2 -C ./ 此时文件名中包含的日期时间已经有 ls 查看 重启服务:service mysqld start #mysql -uuser -ppassword 进入mysql查看 备份过程中的数据需要借助二进制日志来恢复,先通过命令mysqlbinlog 查看二进制日志内容,并找到错误操作前的位置,记录下position,如: mysqlbinlog /root/mysql-bin.000033 记录的错误位置为123456则恢复过程如下: mysqlbinlog --stop-position=123456 /root/mysql-bin.000033 > /back/data.sql #mysql -uuser -ppassword mysql>set SQL_LOG_BIN=0 恢复过程不需要启动二进制日志 mysql>source /back/data.sql mysql>set SQL_LOG_BIN=1 最后别忘了再把二进制日志开启啊!然后就可以进入数据库查看还原的数据了!