第32章 数据库的备份和恢复

数据的备份和恢复:




这个章节讨论数据库的备份技术和如何从备份恢复数据库


1、备份的类型


2.2进制和文本恢复


3.备份的log和状态文件的作用


4.使用复制


5.执行数据恢复




32.1  介绍


1个MYSQL管理员做数据库备份来保护系统crash或者硬件失败 导致数据丢失或者腐败。




Backups 也可拥于当用户错误的删除数据库或者表。




另外的备份是移动或者拷贝数据库到其他的机器,比如MySQL的迁移安装。






备份可以直接copy数据库文件,或者通过程序实现。程序包括mysqldump,mysqlhotcopy 和MySQL 管理器,


和InnoDB Hot Backup.


有必要进行备份,但是backup 只是数据丢失会的一个组件。


另外的是binary log,包含了数据改变的记录。为了恢复数据库,你必须使用backup 来恢复数据库到备份的时间




重新执行binary log里的语句




有一些备份注意的原则:


1.常规的备份


2.启用binary log 你可以在备份后记录数据库的改变




3.Flush 日志当备份后server 会以新的binary log 文件开始 (完成检查点)




32.2  2进制备份相比文本备份:


1.一个2进制备份是数据库文件的复制。复制那些文件保存数据库正确的格式 和Mysql 存储他们的格式一样




恢复调用copy 到原来的目录。




技术用于2进制备份保留 OS的COPY mysqlhotcopy 和InnoDB Hot Backup








2.一个文本备份是数据库内容dump到一个文本文件。恢复调用loading 把文件内容加载到数据库






2种备份格式有不同的长处和弱点 ,通常的这中是加速和可移植性的折衷。




binary 备份更快 因为它只调用了文件的拷贝,不需要知道内部文件的结构。


然而,如果备份是用于另外的机器有不同的结构,那么文件必须是2进制可移植的。




Binary 可移植的就是说 文件是单独机器的 你可以直接复制MYSQL SERVER 到另外不同的机器




另外的机器可以访问它们的内容。


用2进制备份方式,你需要确认server 不能修改文件 当执行备份时




文本方式备份是很慢的,因为server 必须读取表  然后写出内容到磁盘文件


或者发送到客户端程序。


一个后面的方法是Mysqldump 客户端,从server 端接收数据内容 写成insert语句 用于重建表。


文本备份是可移植的,因为文本备份可以加载到另外的机器,不管线两个机器是否有相同的结构。


用文本备份模式,server 必须运行因为它必须读取文件




2进制备份的方式依赖哪种存储引擎创建的表,通常只能用于本地MySQL server.




文本备份过程是更常规的能用于任何引擎创建的表,一些方法可以用于本地或者远程的MySQL server.




32.3  使用Binary 备份




这个章节秒速了你能使用的2进制格式数据库或者表备份方式方法:






32.3.1  Making Binary MyISAM Backups


备份 MyISAM 表,copy .frm .MYD 和.MYI 文件 MYSQL用于展现表数据的。




当你进行备份的时候,表不能被其他程序使用(包括server) 在复制操作期间。


如果你停止servr 当复制表的时候,就没有和服务器相互影响。如果你让server 运行,




使用相应的锁来防止server 访问数据。比如,拷贝Country 表在world数据库里,


锁住表flush pending change :




mysql>USE world;


mysql>LOCK TABLES Country READ;


mysql>FLUSH TABLES Country;




然后使用OS的文件拷贝命令 复制表文件。放copy 操作完成后,释放锁


mysql> UNLOCK TABLES;


先前的策略在UNIX 上工作,在Windows上,文件锁你不能复制文件 在这种情况下,你必须停止服务器在复制前




另外的方式 备份binary MyISAM 是使用mysqlhotcopy,帮你锁表和flush表






恢复一个MyISAM 表从一个binary 备份,停止服务器,复制备份的表文件到相应的目录,


重启server.






32.3.2 Making Binary InnnoDB Backups


一个2进制的备份操作用于InnoDB的完整备份(备份InnoDB 表空间里所有的表)


是基于做了准确的复制了InnoDB 使用的所有文件




备份InnoDB 的2进制部分,使用下面步骤:


