select … into outfile 备份恢复(load data)以及mysqldump时间对比

Posted 翰墨文海 QQ1319820057

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了select … into outfile 备份恢复(load data)以及mysqldump时间对比相关的知识,希望对你有一定的参考价值。

select … into outfile \'path\' 备份

此种方式恢复速度非常快,比insert的插入速度要快的多,他跟有备份功能丰富的mysqldump不同的是,他只能备份表中的数据,并不能包含表的结构。如果备份完成之后,表被drop,是无法实现恢复操作的(除非有表结构)。

mysql> select * from t1 into outfile \'/mydata/mysql/mysql3307/data/t1.sql\';

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

mysql> show variables like \'%secure%\';

+--------------------------+-------+

| Variable_name            | Value |

+--------------------------+-------+

| require_secure_transport | OFF   |

| secure_auth              | ON    |

| secure_file_priv         | NULL  |

+--------------------------+-------+

3 rows in set (0.00 sec)

 

mysql> set secure_file_priv=\'/tmp\';

ERROR 1238 (HY000): Variable \'secure_file_priv\' is a read only variable

mysql> set session secure_file_priv==\'/tmp\';

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'==\'/tmp\'\' at line 1

mysql>

 

关闭MYSQL数据库,设置secure_file_priv 目录。

[root@mysql5 ~]# mysqladmin -S /tmp/mysql3307.sock -uroot -pmysql shutdown

mysqladmin: [Warning] Using a password on the command line interface can be insecure.

[root@mysql5 ~]#

[root@mysql5 ~]#

[root@mysql5 ~]# ps -ef |grep mysql

root      3506  2071  0 01:24 pts/1    00:00:00 grep mysql

[root@mysql5 ~]#

vi /etc/my3307.cnf

 

[mysqld]里面加入

 

secure_file_priv=/tmp

 

启动后查看

 

mysql> show global variables like \'%secu%\';

+--------------------------+-------+

| Variable_name            | Value |

+--------------------------+-------+

| require_secure_transport | OFF   |

| secure_auth              | ON    |

| secure_file_priv         | /tmp/ |

+--------------------------+-------+

3 rows in set (0.01 sec)

 

select * from t1 into outfile \'/tmp/t1_onlydata.sql\';

 

mysql> select * from t1 into outfile \'/tmp/t1_onlydata.sql\';

Query OK, 972864 rows affected (1.12 sec)

 

mysql> desc t1;

+-------+--------+------+-----+---------+-------+

| Field | Type   | Null | Key | Default | Extra |

+-------+--------+------+-----+---------+-------+

| id    | int(4) | YES  | MUL | NULL    |       |

+-------+--------+------+-----+---------+-------+

1 row in set (0.00 sec)

 

全是文本文件数据。

 

select … into outfile \'path\' 恢复

 

清除t1表数据,并进行恢复

mysql> truncate table t1;

Query OK, 0 rows affected (0.04 sec)

 

mysql> desc t1;

+-------+--------+------+-----+---------+-------+

| Field | Type   | Null | Key | Default | Extra |

+-------+--------+------+-----+---------+-------+

| id    | int(4) | YES  | MUL | NULL    |       |

+-------+--------+------+-----+---------+-------+

1 row in set (0.00 sec)

 

 

 

 

LOAD DATA恢复数据(只能恢复数据)

语法:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE \'file_name\'

    [REPLACE | IGNORE]

    INTO TABLE tbl_name

    [PARTITION (partition_name [, partition_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 | ROWS}]

    [(col_name_or_user_var

        [, col_name_or_user_var] ...)]

    [SET col_name={expr | DEFAULT},

        [, col_name={expr | DEFAULT}] ...]

 

 

 

load data INFILE \'/tmp/t1_onlydata.sql\'  INTO TABLE test.t1;

 

 

查看表数据:

 

 

恢复成功。

 

load data 与insert的插入速度对比

于是,我猜想可以用mysqldump进行表结构的备份,用select …into outfile 备份数据,load data 恢复数据,测试两者速度。

创建一张表。

 

 

 

delimiter //

create procedure per2()

begin

declare i int;

set i=1;

while i <= 1000000 do

insert into test.L values(i,\'aaaaa\');

set i=i+1;

end while;

end

 //

 

 

 

执行存储过程:

call per2();

//

查看数据(实际我只插入仅14万行数据)

 

 

 

mysqldump备份元数据文件

mysqldump -S /tmp/mysql3307.sock -uroot -pmysql --single-transaction --set-gtid-purged=OFF test L -d > /tmp/L_meta.sql

 

 

 select … into outfile \'path\' 备份

select * from test.L into outfile \'/tmp/20180525test_Ldata.sql\'

 

 

 

 mysqldump备份整个表

 

mysqldump -S /tmp/mysql3307.sock -uroot -pmysql --single-transaction --set-gtid-purged=OFF test L  > /tmp/L_table.sql

 

 

 

恢复时间对比

1、MYSQLdump先恢复表结构(或者直接建表)

先删除,恢复表结构。

 

 

恢复表结构:

 

 

这核时间很快,就是建一张表的时间,不计算进去对整体时间没有影响。

例如我建表:

 

 

建表时间0.03s。

2、load data恢复时间

load data INFILE \'/tmp/20180525test_Ldata.sql\' INTO TABLE test.L;

 

时间是1.59s。

  

3、MYSQLDUMP这种插入方式恢复

time mysql -S /tmp/mysql3307.sock -uroot -pmysql test < /tmp/L_table.sql

 

 

将近2s MYSQLDUMP恢复时间。

 

 

总结

元数据恢复+LOAD DATA时间一共

T1=0.03+1.59=1.62s

 

MYSQLDUMP恢复一共花了

T2=1.99s

 

对于14万数据,load data比mysqldump快了近1/4,对于大数据量,应该快更多,在允许的情况下,可以利用元数据(或者表结构),配合LOAD DATA恢复单表。

 

以上是关于select … into outfile 备份恢复(load data)以及mysqldump时间对比的主要内容,如果未能解决你的问题,请参考以下文章

翻译:select into outfile(已提交到MariaDB官方手册)

Mysql select into outfile 命令

select into outfile

MySQL SELECT xxx INTO OUTFILE用法

select into outfile

SELECT INTO OUTFILE 无法写入文件