mysqldumpselect_逻辑备份,mysqldump,SELECT…
INTOOUT。。。
逻辑备份
mysqldump
mysqldump备份⼯具最初由Igor Romanenko编写完成,通常⽤来完成转存(dump)数据库的备份以及不同数据库之间的移植,例如从低版本的MySQL数据库升级到⾼版本的MySQL数据库,或者从MySQL数据库移植到Oracle和SQL Server等数据库等。
mysqldump的语法如下:
mysqldump [arguments] > file_name
如果想要备份所有的数据库,可以使⽤--all-databaes选项:
mysqldump --all -databases > dump.sql
如果想要备份指定的数据库,可以使⽤--databases选项:
mysqldump --databases db1 db2 db3 > dump.sql
如果想要对test这个架构进⾏备份,可以使⽤如下语句:
mysqldump --single -transaction test > test_backup.sql
我们使⽤--single-transaction选项来保证备份的⼀致性,备份出的test_backup.sql是⽂本⽂件,通过命令cat就可以查看⽂件的内容:cat test_backup.sql
可以看到,备份出的⽂件内容就是表结构和数据,所有这些都是⽤SQL语句表⽰的。⽂件开始和结束处的注释是⽤来设置MySQL数据库的各项参数的,⼀般⽤来使还原⼯作能更有效和准确的进⾏。之后的部分先是CREATE TABLE语句,之后就是INSERT语句了。
mysqldump的参数选项很多,可以通过mysqldump -help命令来查看所有的参数,有些参数有缩写,如--lock-tables的缩写为-l,重点介绍⼀些⽐较重要的参数。
--single-transaction:在备份开始前,先执⾏START TRANSACTION命令,以此来获得备份的⼀致性,当前该参数只对InnoDB存储引擎有效。当启⽤该参数并进⾏备份时,确保没有其他任何的DDL语句执⾏,因为⼀致性读并不能隔离DDL语句。
-
-lock-tables(-l):在备份中,依次锁住每个架构下的所有表。⼀般⽤于MyISAM存储引擎,备份时只能对数据库进⾏读取操作,不过备份依然可以保证⼀致性。对于InnoDB存储引擎,不需要使⽤该参数,⽤--single-transaction即可,并且-lock-tables和-single-transaction 是互斥(exclusive)的,不能同时使⽤。如果你的MySQL数据库中既有MyISAM存储引擎的表,⼜有InnoDB存储引擎的表,那么这时你的选择只有--lock-tables了。另外,前⾯说了,--lock-tables选项是依次对每个架构中的表上锁的,因此只能保证每个架构下表备份的⼀致性,⽽不能保证所有架构下表的⼀致性。
--lock-all-tables(-x):在备份过程中,对所有架构中的所有表上锁。这可以避免之前提及的--lock-tables参数不能同时锁住所有表的问题。
--add-drop-database:在CREATE DATABASE前先运⾏DROP DATABASE。这个参数需要和-all-databases或者-databases选项⼀起使⽤。默认情况下,导出的⽂本⽂件中并不会有CREATE DATABASE,除⾮你指定了这个参数,因此可能会看到如下内容:
mysqldump --single -transaction --add -drop -database --databases test > test_backup.sql
cat test_backup.sql
--master-data[=value]:通过该参数产⽣的备份转存⽂件主要⽤来建⽴⼀个slave replication。当value
的值为1时,转存⽂件中记录CHANGE MASTER语句;当value的值为2时,CHANGE MASTER语句被写成SQL注释。默认情况下,value的值为空。
当value值为1时,在备份⽂件中会看到:
mysqldump --single -transaction --add -drop -database --master -data=1 --databases test>test_backup.sql
cat test_backup.sql
CHANGE MASTER TO MASTER_LOG_FILE='xen-server-bin.000006',MASTER_LOG_POS=8095;
当value为2时,在备份⽂件中会看到CHANGE MASTER语句被注释了:
mysqldump --single -transaction --add -drop -database --master -data=1 --databases test>test_backup.sql
cat test_backup.sql
--Position to start replication or point-in-time recovery from
--master-data会⾃动忽略-lock-tables选项。如果没有使⽤-single-transaction选项,则会⾃动使⽤-lock-all-tables选项。
--events(-E):备份事件调度器。
--routines(-R):备份存储过程和函数。
--triggers:备份触发器。
--hex-blob:将BINARY、VARBINARY、BLOG、BIT列类型备份为⼗六进制的格式。mysqldump导出的⽂件⼀般是⽂本⽂件,但是,如果导出的数据中有上述这些类型,⽂本⽂件模式下可能有些字符不可见,若添加-he-blob选项,结果会以⼗六进制的⽅式显⽰,如:
mysqldump --single -transaction --add -drop -database --master -data=2 --no -autocommit --databases test3 >
test3_backup.sql
cat test3_backup.sql
LOCK TABLES'a'WRITE;
set autocommit=0;
INSERT INTO'a'VALUES(0x61000000000000000000);
UNLOCK TABLES;
可以看到,这⾥⽤0x61000000000000000000(⼗六进制的格式)来导出数据。
--tab=path(-T path):产⽣TAB分割的数据⽂件。对于每张表,mysqldump创建⼀个包含CREATE TABLE语句的table_name.sql⽂件和包含数据的。可以使⽤--fields-terminated-by=……,--fields-enclosed-by=……,--fields-optionally-enclosed-
by=……,--fields-escaped-by=……,--lines-terminated-by=……来改变默认的分割符、换⾏符等,如:
mysqldump --single -transaction --add -drop -database --tab="/usr/local/mysql/data/test" test
⼤多数DBA喜欢⽤SELECT……INTO OUTFILE的⽅式来导出⼀张表,但是通过mysqldump⼀样可以完成⼯作,⽽且可以⼀次完成多张表的导出,并且保证导出数据的⼀致性。
--where='where_condition'(-w 'where_condition'):导出给定条件的数据。
例如,导出b架构下的表a,并且表a的数据⼤于2,如下所⽰。
mysqldump --single -transaction --where='b>2' test a > a.sql
SELECT……INTO OUTFILE
SELECT……INTO语句也是⼀种逻辑备份的⽅法,或者更准确地说是导出⼀张表中的数据。
SELECT……INTO的语法如下:
SELECT [column 1], [column 2]……
INTO
OUTFILE 'file_name'
[{FIELDS|COLUMNS}
[TERMINATED BY'string']
[[OPTIONALLY]ENCLOSED BY'char']
[ESCAPED BY'char']
]
[LINES
[STARTING BY'string']
[TERMINATED BY'string']
]
FROM TABLE WHERE……
字段[TERMINATED BY 'string']表⽰每个列的分隔符,
[[OPTIONALLY]ENCLOSED BY'char']表⽰对于字符串的包含符,
[ESCAPED BY'char']表⽰转义符,
[STARTING BY'string']表⽰每⾏的开始符号,
TERMINATED BY'string'表⽰每⾏的结束符号。
如果没有指定任何FIELDS和LINES的选项,默认使⽤以下的设置:
FIELDS TERMINATED BY '\t'
ENCLOSED BY ''
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
STARTING BY ''
file_name表⽰导出的⽂件,但⽂件所在的路径的权限必须是mysql:mysql,否则MySQL会报告没有权限导出:
select * into outfile '/' from a;
ERROR 1(HY000):Can't create/write to file'/'(Errcode:13)
查看通过SELECT INTO导出的表a⽂件:
select * into outfile '/home/' from a;
quit
cat /home/
1 a
2 b
可以发现,默认导出的⽂件是以TAB进⾏列分割的,如果想要使⽤其他分割符,如“,”,则可以使⽤FIELDS TERMINATED BY'string'选项,如:
mysql test -e "select * into outfile '/home/' fields terminated by','from a";
cat /home/
1,a
2,b
在Windows平台下,因为其换⾏符是“\r\n”,因此在导出时可能需要指定LINES TERMINATED BY选项,如:
mysql test -e "select * into outfile '/home/' fields terminated by',' lines terminated by '\r\n' from a";
od -
0000000 1,a\r\n 2,b\r\n 3
0000017
逻辑备份的恢复
mysqldump的恢复
mysqldump的恢复操作⽐较简单,因为备份的⽂件就是导出的SQL语句,⼀般只需要执⾏这个⽂件就可以了,可以通过以下的⽅法:
mysql -uroot -p123456<test_backup.sql
如果在导出时包含了创建和删除数据库的SQL语句,则必须确保删除架构时架构⽬录下没有其他与数据库⽆关的⽂件,否则可能会出现以下的错误:
drop database test;
ERROR 1010(HY000):Error dropping database(can't rmdir'./test',errno:39)
因为逻辑备份的⽂件是由SQL语句组成的,所以也可以通过SOURCE命令来执⾏导出的逻辑备份⽂件,如下所⽰:
source /home/mysql/test_backup.sql;
Query OK,0 rows affected(0.00 sec)
……
Query OK,0 rows affected(0.00 sec)
通过mysqldump可以恢复数据库,但是常发⽣的⼀个问题是mysqldump可以导出存储过程、触发器、事件、数据,但是却不能导出视图。因此,如果你的数据库中还使⽤了视图,那么在⽤mysqldump备
份完数据库后还需要导出视图的定义,或者保存视图定义的frm⽂件,并在恢复时进⾏导⼊,这样才能保证mysqldump数据库的完全恢复。
LOAD DATA INFILE
若是通过mysqldump --tab或SELECT INTO OUTFILE导出的数据需要恢复时,这时需要通过LOAD DATA INFILE命令来进⾏导⼊。
LOAD DATA INFILE的语法如下所⽰:
LOAD DATA [LOW_PRIORITY|CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE|IGNORE]
INTO TABLE tbl_name
[CHARACTER SET charset_name]
[{FIELDS|COLUMNS}
[TERMINATED BY'string']
[[OPTIONALLY]ENCLOSED BY'char']
[ESCAPED BY'char']
]
[LINES
[STARTING BY'string']
[TERMINATED BY'string']
]
[IGNORE number LINES]
[(col_name_or_user_var,……)]
[SET col_name=expr,……]
要对服务器⽂件使⽤LOAD DATA INFILE,必须拥有FILE权,其中导⼊格式的选项和之前介绍的SELECT INTO OUTFILE命令完全⼀样。IGNORE number LINES选项可以忽略导⼊的前⼏⾏。
下⾯来看⼀个⽤LOAD DATA INFILE命令导⼊⽂件的⽰例,并忽略第⼀⾏的导⼊:
load data infile '/home/' into table a;
为了加快InnoDB存储引擎的导⼊,你可能希望导⼊过程忽略对外键的检查,因此可以使⽤如下⽅式。
set @@foreign_key_checks=0;
load data infile '/home/' into table a;
set @@foreign_key_checks=1;
可以针对指定的列进⾏导⼊,如将数据导⼊列a、b,⽽c列等于a、b列之和:
create table b(a int,b int,c int,primary key(a))engine=innodb;
load data infile '/home/' into table b fields terminated by',' (a,b) set c=a+b;
LOAD DATA INFILE命令可以⽤来导⼊数据,但同时可以完成对Linux操作系统的监控。如果需要监控CPU的使⽤情况,可以通过加
载/proc/stat来完成。
⾸先我们需要建⽴⼀张监控CPU的表cpu_stat,其结构如下所⽰:
CREATE TABLE IF NOT EXISTS DBA.cpu_stat(
id bigint auto_increment primary key,
value char(25) NOT NULL,
user bigint,
nice bigint,
system bigint,
idle bigint,
iowait bigint,
irq bigint,
softirq bigint,
steal bigint,
guest bigint,
other bigint,
time datetime
);
接着可以通过⽤LOAD DATA INFILE命令来加载/proc/stat⽂件,但需要对其中⼀些数值进⾏转化,命令如下所⽰:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论