1.停止server 在copy阶段,tablespace 不能被使用当在copy的时候






2.确保server 关闭没有错误,Binary InnoDB 需要一个clean 关闭 来确保serer 完成了任何的挂起的事务




3.复制下面的部分:


[mysql@master test]$ ls -ltr t1*
-rw-rw----. 1 mysql mysql  8556 Mar  7 12:55 t1.frm
-rw-rw----. 1 mysql mysql 98304 Mar 12 08:09 t1.ibd


1. 每个InnoDB 表的.frm文件


2.表空间文件,这个包括 共享表空间的文件 也包括.ibd 文件


如果你配置了InnoDB 使用每个表一个表空间




3.InnoDB log files




4.任何的InnoDB 配置选项,比如 存储在选项文件里的。 配置的选项文件当你restore的时候是需要的




4.重启server






另外一种方式来备份InnoDB 是使用InnoDB Hot Backup.






使用2进制备份来恢复InnoDB 表空间,停止server,替换之前的备份,重启server




如果你需要使用2进制的InnoDB 备份来复制InnoDB 表到其他的server,需要满足的条件


在32.3.4 有描述, 2机制可移植的条件。


注意 你必须拷贝表空间文件作为组 就是说恢复操作你需要替换的任何一个表空间文件到目的server


你不能增加表空间到另外的 使用binary backup


32.3.3  其它的Binary Backup 工具






myslhoycopy 和InnoDB Hot BACKUP,是特定的程序用于特殊的存储引擎帮助你进去2进制备份。




32.3.3.1  mysqlhotcopy:




mysqlhotcopy 脚本copy表到备份目录,是一个Perl脚本需要安装DBI模块。




mysqlhotcopy 只能用于MyISAM 表不能用于InnoDB 表


mysqlhoycopy 连接到本地的MySQL server,锁住表让server 不能修改,


flush table 确保任何挂起的修改写入磁盘然后 复制表的文件。


当完成了复制操作后,释放表锁。


mysqlhotcopy 必须运行server 主机上,才能复制表文件当表被锁处于合适的时候


它必须在server 运行的时候 才能连接到server 来lock 和flush table.




mysqlhotcopy 的操作是迅速 因为它直接复制表文件 相比通过网络。


它也是更加便利的相比执行语句来锁表和flush tables  因为它帮你操作了这些。




1.备份world 数据库到/var/archive目录下:




32.3.2 InnoDB Hot Backup




InnoDB Hot Backup 程序(ibbackup) 是一个商业产品。它可用于备份InnoDB 表


当server 运行部需要打开数据库的活动  它适用于Unix 和Windows.












32.3.4 Binary 可移植的条件:


Binary 移植是重要的如果你需要用一个2进制的备份 用于在另外的机器上(有不同的结构)


比如,适用一个2进制的备份单向的辅助数据库到另外一个服务器上。




对于MyISAM,binary 迁移意味着 你能直接复制MyISAM表的文件从一台Mysql server到另外不同


的机器 另外额机器可以直接访问




对于InnoDB,binary 迁移意味着你能直接复制表空间文件从一个MySQL 服务器到另外一台机器上


第二 server 可以访问表空间




默认的,所有的InnoDB 表被server 管理 存储在一起在表空间里,因此 表空间的迁移职责是


是否所有的InnoDB 表是可迁移的,如果一个表不能迁移,那么表空间也不行。




MyISAM 表和InnoDB 表空间是binary 迁移从一个主机到另外一台 如果2个条件满足:


1.2台机器必须使用2进制补码整数的结构


2.2台机器鄙视用IEEE 




实际情况,2个条件形成很小的限制






第三种情况是InnoDB 2进制迁移是 你必须使用小写字母命名数据库和表。




这是因为InnoDB 存储这些名字内部是小写在Windows上




使用小写名字允许binary 迁移在Windows和Unix 之间 强制使用小写名字,你可以使用下面的参数在选项文件里。


[mysqld]
lower_case_table_names=1


如果你配置InnoDB 使用每个表独立的一个表空间,这种情况 binary 迁移是延生到了包括


.ibd 文件用于InnoDB (对于共享的表空间仍旧应用因为它包含数据字典用于存储所有Inno DB表的信息)








