日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Linux系统下MySQL的导出数据语句SELECT … INTO OUTFILE的用法

發布時間:2023/12/3 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统下MySQL的导出数据语句SELECT … INTO OUTFILE的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 關于參數 secure_file_priv
  • 按默認參數設定導出表數據到文本文件中
  • 自定義分隔符,將表數據導出到 txt 文件中
  • 自定義分隔符,將表數據導出到 csv 文件中
  • 導出數據時,提示“拒絕訪問”
  • 總結
    • 確保 Linux 用戶 mysql 對導出的目標目錄擁有寫入和執行兩種權限
    • 將數據導出到 /tmp 目錄下
    • 在導出數據時不指定目標文件的絕對路徑

操作系統的版本是:CentOS Linux release 8.2.2004 (Core)
數據庫的版本是:mysql Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using EditLine wrapper

關于參數 secure_file_priv

在文件 /etc/my.cnf 中,有一個參數叫 secure_file_priv,這個參數的主要目的就是限制 LOAD DATA INFILE 和 SELECT INTO OUTFILE語句的導入導出的目錄位置。登錄數據庫后,可以執行下面的命令語句查看該參數的值:

mysql> select @@secure_file_priv; +--------------------+ | @@secure_file_priv | +--------------------+ | / | +--------------------+ 1 row in set (0.00 sec)

從結果可以看到參數 secure_file_priv 的值是 /,表示可以在根目錄下,即可以在任何目錄下導入和導出,實際測試中發現可以在任何目錄導入數據,但是根本無法在任何目錄下導出數據,只能在目錄 /tmp 下導出數據,其它目錄則不行。

按默認參數設定導出表數據到文本文件中

數據表 student 存儲的數據如下:

mysql> select * from student; +----------------------+--------------+------+-------+----------+---------------------+ | id | name | age | score | birthday | insert_time | +----------------------+--------------+------+-------+----------+---------------------+ | 00000000000000000001 | liaowenxiong | 18 | NULL | NULL | 2021-09-25 10:40:51 | | 00000000000000000002 | liudehua | 28 | NULL | NULL | 2021-09-25 10:40:51 | | 00000000000000000003 | zhangxueyou | 38 | NULL | NULL | 2021-09-25 10:40:51 | +----------------------+--------------+------+-------+----------+---------------------+ 3 rows in set (0.00 sec)

將數據表 student 的數據導出到文件 /tmp/student.txt 中:

mysql> select * from student into outfile '/tmp/student.txt';

在命令終端中查看該文件的內容如下:

[root@htlwk0001host ~]# cat /tmp/student.txt 00000000000000000001 liaowenxiong 18 \N \N 2021-09-25 10:40:51 00000000000000000002 liudehua 28 \N \N 2021-09-25 10:40:51 00000000000000000003 zhangxueyou 38 \N \N 2021-09-25 10:40:51

注:\N 表示空值。

使用圖形化編輯器打開文件 /tmp/student.txt 看下:

自定義分隔符,將表數據導出到 txt 文件中

用以下命令把 student 表的數據導出到 /tmp/student.txt:

mysql> select * from student into outfile '/tmp/student.txt' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n'; Query OK, 3 rows affected (0.00 sec)

參數說明:

into outfile – 指定導出的目錄和文件名
fields terminated by – 指定字段間分隔符,即定義字段間的分隔符
optionally enclosed by – 指定字段包圍符,即定義包圍字段的字符,而參數optionally表示數值型字段無效,即數值類型的值不要加包圍符
lines terminated by – 指定行間分隔符,即定義每行的分隔符

使用命令查看文件 /tmp/student.txt 的內容:

[root@htlwk0001host ~]# cat /tmp/student.txt; 00000000000000000001,"liaowenxiong",18,\N,\N,"2021-09-25 10:40:51" 00000000000000000002,"liudehua",28,\N,\N,"2021-09-25 10:40:51" 00000000000000000003,"zhangxueyou",38,\N,\N,"2021-09-25 10:40:51"

查看輸出結果可以看到,數據類型沒有添加雙引號,字符串和日期類型的數據有加雙引號。

使用圖形化編輯器打開文件 student.txt:

如果把參數 optionally 去掉再導出數據:

mysql> select * from student into outfile '/tmp/student.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n'; Query OK, 3 rows affected (0.00 sec)

你可以看到如下的導出結果:

[root@htlwk0001host ~]# cat /tmp/student.txt "00000000000000000001","liaowenxiong","18",\N,\N,"2021-09-25 10:40:51" "00000000000000000002","liudehua","28",\N,\N,"2021-09-25 10:40:51" "00000000000000000003","zhangxueyou","38",\N,\N,"2021-09-25 10:40:51"

