2008-12-01 31 views
7

Điều này khiến tôi trở nên điên khùng: Tôi đã tạo một bảng phân vùng trên một máy chủ, di chuyển kết xuất SQL đến máy chủ khác và cố gắng chạy chèn. Nó thất bại, nhưng tôi đang gặp khó khăn trong việc tìm ra lý do tại sao. Google và các diễn đàn và tài liệu của MySQL không có nhiều trợ giúp.Vấn đề quyền của MySQL - không phải là vấn đề

Truy vấn không trông như thế này (cắt ngắn cho ngắn gọn và rõ ràng, tên thay đổi để bảo vệ sự vô tội):

CREATE TABLE `my_precious_table` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`somedata` varchar(20) NOT NULL, 
`aTimeStamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
PRIMARY KEY (`id`,`aTimeStamp`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 DATA DIRECTORY='/opt/data/data2/data_foo/' INDEX DIRECTORY='/opt/data/data2/idx_foo/' 
/*!50100 PARTITION BY RANGE (year(aTimeStamp)) SUBPARTITION BY HASH (TO_DAYS(aTimeStamp)) 
(PARTITION p0 VALUES LESS THAN (2007) (SUBPARTITION foo0 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM), 
PARTITION p1 VALUES LESS THAN (2008) (SUBPARTITION foo1 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM), 
PARTITION p2 VALUES LESS THAN (2009) (SUBPARTITION foo2 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM), 
PARTITION p3 VALUES LESS THAN MAXVALUE (SUBPARTITION foo3 DATA DIRECTORY = '/opt/data/data2/data_foo' INDEX DIRECTORY = '/opt/data/data2/idx_foo' ENGINE = MyISAM)) */; 

Lỗi này là:

LỖI 1 (HY000): Can' t tạo/ghi vào tập tin '/opt/data/data2/idx_foo/my_precious_table#P#p0#SP#foo0.MYI' (Errcode: 13)

"không thể tạo/ghi vào tập tin" nhìn như vấn đề quyền với tôi, nhưng quyền trên các thư mục được nhắm mục tiêu như vậy:

drwxrwxrwx 2 mysql mysql 4096 Dec 1 16:24 data_foo 
drwxrwxrwx 2 mysql mysql 4096 Dec 1 16:25 idx_foo 

Đối với đá, tôi đã thử chowning vào thư mục gốc: root và bản thân mình. Điều này không khắc phục được sự cố.

Máy chủ nguồn MySQL là phiên bản 5.1.22-rc-log. Máy chủ đích là 5.1.29-rc-cộng đồng. Cả hai đều đang chạy trên các cài đặt CentOS gần đây.

Chỉnh sửa: Một nghiên cứu nhỏ hơn cho thấy rằng Errcode 13, trên thực tế, là lỗi quyền. Nhưng làm thế nào tôi có thể nhận được điều đó trên rwxrwxrwx?

Chỉnh sửa: Đề xuất tuyệt vời của Bill Karwin đã không phát hành. Tôi đang làm việc như người dùng root, và có tất cả các cờ đặc quyền được thiết lập.

Chỉnh sửa: Tạo bảng KHÔNG chỉ định thư mục dữ liệu cho các phân vùng riêng lẻ - nhưng tôi cần đặt những phân vùng này trên đĩa lớn hơn ổ đĩa mặc định. Và tôi không thể chỉ định DATA/INDEX DIRECTORY ở cấp độ bảng - đó không phải là hợp pháp trong phiên bản MySQL mà tôi đang sử dụng (5.1.29-rc-community).

Chỉnh sửa: Cuối cùng, câu trả lời là nhờ danh sách gửi thư của MySQL và nhân viên CNTT nội bộ. Xem bên dưới.

+1

Bạn có chắc chắn đường dẫn chính xác không? –

+0

Có. Tôi đã kiểm tra điều này nhiều lần. – bradheintz

Trả lời

2

Hóa ra đó là một vấn đề SElinux - tất cả các quyền hệ thống tệp của tôi đều ổn, nhưng có một chính sách cấp cao hơn được thiết lập để MySQL truy cập phân vùng đĩa đó.

Bài học: Khi bạn có vấn đề về quyền nhưng quyền sở hữu và quyền hệ thống tệp rõ ràng là chính xác, hãy xem SElinux.

+1

Tôi nhanh chóng đến với ý kiến ​​rằng điều đầu tiên ta nên làm trên bất kỳ hệ thống Linux nào là 'setenforce 0'. –

3

http://bugs.mysql.com/bug.php?id=19557

Bạn cũng sẽ nhận được một thông báo lỗi của ID người dùng MySQL chạy truy vấn không có "DATA FILE" đặc quyền cho phép các ID người dùng để viết thư cho hệ thống tập tin.

Nói cách khác, nó có thể là vấn đề về quyền đối với đặc quyền SQL, chứ không phải quyền của tệp hệ điều hành.

+0

Cảm ơn. Tôi đang chạy như là người chủ, và một kiểm tra nhanh chóng của bảng USER cho thấy rằng tôi có tất cả các đặc quyền (bao gồm cả File_priv) thiết lập đúng. Ngoài ra, đặc quyền FILE (không có tên gọi là DATA FILE) cho phép bạn sử dụng LOAD DATA INFILE và SELECT ... INTO OUTFILE statements - vấn đề riêng biệt từ việc tạo bảng. – bradheintz

+0

Từ tài liệu 5.1: http://dev.mysql.com/doc/refman/5.1/en/privileges-provided.html – bradheintz

+0

Okey dokey, bạn nên loại trừ khả năng đó. Nhưng tôi không chắc chắn những gì khác để đề nghị. –

4

On Ubuntu nhìn vào thiết lập AppArmor cho mysql

vi /etc/apparmor.d/usr.sbin.mysql 

này nên giải quyết vấn đề cho phép. Để kiểm tra nhanh, bạn thậm chí có thể thử

/etc/init.d/apparmor stop 

Nhưng đừng quên khởi động lại dịch vụ.

Điều này đã cho tôi một chút thời gian để tìm hiểu. Và sau khi đọc "SELinux", rõ ràng là tôi đã quên loại bảo vệ mới này trên Ubuntu.

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