32.4 文本备份:


这个章节描述你可以使用文本格式的数据库或者表备份






32.4.1  通过SQL 来进行文本备份




SELECT  ... INTO OUTFILE 语句把任意的结果集的内容下到server host的文件里。


对于备份目的,它可以用于下面格式:


mysql>  select * into  OUTFILE  'out.txt' from test.t1;
Query OK, 3 rows affected (0.00 sec)


mysql> quit


备份的文件在数据目录下:


[mysql@master data]$ pwd
/mysql/data
[mysql@master data]$ ls -ltr out.txt 
-rw-rw-rw- 1 mysql mysql 6 Mar 13 22:52 out.txt
[mysql@master data]$ 






SELECT .... INTO OUTFILE 有下面的特性:


1.语句可以用于本地或者远程servers,导出的文件是存放在server 主机上, 因为server 主机本身写文件。


2.output 文件必须不存在的


3.语句适用于任何引擎


3.需要需要FILE权限


32.4.2  用mysqldump 进行文本方式备份:


mysqldump 客户端程序dump 表数据到文件,它有下面的特性:


1.它能dump 所有的数据,指定的数据 或者指定的表




2.mysqldump 可以备份本地的或者远程的servers,尽管dump files的目的地依赖你如何调用。


对于tab键分割的数据文件使用--tab选项,server 写在server 主机上。


对于SQL格式的dump 文件包含CREATE TABLE 和INSERT 语句用于重建表,server 把表内容发送给mysqldump


写文件在客户端主机上。


1.它适用于任何引擎创建的表




2.数据的文件是以文本格式是编写的,可用于传输数据库内容到其他的server.




这个章节集中在使用mysqldump 来产生SQL格式的dump 文件




当你使用mysqldump 来进行SQL格式的dump 文件,有3个常规的模式可以操作,依赖第调用的参数:


1.默认情况下,mysqldump 解释它的第一个非选项参数作为一个数据库名字 


dump 这个数据库的所有表。如果任何其他参数跟在database name后面,




mysql dump 解释它们作为表名字 ,dump 这些表。


下面的命令dump world数据库的所有表的内容到文件word.sql




[mysql@master data]$ mysqldump test >test.sql






world.sql文件的内容开始一些像这样:




下面的命令 只备份world 数据库的city 和Country 表


shell> mysqldump world City Contry >city_country.sql


1. 用--databases(or -B) 选项,mysqldump 解析任何非选项参数作为数据库名字


dump 指定数据库下的所有表。 比如,下面的命令转储world 和test数据库到一个单独的文件


shell>mysqldump --databases world test >world_and_test.sql




2.--all-databases(或者-A)选项,mysqldump dump所有数据库的所有表 


比如,这条命令备份所有的数据库到文件alldb.sql:


shell>mysqldump --all-databases >alldb.sql


如果你管理大量的数据,alldb.sql 会很大,在执行前确认有足够的磁盘空间。




mysqldump 了解标准的连接参数选项,比如--host 和--user.




你可能需要提供这些选项 如果默认的连接参数不合适。mysqldump 也有选项提供更多的特定的控制


dump操作。调用mysqldump --help选项列出所有的选项。




下面列出最常用的选项:


--add-drop-table


指示mysqldump 来产生dump输出为每个表用drop table语句。


这个选项确保你在reload dump putput时候,reload操作删除任何存在表的copy 在重建前




--add-locks


在INSERT语句周围添加需要table locks 用于dumped tables




--create-options


指示mysqldump 来产生创建表的语句包括所有的MYSQL指定的选项。


默认,mysqldump 不包括所有的选项,导致dump文件可能更加方便的用于加载到其他DBMS数据库




32.4.3 用Mysql Adminstrator 进行文本备份




MySQL 管理器的GUI程序提供了备份和恢复的功能。 它产生包含SQL语句的备份文件


用于reload 到mysql server 来重建数据库和表。 这些文件类似mysqldump 产生的SQL格式的备份文件




MySQL Administrator 存储备份的配置选项叫做工程。




32.5 备份Log 和Status Files


除了备份数据库之外,你也可以备份下面的文件:


