做灾难恢复:对损坏的数据进行恢复和还原需求改变:因需求改变而需要把数据还原到改变以前测试:测试新功能是否可用
二、备份需要考虑的问题
三、备份的类型
1、根据是否需要数据库离线
冷备(coldbackup):需要关mysql服务,读写请求均不允许状态下进行;温备(warmbackup):服务在线,但仅支持读请求,不允许写请求;热备(hotbackup):备份的同时,业务不受影响。
注:
1、这种类型的备份,取决于业务的需求,而不是备份工具2、MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具
2、根据要备份的数据集合的范围完全备份:fullbackup,备份全部字符集。增量备份:incrementalbackup上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份,备份的频率取决于数据的更新频率。差异备份:differentialbackup上次完全备份以来改变了的数据。建议的恢复策略:完全+增量+二进制日志完全+差异+二进制日志
3、根据备份数据或文件
物理备份:直接备份数据文件
优点:
备份和恢复操作都比较简单,能够跨mysql的版本,恢复速度快,属于文件系统级别的
建议:
不要假设备份一定可用,要测试mysql>checktables;检测表是否可用逻辑备份:备份表中的数据和代码
恢复简单、备份的结果为ASCII文件,可以编辑与存储引擎无关可以通过网络备份和恢复
缺点:
备份或恢复都需要mysql服务器进程参与备份结果占据更多的空间,浮点数可能会丢失精度还原之后,缩影需要重建
四:备份的对象
五、备份和恢复的实现
1、利用selectintooutfile实现数据的备份与还原1.1把需要备份的数据备份出来
mysql>usehellodb;//打开hellodb库mysql>select*fromstudents;查看students的属性mysql>select*fromstudentswhereAge>30intooutfile‘/tmp/stud.txt';//将年龄大于三十的同学的信息备份出来注意:
备份的目录路径必须让当前运行mysql服务器的用户mysql具有访问权限
备份完成之后需要把备份的文件从tmp目录复制走,要不就失去备份的目的了
回到tmp目录下查看刚才备份的文件
[root@www~]#cd/tmp
[root@wwwtmp]#catstud.txt
3XieYanke53M216
4DingDian32M44
6ShiQing46M5\N
13TianBoguang33M2\N
25SunDasheng100M\N\N
[root@wwwtmp]#
你会发现是个文本文件。所以不能直接导入数据库了。需要使用loaddatainfile恢复
回到mysql服务器端,删除年龄大于30的用户,模拟数据被破坏
mysql>deletefromstudentswhereAge>30;mysql>loaddatainfile'/tmp/stud.txt'intotablestudents;loaddateinfile方式测试通过,要求里面没有相同的数据;
2、利用mysqldump工具对数据进行备份和还原
mysqldump常用来做温备,所以我们首先需要对想备份的数据施加读锁,
2.1施加读锁的方式:
1.直接在备份的时候添加选项
--lock-all-tables是对要备份的数据库的所有表施加读锁
--lock-table仅对单张表施加读锁,即使是备份整个数据库,它也是在我们备份某张表的时候才对该表施加读锁,因此适用于备份单张表
2、在服务器端书写命令,
完全备份+增量备份+二进制日志
演示备份的过程;
2.3先给数据库做完全备份:
[root@www~]#mysqldump-uroot--single-transaction--master-data=2--databaseshellodb>/backup/hellodb_`date+%F`.sql--single-transaction:基于此选项能实现热备InnoDB表;因此,不需要同时使用--lock-all-tables;--master-data=2记录备份那一时刻的二进制日志的位置,并且注释掉,1是不注释的--databaseshellodb指定备份的数据库然后回到mysql服务器端,
2.4回到mysql服务器端更新数据
mysql>createtabletb1(idint);创建表mysql>insertintotb1values(1),(2),(3);插入数据,这里只做演示,随便插入了几个数据2.5先查看完全备份文件里边记录的位置:
[root@wwwbackup]#cathellodb_2013-09-08.sql|less--CHANGEMASTERTOMASTER_LOG_FILE='mysql-bin.000013',MASTER_LOG_POS=15684;记录了二进制日志的位置2.6在回到服务器端:
[root@wwwbackup]#mysqlbinlog--start-position=15694--stop-position=15982/mydata/data/mysql-bin.000013>/backup/hellodb_`date+$F_%H`.sql2.8再回到服务器
mysql>insertintotb1values(4),(5);在插入一些数值mysql>dropdatabasehellodb;删除hellodb库2.9导出这次得二进制日志:
mysqlbinlog--start-position=15982/mydata/data/mysql-bin.000013查看删除操作时二进制日志的位置#mysqlbinlog--start-position=15982--stop-position=16176/mydata/data/mysql-bin.000013>/tmp/hellodb.sql//导出二进制日志2.10先让mysql离线
mysql>setsql_log_bin=0;关闭二进制日志mysql>flushlogs;滚动下日志2.11模拟数据库损坏
2.12开始恢复数据:
[root@www]#mysql
1、真正在生产环境中,我们应该导出的是整个mysql服务器中的数据,而不是单个库,因此应该使用--all-databases2、在导出二进制日志的时候,可以直接复制文件即可,但是要注意的是,备份之前滚动下日志。3、利用lvm快照实现几乎热备的数据备份与恢复
3.1策略:
完全备份+二进制日志;
3.2准备:
注:事务日志必须跟数据文件在同一个LV上;
3.4修改mysql主配置文件存放目录内的文件的权限与属主属组,并初始化mysql
[root@www~]#mkdir/mydata/data//创建数据目录[root@www~]#chownmysql:mysql/mydata/data//改属组属主[root@www~]#cd/usr/local/mysql///必须站在此目录下[root@wwwmysql]#scripts/mysql_install_db--user=mysql--datadir=/mydata/data//初始化mysql3.5修改配置文件:
vim/etc/my.cofdatadir=/mydata/data添加数据目录sync_binlog=1开启此功能3.6启动服务
[root@wwwmysql]#servicemysqldstartmysql>setsessionsql_log_bin=0;关闭二进制日志mysql>source/backup/all_db_2013-09-08.sql读取备份文件3.7回到mysql服务器:
[root@www~]#mkdir/backup/limian[root@www~]#mysql-e'showmasterstatus;'>/backup/limian/binlog.txt3.9为数据所在的卷创建快照:
[root@www~]#lvcreate-L100M-s-pr-nmysql_snap/dev/myvg/mydata回到服务器端,释放读锁
mysql>UNLOCKTABLES;[root@www~]#mount/dev/myvg/mysql_snap/mnt/data[root@wwwdata]#cp*/backup/limian/[root@wwwdata]#lvremove/dev/myvg/mylv_snap3.10更新数据库的数据,并删除数据目录先的数据文件,模拟数据库损坏
3.11测试
启动服务
官方站点:www.percona.com
优势:
1、快速可靠的进行完全备份2、在备份的过程中不会影响到事务3、支持数据流、网络传输、压缩,所以它可以有效的节约磁盘资源和网络带宽。4、可以自动备份校验数据的可用性。
安装Xtrabackup
注意:在备份数据库的时候,我们应该具有权限,但需要注意的是应该给备份数据库时的用户最小的权限,以保证安全性,
4.1前提:
应该确定采用的是单表一个表空间,否则不支持单表的备份与恢复。在配置文件里边的mysqld段加上
innodb_file_per_table=14.2备份策略完全备份+增量备份+二进制日志4.3准备个目录用于存放备份数据
4.4做完全备份:
[root@www~]#innobackupex--user=root--password=mypass/innobackup/注:
mysql>usehellodb;mysql>deletefromstudentswhereStuID>=24;4.6增量备份
innobackupex--user=root--password=mypass--incremental/innobackup/--incremental-basedir=/innobackup/2013-09-12_11-03-04/--incremental指定备份类型--incremental-basedir=指定这次增量备份是基于哪一次备份的,这里是完全备份文件,这样可以把增量备份的数据合并到完全备份中去4.7第二次增量
先去修改数据
[root@www~]#servicemysqldstop[root@wwwdata]#rm-rf*模拟数据库崩溃[root@www~]#innobackupex--copy-back/innobackup/2013-09-12_11-03-04/--copy-back数据库恢复,后面跟上备份目录的位置4.15检测:
[root@www~]#cd/mydata/data/[root@wwwdata]#chownmysql:mysql*[root@wwwdata]#servicemysqldstart