不加參數 optionally,那么所有的字段值都會加上雙引號。

自定義分隔符,將表數據導出到 csv 文件中

用以下命令把 student 表的數據導出到 /tmp/student.csv:

select * from student into outfile '/tmp/student.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';

使用命令查看文件 /tmp/student.csv 的內容:

[root@htlwk0001host ~]# cat /tmp/student.csv; 00000000000000000001,"liaowenxiong",18,\N,\N,"2021-09-25 10:40:51" 00000000000000000002,"liudehua",28,\N,\N,"2021-09-25 10:40:51" 00000000000000000003,"zhangxueyou",38,\N,\N,"2021-09-25 10:40:51"

我們再使用圖形化編輯器打開 csv 文件看下:

導出數據時,提示“拒絕訪問”

以 root(這是Linux系統的用戶)登錄 Linux 系統,再以 root(這是數據庫的用戶) 登錄數據庫,再將數據庫 test 中的表 student 導出到目錄 /root/test 下的文件 student.txt 中

導出結果:

mysql> select * from student into outfile '/root/test/student.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n'; ERROR 1 (HY000): Can't create/write to file '/root/test/student.txt' (Errcode: 13 - Permission denied)

把目錄 /root/test 的權限改成 777,再以導出到目錄 /root/test 下的文件 student.txt 中

導出結果:

mysql> select * from student into outfile '/root/test/student.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n'; Query OK, 3 rows affected (0.00 sec)

居然導出成功了。

把 /root/test 目錄的權限該 744

切換成 mysql(這是Linux系統的用戶)登錄 Linux 系統,將 /root/test 的擁有者和所屬用戶組改成 mysql,并且把權限改成 755,再以 root(這是數據庫的用戶) 登錄數據庫,再將數據庫 test 中的表 student 導出到目錄 /root/test 下的文件 student.txt 中。

[root@htlwk0001host ~]# chown -R mysql:mysql /root/test # 將/root/test的擁有者和所屬用戶組改成mysql [root@htlwk0001host ~]# ls -l /root 總用量 1284288 ... drwxrwxrwx 3 mysql mysql 272 929 11:02 test ... [root@htlwk0001host ~]# chmod 755 /root/test # 將/root/test的權限改成所有者7,所屬用戶組5,其它用戶5 [root@htlwk0001host ~]# ls -l /root 總用量 1284288 ... drwxr-xr-x 3 mysql mysql 272 929 11:02 test ...

導出結果:

mysql> select * from student into outfile '/root/test/student.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n'; Query OK, 3 rows affected (0.00 sec)

居然可以成功導出數據。

總結

確保 Linux 用戶 mysql 對導出的目標目錄擁有寫入和執行兩種權限

1.以 mysql 身份登錄 Linux 系統,不論目標目錄的擁有者是不是用戶 mysql,只要用戶 mysql 對輸出的目標目錄有寫入和執行的權限,就可以將數據庫的數據導出到目標目錄下的文件中。
2.以 root 身份登錄 Linux 系統,不論 root 對目標目標有沒有寫入和執行的權限,只要目標目錄的 other 的權限沒有寫入和執行,則無法將數據庫的數據導出到目標目錄下的文件中。

以上兩點證明了一件事,登錄 MySQL 數據庫使用 SELECT INTO OUTFILE 語句導出數據庫的數據,在往硬盤寫入數據時,使用的是 mysql 用戶身份來執行底層的寫入數據的命令,所以只要確保 Linux 用戶 mysql 對目標目錄有寫入和執行兩種權限就可以正常導出數據了。

而這個 mysql 用戶是在安裝數據庫時自動創建的一個 Linux 操作系統的用戶,默認沒有 shell 登錄權限,需要在文件 /etc/passwd 或者使用命令 usermod 改成允許登錄。

將數據導出到 /tmp 目錄下

mysql 用戶默認擁有 /tmp 目錄的寫入和執行的權限,所以只要把數據導出在該目錄下即可。

在導出數據時不指定目標文件的絕對路徑

在寫入的時候不指定絕對路徑,這樣文件默認會寫入 /etc/my.cnf 中參數 datadir 所指定的目錄下。默認目錄為 /var/lib/mysql。然后移動寫入的文件到指定目錄下即可。

看下文件 /etc/my.cnf 中的參數 datadir 的值:

mysql> select @@datadir; +-----------------+ | @@datadir | +-----------------+ | /var/lib/mysql/ | +-----------------+ 1 row in set (0.00 sec)

總結

以上是生活随笔為你收集整理的Linux系统下MySQL的导出数据语句SELECT … INTO OUTFILE的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。