MySQL數據庫的備份與恢復(1)——使用Select Into Outfile和Load Data Infile命令
一、使用Select Into Outfile命令導出數據
命令格式如下:
SELECT ...
INTO OUTFILE 'file_name'
fields terminated by 'char';
說明:
(1)OUTFILE參數指定的文件所在的路徑需要有mysql的訪問權限,否則會報錯。
(2)每一條記錄的數據之間默認以 Tab 分隔,也可使用fields terminated參數指定分隔符。
(3)執行Select into outfile和Load data infile命令需要開啓在my.cnf參數文件中設置secure_file_priv參數。該參數的設置如下:
——NULL:MySQL服務會禁止導入和導出操作;
——目錄名:MySQL服務只允許在這個目錄中執行文件的導入和導出操作。目錄必須存在,MySQL服務不會創建它;
——空字符串(’ '):代表文件可以在任意位置。
1、查看secure_file_priv參數的取值
mysql> show variables like '%secure_file_priv%';
+------------------+-----------------------+
| Variable_name | Value |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
1 row in set (0.01 sec)
2、修改secure_file_priv參數的取值
[root@Mysql11 ~]# vim /etc/my.cnf ##編輯MySQL配置文件
#######################################################################
[mysqld]
..........
secure_file_priv=''
..........
#######################################################################
重啓MySQL服務,查看secure_file_priv參數的取值
mysql> show variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
1 row in set (0.00 sec)
3、舉例
(1)使用select導出數據——不指定分隔符
mysql> select * from stu into outfile '/tmp/stu.txt';
Query OK, 5 rows affected (0.00 sec)
查看stu.txt文件的內容,數據之間使用tab鍵分隔。
[root@Mysql11 ~]# cat /tmp/stu.txt
1 zhangsan 20 Xinxiang 15578941258
2 tom 20 Xinxiang 13778942222
3 jack 20 Zhengzhou 13675871454
4 john 21 Zhengzhou 13937681111
5 mark 22 Aanyang 13055882233
(2)使用select導出數據——指定分隔符
mysql> select * from stu into outfile '/tmp/stu2.txt' fields terminated by ',';
Query OK, 5 rows affected (0.00 sec)
查看stu.txt文件的內容,數據之間使用逗號(,)分隔。
[root@Mysql11 ~]# cat /tmp/stu2.txt;
1,zhangsan,20,Xinxiang,15578941258
2,tom,20,Xinxiang,13778942222
3,jack,20,Zhengzhou,13675871454
4,john,21,Zhengzhou,13937681111
5,mark,22,Aanyang,13055882233
二、使用Load Data Infile命令導入數據
命令格式如下:
LOAD DATA [LOCAL] INFILE 'file_name'
INTO TABLE tbl_name
[TERMINATED BY 'string';
說明:
(1)根據文件的格式指定相應的分隔符;
(2)在非服務端執行Load data需要使用local。比如通過B機器登錄A上的mysqld,就需要用到 local 。
1、使用stu.txt文件導入數據
(1)清空stu表中的數據
mysql> truncate stu;
Query OK, 0 rows affected (0.04 sec)
mysql> select * from stu;
Empty set (0.00 sec)
(2)導入數據
mysql> load data infile '/tmp/stu.txt' into table stu;
Query OK, 5 rows affected (0.00 sec)
Records: 5 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from stu;
+----+----------+------+-----------+-------------+
| id | name | age | address | phone |
+----+----------+------+-----------+-------------+
| 1 | zhangsan | 20 | Xinxiang | 15578941258 |
| 2 | tom | 20 | Xinxiang | 13778942222 |
| 3 | jack | 20 | Zhengzhou | 13675871454 |
| 4 | john | 21 | Zhengzhou | 13937681111 |
| 5 | mark | 22 | Aanyang | 13055882233 |
+----+----------+------+-----------+-------------+
5 rows in set (0.00 sec)
2、使用stu2.txt文件導入數據
(1)清空stu表中的數據
mysql> truncate stu;
Query OK, 0 rows affected (0.02 sec)
mysql> select * from stu;
Empty set (0.00 sec)
(2)導入數據
如果不指定分隔符,則會出現如下錯誤:
mysql> load data infile '/tmp/stu2.txt' into table stu;
ERROR 1265 (01000): Data truncated for column 'id' at row 1
指定分隔符,導入成功:
mysql> load data infile '/tmp/stu2.txt' into table stu fields terminated by ',';
Query OK, 5 rows affected (0.00 sec)
Records: 5 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from stu;
+----+----------+------+-----------+-------------+
| id | name | age | address | phone |
+----+----------+------+-----------+-------------+
| 1 | zhangsan | 20 | Xinxiang | 15578941258 |
| 2 | tom | 20 | Xinxiang | 13778942222 |
| 3 | jack | 20 | Zhengzhou | 13675871454 |
| 4 | john | 21 | Zhengzhou | 13937681111 |
| 5 | mark | 22 | Aanyang | 13055882233 |
+----+----------+------+-----------+-------------+
5 rows in set (0.00 sec)