2008-10-23 17 views
11

Tôi đang làm việc với một truy vấn MySQL ghi vào một outfile. Tôi chạy truy vấn này một lần mỗi ngày hoặc hai và vì vậy tôi muốn để có thể loại bỏ outfile mà không cần phải nghỉ mát để su hoặc sudo. Cách duy nhất tôi có thể nghĩ đến việc làm điều đó xảy ra là để có outfile được viết như thuộc sở hữu của một ai đó khác với người dùng mysql. Điều này có thể không?Làm cách nào để tôi có thể ghi các tệp outfiles của MySQL thành một người dùng khác?

Chỉnh sửa: Tôi không chuyển hướng đầu ra sang tệp, tôi đang sử dụng phần INTO OUTFILE của truy vấn chọn để xuất ra tệp.

Nếu nó giúp:

 
mysql --version 
mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (x86_64) using readline 5.2 

Trả lời

10

Tệp đầu ra được tạo bởi quá trình mysqld, không phải bởi quy trình khách hàng của bạn. Do đó tệp đầu ra phải được sở hữu bởi uid và gid của quá trình mysqld.

Bạn có thể tránh phải sudo truy cập tệp nếu bạn truy cập tệp từ quá trình dưới dạng uid hoặc gid có thể truy cập tệp. Nói cách khác, nếu mysqld tạo các tệp thuộc sở hữu của uid và gid "mysql"/"mysql", sau đó thêm tài khoản của riêng bạn vào nhóm "mysql". Sau đó, bạn sẽ có thể truy cập tệp, miễn là chế độ cho phép của tệp bao gồm quyền truy cập nhóm.

Edit:

Bạn đang xóa một tập tin trong/tmp, với một chế độ cho phép thư mục của rwxrwxrwt. Bit dính ('t') có nghĩa là bạn chỉ có thể xóa tệp nếu uid của bạn giống với chủ sở hữu của tệp, bất kể quyền trên tệp hoặc thư mục.

Nếu bạn lưu tệp đầu ra của mình vào thư mục khác không có bộ bit dính, bạn có thể xóa tệp bình thường.

đọc đoạn trích này từ trang người đàn ông cho dính (8):

thư mục STICKY

Một thư mục có 'dính 'bit được thiết lập trở thành một thư mục append-chỉ, hay chính xác hơn, một thư mục trong đó việc xóa các tệp bị hạn chế. Một tệp trong thư mục dính chỉ có thể bị người dùng loại bỏ hoặc đổi tên nếu người dùng có quyền ghi cho thư mục và người dùng là chủ sở hữu của tệp, chủ sở hữu của thư mục hoặc siêu người dùng. Tính năng này được áp dụng hữu ích cho các thư mục như/tmp phải được ghi công khai nhưng nên từ chối người dùng giấy phép để tự ý xóa hoặc đổi tên các tệp của nhau.

+1

Các tập tin được sở hữu tại "mysql"/"mysql" và modded 666. Tôi đã thêm ed bản thân mình vào nhóm mysql và tôi vẫn không thể xóa nó. –

+0

Các quyền sở hữu và quyền trên thư mục chứa tệp là gì? –

+0

Tôi nghĩ * những gì Bill đang nhận được là bạn phải có quyền ghi trên thư mục có chứa để có thể xóa một tập tin trong UNIX (b/c nó cập nhật danh sách dir). Vì vậy, "chgrp mysql" các thư mục và "chmod ug + rwX" nó để cung cấp cho người dùng nhóm mysql của bạn viết perms trên thư mục. – joelhardi

1

Nếu bạn có một người dùng khác chạy truy vấn từ cron, nó sẽ tạo ra các tập tin như người dùng đó.

5

Không sử dụng cú pháp "SELECT ... INTO OUTFILE", không.

Bạn cần chạy truy vấn (tức là ứng dụng khách) làm người dùng khác và chuyển hướng đầu ra. Ví dụ, chỉnh sửa crontab của bạn để chạy các lệnh sau đây bất cứ khi nào bạn muốn:

mysql db_schema -e 'SELECT col,... FROM table' > /tmp/outfile.txt 

Điều đó sẽ tạo /tmp/outfile.txt như người dùng nào đã crontab bạn đã thêm lệnh để.

+0

Lưu ý rằng đường ống sẽ mang lại kết quả khác khi so sánh với 'thành outfile'. Ví dụ đường ống bao gồm các tên cột như hàng đầu tiên, NULL thay vì \ N vv (trong Ubuntu. Chi tiết có thể khác nhau trong các hệ điều hành khác) –

1

Tôi chỉ làm

sudo gedit /etc/apparmor.d/usr.sbin.mysqld 

và thêm

/var/www/codeigniter/assets/download/* w, 

sudo service mysql restart 

Và đó là nó, tôi có thể làm dễ dàng SELECT INTO OUTFILE bất kỳ filename

Các vấn đề liên quan