内容摘要:
本篇主要是对项目运行过程中会产生的一些数据维护,更新,参数设置等常用操作的记录和总结,方面在运用是有个参考。主要内容会涉及可参考目录简介。本编包含后8-10章节。本篇主要介绍数据的备份和恢复。
目录简介:
1. 数据库启停及状态检查
2. CREATE操作项目
3. ALTER操作项目
4. 数据库参数查看和设置
5. 客户端权限管理
6. 事件调度/临时触发器/定制任务
7. 触发器、存储过程
8. 数据备份和恢复
9. 数据库表空间文件维护
10. 性能优化
标签:
MySql,Create,Alter,ShowParameter,Event,Trigger,Procedure,Privilige,mysqldump,source
8. 数据备份和恢复
一:备份的作用
1灾难恢复:硬件故障、一个不经意的bug导致数据损坏或者服务器机器数据由于某些原因不可获取或者无法使用
2人们改变想法:例如删除数据后又想恢复这些数据
3测试:基于实际数据来测试的方法是,定期用最新的生产环境数据更新测试服务器。
二:备份策略
1首先要确定是事务性还是非事务性,两种不同的存储引擎备份方式在处理数据一致性方面是不一样的;
2确定使用全备份还是增量备份;
3可以采用复制的方法做异地备份,但是,复制不能代替备份,它对数据库的误操作也无能为力;
4要定期的做备份,备份的周期要充分考虑系统可以承受的恢复时间,备份要在系统负载较小的时候进行;
5确保MySQL打开log-bin选项,有了BINLOG,MySQL才可以在必要的时候做完整恢复,或基于时间点的恢复,或基于位置的恢复。
三:备份种类
1.离线备份
离线备份,是关闭MySQL做备份,是一种简单而且安全的备份方法。它不用关注InnoDB缓冲池中的脏页或者其他缓存。也不需要担心数据在尝试备份的过程中被修改,并且因为服务器不对应用提供访问,所以可以很快的完成备份,但是在高负载和高并发下对MySQL进行关闭和重启的时间还是无法容忍的,这会导致昂贵的代价。
2.在线备份
在线备份是不需要生产服务器停机的备份。但是由于一致性的要求,对服务器进行在线备份的时候仍然会有明显的服务中断。MyISAM引擎的数据库,一般系统会使用FLUSH TABLES WITH READ LOCK操作,这会导致MySQL关闭并锁住所有的表,将MyISAM的数据文件刷新到磁盘上,并且刷新查询缓存。
3.逻辑备份
逻辑备份是将数据导出到相应的文件中,以一种MySQL能够解析的形式进行保存。
逻辑备份的优点:
1. 可以使用编辑器像grep和sed之类的命令查看和操作的普通文件;
2. 可以通过网络来备份和恢复;
3. 与存储引擎无关;
4. 有助于避免数据损坏。
逻辑备份的缺点:
1. 必须由数据库服务器生成逻辑备份的工作,会消耗很多的CPU周期;
2.逻辑备份在某些场景下比数据库文件本身更大;
3.从逻辑备份中还原需要MySQL加载与解释语句,转化为存储格式,并重建索引,所有这一切会很慢。
4.物理备份
物理备份是直接复制原始文件的方式进行备份。原始文件是指存在于硬盘上的文件。
物理备份的优点:
1. 基于文件的物理备份,只需要将需要的文件复制到其他地方即可完成备份。不需要其他额外的工作来生成原始文件。
2. 从物理备份中恢复比较快速,因为MySQL服务器不需要执行任何SQL或构建索引。
物理备份的缺点:
1. InnoDB的原始文件通常比相应的逻辑备份要大很多;
2. 物理备份不总是可以跨平台、操作系统及MySQL版本。
5.混合备份
建议混合使用物理和逻辑两种方式来做备份:先使用物理复制,以此数据启动MySQL服务器实例并运行mysqlcheck。
6.增量备份
增量备份是自从任意类型的上次备份后所有修改做的备份。增量备份对减少服务器开销、备份时间及备份空间而言都很适合。
增量备份的缺点包括增加恢复复杂度,额外的风险,以及更长的恢复时间。如果可以做全备,考虑到简便性,做好使用全备份。
四:一致性
数据一致性
在线备份,需要所有的相关表的一致性备份。如果使用的不是事务型存储引擎,需要在备份时候使用LOCK TABLES来锁住所有要一起备份的表,备份完成后再释放锁。InnoDB需要在服务器上使用REPEATABLE READ事务隔离级别,并且没有任何DDL以及基于时间点的数据快照,切回备份过程中不会阻塞任何后续的工作。
复制
复制不是备份。备库对生成备份是一个干涉较少的源,但它不是备份本身。对于RAID卷,SAN和文件系统快照,也同样如此。从备库中备份最大的好处是可以不干扰主库,避免在主库上增加额外的负载。
五:备份内容
1. 物理备份
1.1生成物理备份
MySQL中的每一个数据库和数据表分别对应文件系统中的目录和其下的文件。在Linux下数据库文件的存放目录一般为/var/lib/mysql。在Windows下这个目录视MySQL的安装路径而定,DiaHosting的技术员一般为客户安装在D:serversoftmysql下。如,有一个名为bbs的数据库,那么bbs的数据库文件会存放在/var/lib/mysql/bbs(linux)或者D:serversoftmysqlbbs(Windows)下。
物理备份主要是备份数据(包括表,索引,视图等逻辑对象所在的物理文件)文件到备份目录,以便需要恢复时使用。备份按照冷备和热备介绍。
冷备份
冷备份就是停掉数据库服务,cp数据文件的方法,这种方法对MyISAM和InnoDB存储引擎都适合。但是一般很少用,因为很多应用是不允许长时间停机的。进行备份的操作是:暂停MySQL服务,在操作系统级别备份MySQL的数据文件和日志文件到备份目录。
备份文件前,需要将MySQL服务停止,然后将数据库目录拷贝即可。
热备份
1.MyISAM存储引擎
MyISAM存储引擎的热备份是有很多方法,但是其实质就是将要备份的表加读锁,然后再cp数据文件到备份目录。
方法一:使用mysqlhotcopy工具
mysqlhotcopy是MySQL自带的一个热备份工具,使用方法很简单:
shell>mysqlhotcopy db_name[/path/to/new_directory]
方法二:手工锁表copy
首先数据库中所有表加读锁
mysql>flush tables for read;
然后cp数据文件到备份目录即可。
2.InnoDB存储引擎
Percona XtraBackup工具是InnoDB进行热备份的工具。它是开源并且免费的,除了核心备份工具外,还有一个用Perl写的封装脚本,可以提供更多高级功能,它支持类似流、增量、压缩和多线程备份操作。也有许多特别的功能,用以降低在高负载的系统上备份的影响。
1.2物理备份恢复
物理备份的恢复是针对备份的反向过程,需要两个步骤。针对冷热恢复区别只是在于对物理文件恢复时数据服务是否启动。
1. 将备份的数据库目录中的文件还原回数据系统所在的数据库文件目录,数据还原到物理备份点。
2. 使用mysqlbinlog工具恢复自备份以来的所有BINLOG。(为了保证数据的一致性和可恢复到备份点到当前时间内的任一时间段。这个就是为什么要打开binlog的原因)
在对BINLOG恢复时,可以更精确的控制还原点,参考如下:
时间点恢复:
1. 如果上午 10点发生了误操作,可以用以下语句用备份和 binglog将数据恢复到故障前:
mysqlbinlog--stop-date="2015-04-20 9:59:59"
/var/log/mysql/bin.123456 | mysql -uroot –pmypwd
2. 跳过故障时的时间点,继续执行后面的 binlog,完成恢复
mysqlbinlog --start-date="2015-04-2010:01:00"
/var/log/mysql/bin.123456| mysql -uroot -pmypwd \
位置恢复:
和时间点恢复类似,但是更精确,步骤如下:
mysqlbinlog--start-date="2015-04-20 9:55:00" --stop-date="2015-04-20 10:05:00"/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
该命令将在/tmp目录创建小的文本文件,编辑此文件,找到出错语句前后的位置号,例如前后位置号分别是368312 和368315。恢复了以前的备份文件后,你应从命令行输入下面内容:
mysqlbinlog--stop-position="368312" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd
mysqlbinlog--start-position="368315" /var/log/mysql/bin.123456 \
| mysql -u root -pmypwd \
上面的第1 行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog 的输出包括每个SQL 语句记录之前的SET TIMESTAMP 语句,恢复的数据和相关MySQL 日志将反应事务执行的原时间。
2. 逻辑备份
2.1生成逻辑备份
有两种类型的逻辑备份:SQL导出和符号分割文件。
SQL导出
我们一般使用mysqldump方式进行SQL导出的操作。如下图是使用默认参数的mysqldump得到的输出结果。导出数据包括表结构和数据,都以有效的SQL命令形式写出。其中参数-l表示给所有表加一个读锁,-F表示生成一个新的日志文件。
备份单个库:mysqldump –u root –p*** backupdb –F > backupdb .sql
备份某些表:mysqldump –u root –p*** databasename backup_table1backup _table2 > backupfile.sql
备份多个库:mysqldump –u root –p*** –databases backupdb1backupdb2 backupdb3 > multibackupdb.sql
备份所有库:mysqldump –all-databases > allbackupdb.sql
备份数据库结构:mysqldump –no-data –databases backupdb1backupdb2 backupdb3 > structurebackupdb.sql
直接备份的时候转移到新的服务器: mysqldump –u root –p*** backupdb | mysql –host=*.*.*.* -C databasename
SQL还原
方法1. mysqldump –u root –p*** backupdb < backupdb .sql
方法2.进入mysql在mysql提示符下mysql> source backupdb.sql
符号分割文件备份
使用SQL命令SELECT INTO OUTFILE以符号分隔文件格式创建数据的逻辑备份。符号分隔文件包含以ASCII展示的原始数据,没有SQL、注释和列名。
mysql>select* into outfile '/tmp/user.txt'
->fields terminated by ',' optionallyenclosed by '"'
->lines terminated by '\n'
->from datacrawldb.users_user
符号分割文件还原
如果是通过SELECT INTOOUTFILE导出的符号分隔文件,可以使用LOAD DATA INFILE通过相同的参数来加载,也可以使用mysqlimport,这是LOAD DATA INFILE的一个包装,这种方式依赖命令约定决定从哪里加载一个文件的数据。
Mysql>loaddata infile '/tmp/user.txt'
->into datacrawldb.users_user
->fields terminated by ',' optionallyenclosed by '"'
->lines terminated by '\n'
mysqlimport可以单独查询相关资料
注:不管是逻辑备份还是物理备份,恢复时只能恢复到备份点。若在备份点之后的某个时间出现误操作要基于时间点恢复,需要用到BINLOG作为备份恢复的辅助。