Mysqldump
参见网址:
http://blog.sina.com.cn/s/blog_62a24b6801013vcy.html
备份MySQL数据库的命令(导出的脚本不含有CREATE DATABASE语句) mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql
备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。 mysqldump --add-drop-table -uusername -ppassword databasename > backupfile.sql
直接将MySQL数据库压缩备份 mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz
备份MySQL数据库某个(些)表 mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
同时备份多个MySQL数据库(导出的脚本含有CREATE DATABASE语句) mysqldump -hhostname -uusername -ppassword --databases databasename1 databasename2 databasename3 > multibackupfile.sql
仅仅备份数据库结构 mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
备份服务器上所有数据库 mysqldump –all-databases > allbackupfile.sql
还原MySQL数据库的命令 mysql -hhostname -uusername -ppassword databasename < backupfile.sql
还原压缩的MySQL数据库 gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
将数据库转移到新服务器 mysqldump -uroot -h127.0.0.1 -p databasename | mysql -h192.168.1.99 -phorizoompassword -C databasename
注意事项 一、确定要备份的表的存储引擎是事务型还是非事务性,两种不同的存储引擎备份方式在处理数据一致性方面是不太一样的。 二、确定使用全备份还是增量备份。全备份的优点是备份保持最新备份,恢复的时候可以花费更少的时间;缺点是如果数据量大,将会花费很多的时间,并对系统造成较长时间的压力。增量备份则恰恰相反,只需要备份每天的增量日志,备份时间少,对负载压力也小;缺点就是恢复的时候需要全备份加上次备份到故障前的所有日志,恢复时间会长些。 三、可以考虑采取复制的方法来做异地备份,但是记住,复制不能代替备份,它对数据库的误操作也无能为力。 四、要定期做备份,备份的周期要充分考虑系统可以承受的恢复时间。备份要在系统负载较小的时候进行。 五、确保MySQL打开log-bin选项,有了BINLOG,MySQL才可以在必要的时候做完整恢复,或基于时间点的恢复,或基于位置的恢复。 六、要经常做备份恢复测试,确保备份是有效的,并且是可以恢复的
例子: 介绍:mysqldump是MySQL自带的备份工具,他备份出来的是一个文本文件可以直接查看,里面记录的就是数据库语句,原理就是通过数据库语句把数据库或表重新建了到备份时状态,其实用图形工具备份原理是一样的(都是逻辑备份)。 备份 注意:一定要检查备份文件,注意文件大小不是0,因为即使备份出错也会生成一个空文件 [root@zzh /]# mysqldump -u root -p --all-database > /beifeng/all.sql 备份所以数据库,保存为all.sql文件 [root@zzh /]# mysqldump -u root -p zzh > /beifeng/zzh.sql 备份指定zzh数据库,保存为zzh.sql文件 [root@zzh /]# mysqldump -u root -p zzh kt1 kt2 > /beifeng/biao.sql 备份zzh数据库中的kt1和kt2表,保存为biao.sql文件 -l参数 MyISAM存储引擎在备份的时候需要加,表示将所有表加上锁,在备份期间,所有表将只能读而不能进行数据更新 -F参数 表示生成一个新的日志文件 -u参数 指定用户名 -p参数 指定密码 -h参数 指定服务器ip或者域名 -P(大写)指定端口
完全恢复 [root@zzh /]# mysql -u root -p zzh < /beifeng/zzh.sql 恢复数据库时,数据库不受任何影响,注意:恢复的库时原库一定要存在 把数据恢复到最新状态 [root@zzh /]# mysqldump -F -u root -p kangte > /beifeng/kangte.sql 备份kangte数据库,加-F生成一个新日志文件恢复时好查找,注意:一定要检查一下备份的文件。这时备份以后数据库发生的操作都会记录到二进制日志里面 [root@zzh /]# cp /mysqldata/mysql-bin.000009 /beifeng/ 特别注意:一定要在恢复之前把日志文件拷贝出来,否则日志也会记录恢复操作,把从备份生成后的所有二进制文件拷贝出来 [root@zzh /]# mysql -u root -p kangte < /beifeng/kangte.sql 执行完全恢复kangte数据库,恢复到备份数据库时的状态,此时备份时到数据库恢复之间的操作还没有恢复 [root@zzh /]# mysqlbinlog /beifeng/mysql-bin.000009 | mysql -u root -p kangte 用二进制日志把kangte数据恢复到最新状态 不完全恢复 一、基于时间点恢复(如果00:00:00——00:30:30中间出现问题,可以跳过这段时间恢复数据) 注意:恢复数据库之前最后把二进制文件备份一下 [root@zzh /]# mysqlbinlog --stop-date="2009-09-01 00:00:00" /mysqldata/mysql-bin.000009 | mysql -u root -p kangte 用二进制日志文件把kangte数据库恢复到故障前 [root@zzh /]# mysqlbinlog --start-date="2009-09-01 00:30:30" /mysqldata/mysql-bin.000009 | mysql -u root -p kangte 跳过故障时间点继续恢复kangte数据库 二、基于位置的恢复(可以更精确的恢复数据) [root@zzh /]# mysqlbinlog --start-date="2009-09-01 00:00:00" --stop-date="2009-09-01 00:30:30" /mysqldata/mysql-bin.000009 > /jilu.txt 根据二进制日志生成00:00:00——00:30:30中间的操作记录文件,这里记录的是对所有数据库的操作 [root@zzh /]# more /jilu.txt 查看文件找出错误点前后对应的语句代号,如at 1000 [root@zzh /]# mysqlbinlog --stop-position="1000" /mysqldata/mysql-bin.000009 | mysql -u root -p kangte 把kangte数据库恢复到代号为1000的语句前,注意:不恢复代号为1000的语句 [root@zzh /]# mysqlbinlog --start-position="1010" /mysqldata/mysql-bin.000009 | mysql -u root -p kangte 恢复代号为1010的语句之后的语句 冷备份 直接拷贝数据库文件,根据情况备份需要备份的文件 [root@zzh /]# /usr/local/mysql/share/mysql/mysql.server stop 先关闭数据库 [root@zzh /]# mkdir beifeng 建立一个目录用来保存备份 [root@zzh /]# tar -zcvf /beifeng/2009.9.tgz ./mysqldata/ 备份数据库,注意:备份时一定要清楚自己当前所在目录,这里用的相对路径 [root@zzh /]# /usr/local/mysql/share/mysql/mysql.server start 启动数据库 用冷备份文件还原 注意:如果是一个小文件还原,直接关闭数据库把文件复制还原回去就可以了,但是如果像全库回复,把文件拷回去时间就会很长时间,这时执行下面操作,先把文件解压到新数据库目录,修改my.cnf文件重新指定新数据库目录,这样关闭数据库时间就会很短 [root@zzh beifeng]# mv mysqldata/ /xindata/ 先把备份放到新数据库目录 [root@zzh /]# chown -R mysql.mysql /xindata/ 给新数据库目录权限 [root@zzh /]# /usr/local/mysql/share/mysql/mysql.server stop 关闭数据库,注意:一定要把数据库关闭后在修改下面的文件,要不修改完在关库会报错 [root@zzh /]# vim /etc/my.cnf datadir = /xindata 设置新数据库目录位置,注意:这个字段默认没有自己在[mysqld]标签下添加
[root@zzh /]# /usr/local/mysql/share/mysql/mysql.server start
更为具体的mysqldump使用参看网址:
http://www.jb51.net/article/41570.htm
一、备份的目的
做灾难恢复:对损坏的数据进行恢复和还原 需求改变:因需求改变而需要把数据还原到改变以前 测试:测试新功能是否可用
二、备份需要考虑的问题
可以容忍丢失多长时间的数据; 恢复数据要在多长时间内完; 恢复的时候是否需要持续提供服务; 恢复的对象,是整个库,多个表,还是单个库,单个表。
三、备份的类型
1、根据是否需要数据库离线
冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行; 温备(warm backup): 服务在线,但仅支持读请求,不允许写请求; 热备(hot backup):备份的同时,业务不受影响。
注:
1>、各种类型的备份,取决于业务的需求,而不是备份工具 2>、MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具
2、根据要备份的数据集合的范围 完全备份:full backup,备份全部字符集。 增量备份: incremental backup 上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份,备份的频率取决于数据的更新频率。 差异备份:differential backup 上次完全备份以来改变了的数据。 建议的恢复策略: 完全+增量+二进制日志 完全+差异+二进制日志
3、根据备份数据或文件
物理备份:直接备份数据文件
优点:
备份和恢复操作都比较简单,能够跨mysql的版本, 恢复速度快,属于文件系统级别的
建议:
不要假设备份一定可用,要测试 mysql>check tables;检测表是否可用
#######################################################
逻辑备份: 备份表中的数据和代码
优点:
恢复简单、 备份的结果为ASCII文件,可以编辑 与存储引擎无关 可以通过网络备份和恢复
缺点:
备份或恢复都需要mysql服务器进程参与 备份结果占据更多的空间, 浮点数可能会丢失精度 还原之后,索引需要重建
四:备份的对象
1、 数据; 2、配置文件; 3、代码:存储过程、存储函数、触发器 4、os相关的配置文件 5、复制相关的配置 6、二进制日志
五、备份和恢复的实现
1、利用select into outfile实现数据的备份与还原 1.1把需要备份的数据备份出来
mysql> use hellodb; //打开hellodb库 mysql> select * from students; 查看students的属性 mysql> select * from students where Age > 30 into outfile ‘/tmp/stud.txt' ; //将年龄大于三十的同学的信息备份出来
注意:
备份的目录路径必须让当前运行mysql服务器的用户mysql具有访问权限
备份完成之后需要把备份的文件从tmp目录复制走,要不就失去备份的目的了
回到tmp目录下查看刚才备份的文件
[root@www ~]# cd /tmp
[root@www tmp]# cat stud.txt
3Xie Yanke53M216
4Ding Dian32M44
6Shi Qing46M5\N
13Tian Boguang33M2\N
25Sun Dasheng100M\N\N
[root@www tmp]#
你会发现是个文本文件。所以不能直接导入数据库了。需要使用load data infile恢复
回到mysql服务器端,删除年龄大于30的用户,模拟数据被破坏
mysql> delete from students where Age > 30;
mysql> load data infile '/tmp/stud.txt' into table students;
2、利用mysqldump工具对数据进行备份和还原
mysqldump 常用来做温备,所以我们首先需要对想备份的数据施加读锁,
2.1 施加读锁的方式:
1>.直接在备份的时候添加选项
--lock-all-tables 是对要备份的数据库的所有表施加读锁
--lock-table 仅对单张表施加读锁,即使是备份整个数据库,它也是在我们备份某张表的时候才对该表施加读锁,因此适用于备份单张表
2>、在服务器端书写命令,
mysql> flush tables with read lock; 施加锁,表示把位于内存上的表统统都同步到磁盘上去,然后施加读锁
mysql> unlock tables;释放读锁
但这对于InnoDB存储引擎来讲,虽然你也能够请求道读锁,但是不代表它的所有数据都已经同步到磁盘上,因此当面对InnoDB的时候,我们要使 用mysql> show engine innodb status; 看看InnoDB所有的数据都已经同步到磁盘上去了,才进行备份操作。
2.2备份的策略:
完全备份+增量备份+二进制日志
演示备份的过程;
2.3 先给数据库做完全备份:
[root@www ~]# mysqldump -uroot --single-transaction --master-data=2 --databases hellodb > /backup/hellodb_`date +%F`.sql
--single-transaction: 基于此选项能实现热备InnoDB表;因此,不需要同时使用--lock-all-tables; --master-data=2 记录备份那一时刻的二进制日志的位置,并且注释掉,1是不注释的 --databases hellodb 指定备份的数据库
然后回到mysql服务器端,
2.4回到mysql服务器端更新数据 mysql> create table tb1(id int); 创建表 mysql> insert into tb1 values (1),(2),(3); 插入数据,这里只做演示,随便插入了几个数据
2.5先查看完全备份文件里边记录的位置:
[root@www backup]# cat hellodb_2013-09-08.sql | less -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=15684; 记录了二进制日志的位置
2.6 在回到服务器端: mysql> show master status; 显示此时的二进制日志的位置 从备份文件里边记录的位置到我们此时的位置,即为增量的部分 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 15982 | | | +------------------+----------+--------------+------------------+
2.7做增量备份。实际情况可能比这复杂点,这里只是演示下过程(可能增量备份的二进制文件不止一个)。其实增量备份直接考出完全备份之后的所有二进制日志(注意最好备份开始的时候生成一个新的二进制日志文件。备份时加-F选项。恢复的时候直接用二进制文件进行增量恢复)就可以。 [root@www backup]# mysqlbinlog --start-position=15694 --stop-position=15982 /mydata/data/mysql-bin.000013 > /backup/hellodb_`date +$F_%H`.sql
2.8再回到服务器 mysql> insert into tb1 values (4),(5); 在插入一些数值 mysql> drop database hellodb; 删除hellodb库
2.9导出这次得二进制日志:(可能二进制文件不止一个) [root@www backup]# mysqlbinlog --start-position=15982 /mydata/data/mysql-bin.000013 查看删除操作时二进制日志的位置 [root@www backup]# mysqlbinlog --start-position=15982 --stop-position=16176 /mydata/data/mysql-bin.000013 > /tmp/hellodb.sql //导出二进制日志
2.10先让mysql离线,防止数据继续写入。 mysql> set sql_log_bin=0; 关闭二进制日志 。防止恢复操作也写入二进制文件 mysql> flush logs; 滚动下日志 ,将缓存中的日志写到日志中
2.11模拟数据库损坏
mysql> drop database hellodb;
2.12开始恢复数据: [root@www ]# mysql < /backup/hellodb_2013-09-08.sql //导入完全备份文件 [root@www ]# mysql < /backup/hellodb_2013-09-08_05.sql //导入增量备份文件 [root@www ]# mysql< hellodb.sql //导入二进制文件
验证完成,显示结果为我们预想的那样
注:
1、真正在生产环境中,我们应该导出的是整个mysql服务器中的数据,而不是单个库,因此应该使用--all-databases 2、在导出二进制日志的时候,可以直接复制文件即可,但是要注意的是,备份之前滚动下日志。