Không thể xuất dữ liệu MySQL sang tệp


13

Tôi đang cố gắng xuất dữ liệu từ bảng MySQL sang tệp nhưng gặp lỗi về quyền:

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

Nếu thư mục trong câu hỏi được chỉnh sửa thành 777, thì tại sao người dùng MySQL không thể ghi tệp? Thật thú vị, tôi không thể viết thư cho / tmp /.

EDIT: Có vẻ như người dùng DB có quyền MySQL phù hợp:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)

2
Bạn phải cấp quyền truy cập cho MySQL trên toàn bộ cây thư mục. Cấp quyền trên inlà vô nghĩa nếu MySQL không thể truy cập dotanchoen. Nói cách khác, hộp kho an toàn trong kho tiền ngân hàng có thể được mở rộng, nhưng nếu cửa kho tiền ngân hàng bị khóa, bạn sẽ không vào được hộp. Người gsdùng của bạn cũng phải có FILEđặc quyền mysql để thực hiện truy vấn đó.

Vấn đề là bạn có thể không có perms chọn? Quyền Mysql không được kiểm soát bởi quyền thư mục. Bạn cần sử dụng mysql -u <tên người dùng> -p để chạy như một người dùng mysql cụ thể. Để cung cấp cho người dùng quyền truy cập vào db, hãy xem cấp MySql. dev.mysql.com/doc/refman/5.1/en/grant.html

Cảm ơn bạn, người dùng này không có SELECTquyền. Tôi thường duyệt cơ sở dữ liệu như người dùng này.
dotancohen

Cảm ơn, Marc, đó là những gì tôi sợ. Vì vậy, tôi không thể có thư mục "hộp thư đến" mà người dùng khác có thể ghi vào mà không để họ đọc / ghi vào thư mục chính của tôi?
dotancohen

2
Đảm bảo rằng người dùng có FILEđặc quyền như được mô tả bởi các tài liệu MySQL .
Mike Purcell

Câu trả lời:


12

Theo Tài liệu MySQL về CHỌN ... VÀO RA NGOÀI

Bất kỳ tệp nào được tạo bởi INTO OUTFILE hoặc INTO DUMPFILE đều có thể ghi được bởi tất cả người dùng trên máy chủ lưu trữ. Lý do cho điều này là máy chủ MySQL không thể tạo một tệp thuộc sở hữu của bất kỳ ai khác ngoài người dùng có tài khoản mà nó đang chạy. (Bạn không bao giờ nên chạy mysqld với quyền root vì lý do này và các lý do khác.) Do đó, tệp phải có thể ghi trên thế giới để bạn có thể thao tác với nội dung của nó.

Bạn nên xuất ra SELECT INTO OUTFILE/ var / lib / mysql như sau

SELECT * FROM data INTO OUTFILE 'data.csv';

Tất nhiên, bạn cần đảm bảo rằng bạn có quyền FILE trên gs @ localhost.

Có hai cách để có sự cho phép này

PHƯƠNG PHÁP # 1

GRANT FILE ON *.* TO 'gs'@'localhost';

PHƯƠNG PHÁP # 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

CẬP NHẬT 2012-05-01 07:09 EDT

Để cung cấp cho mình đặc quyền FILE, hãy làm như sau:

  • BƯỚC 01) service mysql restart --skip-networking --skip-grant-tables
  • BƯỚC 02) mysql <hit enter>
  • BƯỚC 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • BƯỚC 04) exit
  • BƯỚC 05) service mysql restart

Cảm ơn. Tôi cập nhật câu hỏi với đầu ra của SHOW GRANTS. Có vẻ như người dùng DB nên có quyền thích hợp.
dotancohen

Người dùng DB không có quyền thích hợp. Đặc quyền FILE chỉ được trao cho người dùng GRANT ALL PRIVILEGES ON *.*, giống như RELOADSHUTDOWN. Điều này là như vậy bởi vì đó là những đặc quyền hành chính toàn cầu. Đặc GRANT ALLquyền bạn có chỉ dành cho gscơ sở dữ liệu.
RolandoMySQLDBA

1

Các bản phân phối và hệ điều hành khác nhau không phải tất cả đều xử lý các đích cho OUTFILE giống nhau.

Ví dụ, khi chạy trình nền mysqld trên Linux, sử dụng ổ cắm, đôi khi OUTFILE được ghi vào /tmpthư mục. Không phải là một vấn đề lớn, nó chỉ sử dụng phương pháp OUTFILE có những thiếu sót, cụ thể là xử lý các quyền và tìm nơi tệp đi.

Vì mục đích của câu hỏi này không cụ thể là "Cách sử dụng OUTFILE", nhưng bạn chỉ muốn thu thập một số dữ liệu MySQL vào một tệp, đây là một giải pháp thay thế không yêu cầu bạn phải xoay vòng với quyền FILE, v.v. .

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

Đầu ra của cái này được phân định bằng tab theo mặc định. Đối với dấu phẩy, chỉ cần đưa nó qua sedhoặc một cái gì đó trước khi ghi nó vào tệp.


1

Tôi đã dành hàng giờ cố gắng để hiểu các đề xuất trên trang này và nhiều trang khác của StackOverflow.

Bất kể tôi đã thay đổi quyền như thế nào trong MySql, tôi không thể làm gì được.

Tôi trở lại các quyền mà tôi đã bắt đầu với.

Cuối cùng, những gì làm việc cho tôi đơn giản hơn những gợi ý của người khác:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv


1
Phương pháp của bạn là tốt để sử dụng khi trên Bash CLI. Tuy nhiên, câu hỏi trong OP hỏi về cách xuất dữ liệu ra tệp từ CLI máy khách MySQL.
dotancohen

0

Về hai phương pháp xuất dữ liệu sang CSV (thực sự là TSV) đã đề cập ở trên, tôi đã thấy rằng nếu có các giá trị trống trong các mục mà bạn đang xuất, có nguy cơ dữ liệu có thể bị rối do phân bổ sai dữ liệu cho các cột tương ứng.

Với mối quan tâm về tính toàn vẹn dữ liệu để phục hồi, tôi tìm thấy trang web này:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-USE-mysql-clents/

Nó đã đề cập rằng --xmltùy chọn mysqldumpcho phép xuất dữ liệu sang định dạng XML, sau đó có thể được phân tích cú pháp bởi một tập lệnh tùy chỉnh sang bất kỳ định dạng nào cần thiết, bao gồm TSV.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.