GRANT tối thiểu cần thiết bởi mysqldump để kết xuất một lược đồ đầy đủ? (Thiếu TRIGGERs !!)


79

Tôi có một người dùng MySQL được gọi là kết xuất với các quyền sau:

GRANT USAGE ON *.* TO 'dump'@'%' IDENTIFIED BY ...
GRANT SELECT, LOCK TABLES ON `mysql`.* TO 'dump'@'%'
GRANT SELECT, LOCK TABLES ON `myschema`.* TO 'dump'@'%'

Tôi muốn kết xuất tất cả dữ liệu (bao gồm các trình kích hoạt và thủ tục) bằng cách sử dụng người dùng kết xuất . Tôi gọi mysqldump theo cách sau:

mysqldump -u dump -p --routines --triggers --quote-names --opt \
    --add-drop-database --databases myschema > myschema.sql

Mọi thứ đều ổn với tệp kết xuất ngoại trừ các trình kích hoạt, chúng bị thiếu !!

Các trình kích hoạt được kết xuất đúng cách nếu tôi thử mysqldump với người dùng MySQL gốc :

mysqldump -u root -p --routines --triggers --quote-names --opt \
    --add-drop-database --databases myschema > myschema.sql

Vì vậy, tôi đoán đó là một vấn đề perms ... người dùng MySQL kết xuất của tôi cần những khoản trợ cấp nào để thực hiện kết xuất đầy đủ một cách chính xác?

Câu trả lời:


111

Giả sử bằng kết xuất đầy đủ bạn cũng có nghĩa là VIEWs và EVENTs, bạn sẽ cần:

GRANT USAGE ON *.* TO 'dump'@'%' IDENTIFIED BY ...;
GRANT SELECT, LOCK TABLES ON `mysql`.* TO 'dump'@'%';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON `myschema`.* TO 'dump'@'%';

và nếu bạn có VIEWs thực thi một hàm, thì tiếc là bạn cũng cần EXECUTE.

Vấn đề của riêng tôi là: tại sao tôi cần SELECTnếu tôi chỉ muốn thực hiện kết xuất không có dữ liệu?


2
Đối với 5.5 trở lên, bạn thực sự không cần đặc quyền TRIGGER để kết xuất mã kích hoạt.
bluecollarcoder

1
Tôi đang sử dụng 5.5 và cần đặc quyền TRIGGER để kết xuất mã kích hoạt.
heuri

Trong trường hợp của tôi dường như tôi cũng cần phải LOCK TABLEStrên cơ sở dữ liệu tôi đang cố gắng để đổ chính nó ... sử dụng5.5.49-MariaDB
0xC0000022L

1
Về @ bình luận 0xC0000022L của, khóa bảng hay không là tùy chọn cho mysqldump, tùy thuộc vào các thông số mysqldump của bạn (thông số có liên quan --opt, --lock-tables, --lock-all-tables, --single-transactionvà tương ứng --skip-*biến.
Mô-men xoắn

8

Tôi đã tìm thấy GRANT bổ sung mà tôi cần !!

  GRANT TRIGGER ON `myschema`.* TO 'dump'@'%'

Tại đây bạn có tài liệu tham khảo chính thức: http://dev.mysql.com/doc/refman/5.5/en/privileges-provided.html#priv_trigger

Đặc quyền TRIGGER cho phép các hoạt động kích hoạt. Bạn phải có đặc quyền này cho một bảng để tạo, xóa hoặc thực thi các trình kích hoạt cho bảng đó.


3
Tên thực sự là TRIGGER, không gây nên
thenickdude

Mặc dù đây có thể là câu trả lời cho vấn đề của tác giả, nhưng nó không trả lời câu hỏi: "các yêu cầu GRANT tối thiểu để thực hiện một bãi chứa đầy đủ là gì". Đối với một: EVENT và SHOW VIEW bị thiếu.
Jannes

Đối với 5.5 trở lên, bạn thực sự không cần TRIGGERđặc quyền để kết xuất mã kích hoạt.
bluecollarcoder

5
Tôi sử dụng 5.5 và tôi thực sự cần nó
Emilio Nicolás

1

Tôi thấy rằng đôi khi nếu người dùng VIEW DEFINER không tồn tại, kết xuất không thành công.

Thay đổi nó, như được mô tả ở đó


Không chắc chắn tại sao điều này bị bỏ phiếu, đã giải quyết được vấn đề của tôi. Tôi đã chỉ định định nghĩa person thay vì person@localhost. Cảm ơn!
stianlik,

1

Ngoài Jannes câu trả lời, khi sử dụng mysqldump với --tab tùy chọn (tạo ra một tập tin văn bản bằng tab riêng cho mỗi bảng đổ), người sử dụng MySQL của bạn phải được cấp các FILEđặc quyền cũng như:

GRANT FILE ON *.* TO 'dump'@'%';

Tham khảo tài liệu chính thức: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_tab

Được đề cập trong phần này:

Tùy chọn này chỉ nên được sử dụng khi mysqldump được chạy trên cùng một máy với máy chủ mysqld. Vì máy chủ tạo tệp * .txt trong thư mục mà bạn chỉ định, thư mục đó phải được máy chủ ghi và tài khoản MySQL mà bạn sử dụng phải có đặc quyền FILE. Vì mysqldump tạo * .sql trong cùng một thư mục nên nó phải được tài khoản đăng nhập hệ thống của bạn ghi được.

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.