1.你的binary log文件。这个是必要的 如果你需要执行一个恢复操作,


binary logs 存储了你对数据库备份后的所有update操作


2.server 使用的选项文件(my.cnf 和my.ini.files) 这些文件包含了 配置信息 当发生crash后必须恢复


3.复制slave server 创建一个master.info 文件包含了连接到master server 的信息


和relay-log.info 文件表明当前处理relay logs的进程




4.复制slaves 创建数据文件用于处理load data infile语句。这些文件位于的目录有参数slave_load_tmpdir决定




为了备份当前文件,你需要使用普通文件的系统操作,静态的文件 比如选项文件


可以没有特殊的预防进行备份。动态的文件比如logs server 在运行时会改变 最后停止server 在备份。


32.6  Replication as an Aid to backup


       复制作为一个助手来备份






如果你个mysql server 作为一个master 在复制阶段,你可以使用slave 服务器来进行备份代替master上的备份:


1。让server 停止处理从master接收的更新,你可以通过stop server


通过执行 STOP SLAVE SQL_THREAD 语句。 在下面的步骤,你也要强制flush table 把pending 的修改写入磁盘




2. 对slave 数据库做一个备份  使用的方法依赖你是否停止或者让它运行


比如:如果你停止server,你不能使用任何程序连接,比如mysqldump 或者mysqlhotcopy


3.重启server 如果你已经停止,如果你让server 运行,重启SQL thread 通过执行


START SLAVE SQL_THREAD 语句






用这种方式备份好处是 你需要占用master server 。因此,你的master 根本不需要冲突,


备份的过程不强制任何额外的磁盘或者负载。


32.7  MySQL Cluster as 灾难预防




Mysql Cluster 使用一个多个进程表现为一个cluster nodes的结构 提供了 表数据的多份拷贝。


这种使用多个进程本身不是一种备份技术, 但是它提供了数据冗余减少了潜在的数据丢失


如果任何的节点变的不可用。


因此,增加更多的节点来增加更大的冗余。




32.8 Data Recovery




备份的一个主要功能是用于数据恢复操作。 它作为一个给定时间点的数据库的快照


然而,对于一个活动的server,数据改变会在最近的备份之后。






另外的恢复操作的组成成分是记录了server的改变操作,那就是binary log


一个恢复操作调用使用的备份来恢复数据库,然后重新执行备份后对数据库的修改。


 
常规的恢复步骤包含下面内容:




1. 做一个数据的备份,万一恢复出现异常


2.恢复数据库使用你的备份文件,如果你是一个2进制备份,这个步骤包括


停止server 和替换丢失或者损坏的文件。 


3.重新执行记录在Binary log 的改变


32.8.1  reloading mysqldump 的输出


reload 一个SQL格式的dump文件有mysqldump产生的,用mysql命令处理。比如


你可以有个Country 表在world数据库里的备份


shell>mysqldump world Country >dump.sql


加载是:


shell>mysql world<dump.sql






[mysql@master ~]$ mysqldump test students >dump.sql


[mysql@master ~]$ mysql nba<dump.sql 




mysql 命令用于加载mysqldump 的输出 应该包含数据库名字 如果dump文件本身不包含数据库名字。




没有必要用数据库的名字 如果加载的dump 文件是调用mysqldump 使用--database 或者--all-databases 选项。


在这种情况下,dump 文件包含了使用db_name的语句


mysqldump 输出不只是能用于恢复表或者数据库,也可以copy 它们。mysql 可以读管道,


你可以联合使用mysqldump 和msql 在一条命令 来复制表数据从一个数据库到另一个数据库。


比如,复制Country 表从world 数据库到test 数据库 使用下面的命令:


shell>mysqldump world Country | mysql test






管道技术也可以用于复制数据库或者表通过网络到其他的server.


如果dump 文件包含了很长的INSERT语句,他们可能超过了默认的communications buffer(1MB).


你可以增加 mysqldump和mysql 的buffer size 通过--max-allowed-packet 选项。


这些选项值可以指定为bytes ,K,M或者G 来表明size .



































































































































原文地址:https://www.cnblogs.com/hzcya1995/p/13351742.html