1、逻辑备份和恢复mysql
在MySQL中,逻辑备份的最大优势是对于各类存储引擎,均可以用一样的方法来备份;而物理备份则不一样,不一样的存储引擎有着不一样的备份方法。所以,对于不一样存储引擎混合的数据库,用逻辑备份会更简单一些。sql
1. 逻辑备份:数据库
MySQL中的逻辑备份是将数据库中的数据备份为一个文本文件,在MySQL 中,使用mysqldump工具来完成逻辑备份。工具
使用方法:this
(1)备份指定的数据库,或者此数据库中某些表:spa
mysqldump [options] db_name [tables]操作系统
(2)备份指定的一个或多个数据库:日志
mysqldump [options] --database DB1 [DB2 DB3...]server
(3)备份全部数据库:接口
mysqldump [options] --all-database
(若是没有指定数据库中的任何表,默认导出全部数据库中全部表。)
为了保证数据备份的一致性,MyISAM存储引擎在备份的时候须要加上-l参数,表示将全部表加上读锁,在备份期间,全部表将只能读而不能进行数据更新。可是对于事务存储引擎(InnoDB和BDB)来讲,能够采用更好的选项--single-transaction,此选项将使得InnoDB存储引擎获得一个快照(Snapshot),使备份的数据可以保证一致性。
使用示例:
mysqldump -u root -p test -l user_myi > user_myi.sql
2. 彻底恢复:
mysqldump的恢复很简单,将备份做为输入执行便可,具体语法以下:
mysql -uroot -p dbname < bakfile(若是是恢复某个表的话,这个表若已存在是不会恢复成功的,须要先建立表)
注意,将备份恢复后数据并不完整,还须要将备份后执行的日志进行重作,语法以下:
mysqlbinlog binlog-file | mysql -u root -p
彻底恢复示例:
(1)备份:
mysqldump -uroot -p -l -F test > test.sql
(-F表示生成一个新的日志文件)
(2)恢复备份:
flush logs;
mysql -uroot -p test < test.sql
注意:
这里建立新binlog日志文件再进行备份恢复,这样作是为了防止备份恢复的操做也被记录到彻底恢复须要使用的binlog日志文件中。
(3)使用mysqlbinlog恢复自mysqldump备份以来的BINLOG:
mysqlbinlog localhost-bin.000015 | mysql -u root –p test
(这里的localhost-bin.000015就是从备份到第二步执行fush logs期间的binlog日志文件)
3. 不彻底恢复:
因为误操做,好比误删除了一张表,这时使用彻底恢复是没有用的,由于日志里面还存在误操做的语句,咱们须要的是恢复到误操做以前的状态,而后跳过误操做语句,再恢复后面执行的语句,完成咱们的恢复。这种恢复叫不彻底恢复,在MySQL中,不彻底恢复分为基于时间点的恢复和基于位置的恢复。
基于时间点的恢复主要使用mysqlbinlog中的两个选项--stop-date和--start-date来跳过误操做的时间点。而基于位置的恢复则是先在binlog日志文件中找到误操做语句先后的位置号,而后使用mysqlbinlog的选项--stop-position和--start-position跳过误操做的位置。这两种方法是相似的,但基于位置的恢复更精确,由于同一个时间点可能有不少条SQL语句同时执行。
2、物理备份和恢复
物理备份又分为冷备份和热备份两种,和逻辑备份相比,它的最大优势是备份和恢复的速度更快,由于物理备份的原理都是基于文件的cp。
1. 冷备份:
冷备份其实就是停掉数据库服务,cp数据文件的方法。这种方法对MyISAM 和InnoDB存储引擎都适合,可是通常不多使用,由于不少应用是不容许长时间停机的。
进行备份操做时,停掉MySQL服务,在操做系统级别备份MySQL的数据文件和日志文件到备份目录。进行恢复操做时,首先停掉MySQL服务,在操做系统级别恢复MySQL 的数据文件;而后重启MySQL服务,使用mysqlbinlog工具恢复自备份以来的全部BINLOG。
2. 热备份:
MySQL中,对于不一样的存储引擎热备份方法也有所不一样。
(1)MyISAM存储引擎:
MyISAM存储引擎的热备份有不少方法,本质其实就是将要备份的表加读锁,而后再cp数据文件到备份目录。
方法一:使用mysqlhotcopy工具。
mysqlhotcopy db_name [/path/to/new_directory]
方法2:手工锁表copy。
首先数据库中全部表加读锁:
flush tables for read ;
而后手工cp数据文件到备份目录便可。
(2)InnoDB存储引擎:
对于InnoDB存储引擎数据库,可使用Innobase公司的一个热备份工具ibbackup进行物理热备份。对于InnoDB和MyISAM混合的数据库,可使用Innobase公司提供的开源Perl脚本innobackup进行备份。
3、表的导入导出
1. 导出:
在某些状况下,为了一些特定的目的,常常须要将表里的数据导出为某些符号分割的纯数据文本,而不是SQL语句。
方法一:使用SELECT ...INTO OUTFILE ...命令来导出数据,具体语法以下。
SELECT * FROM tablename INTO OUTFILE 'target_file' [option];
其中option 参数能够是如下选项:
FIELDS TERMINATED BY 'string' (字段分隔符,默认为制表符’\t’);
FIELDS [OPTIONALLY] ENCLOSED BY 'char'(字段引用符,若是加OPTIONALLY 选项则只用在char、varchar 和text等字符型字段上。默认不使用引用符);
FIELDS ESCAPED BY 'char' (转义字符,默认为’\’);
LINES STARTING BY 'string' (每行前都加此字符串,默认'');
LINES TERMINATED BY 'string'(行结束符,默认为’\n’);
注:其中char表示此符号只能是单个字符,string表示能够是字符串。
使用示例:
select * from emp into outfile '/tmp/emp.txt' fields terminated by "," optionally enclosed by '"' ;
注意:
SELECT…INTO OUTFILE...产生的输出文件若是在目标目录下有重名文件,将不会建立成功,源文件不能被自动覆盖。
另外,若语句执行过程当中遇到“The MySQL server is running with the --secure-file-priv option so it cannot execute this statement”错误提示,那是由于mysql配置文件中配置的“secure-file-priv”配置项限制了SELECT … INTO OUTFILE报表到指定的目录,你能够选择使用配置中限定的这个目录来存放导出的文件,或者不使用这个配置项。
方法二:用mysqldump导出数据为文本。
mysqldump -u username -T target_dir dbname tablename [option]
其中option参数能够是如下选项:
--fields-terminated-by=name(字段分隔符);
--fields-enclosed-by=name(字段引用符);
--fields-optionally-enclosed-by=name(字段引用符,只用在char、varchar 和text 等字符型字段上);
--fields-escaped-by=name(转义字符);
--lines-terminated-by=name(记录结束符)
使用示例:
mysqldump -uroot -T /tmp test emp --fields-terminated-by ',' --fields-optionally-enclosed-by '"'
语句执行成功后,除了生成数据文件emp.txt以外,还生成一个emp.sql文件,里面记录了emp表的建立脚本,能够发现,除多了一个表的建立脚本文件外,mysqldump和SELEC…INTO OUTFILE…的选项和语法很是相似。其实,mysqldump实际调用的就是后者提供的接口,并在其上面添加了一些新的功能而已。
2. 导入:
这里只讨论用SELECT… INTO OUTFILE或者mysqldump导出的纯数据文本的导入方法。和导出相似,导入也有两种不一样的方法,分别是LOAD DATA INFILE…和mysqlimport,它们的本质是同样的,区别只是在于一个在mysql客户端内部执行,另外一个在mysql客户端外部执行。
方法一:使用“LOAD DATA INFILE…”命令。
LOAD DATA [LOCAL] INFILE 'filename' INTO TABLE tablename [option]
这里的option除了有和select ...into outfile同样的选项之外,还有一些不一样的选项:
IGNORE number LINES(忽略输入文件中的前n 行数据);
(col_name_or_user_var,...) (按照列出的字段顺序和字段数量加载数据);
SET col_name = expr,... 将列作必定的数值转换后再加载。
使用示例:
load data infile '/tmp/emp.txt' into table emp fields terminated by ',' enclosed by '"' ignore 2 lines (id,content,name);
方法二:用mysqlimport来实现,具体命令以下。
mysqlimport -u root -p*** [--LOCAL] dbname order_tab.txt [option]
这里的option除了有和mysqldump同样的选项之外,还有一些不一样的选项:
-- ignore-lines=number(忽略前几行)。
使用示例:
mysqlimport -uroot test /tmp/emp.txt --fields-terminated-by=',' --fields-enclosed-by='"'
注意:
使用select...into outfile方法导出的文件中记录的顺序和数据表中记录的顺序是同样的,而使用mysqldump导出的文件中记录的顺序则是和数据表中记录的顺序相反。使用load data infile方法和mysqlimport导入的数据表中的记录顺序和文件中记录的顺序都是相反的。因此,若是要求数据表导入导出先后表中记录顺序不变的话,应该使用mysqldump来导出。