Trong phần thứ hai và phần cuối cùng của các phương pháp hay nhất mysqldump, chúng tôi sẽ nói về cách xử lý việc di chuyển và nhập cho các đối tượng và chế độ xem chương trình được lưu trữ từ cơ sở dữ liệu MySQL của bạn. Để đọc thêm về các điều kiện tiên quyết cho hoạt động kết xuất và khôi phục thành công cho cơ sở dữ liệu MySQL lớn, hãy xem phần đầu tiên của loạt bài blog gồm 2 phần này.
Nhập các thủ tục, hàm và trình kích hoạt đã lưu trữ của bạn
Theo mặc định, mysqldump nhập các lượt xem và trình kích hoạt. Tuy nhiên nó không nhập các thủ tục, chức năng và sự kiện. Để nhập các thủ tục và chức năng, --routines
nên chỉ định tùy chọn và để nhập sự kiện, --events
tùy chọn nên được chỉ định.
1. Nhập trình kích hoạt
Mysqldump sẽ cố gắng loại bỏ tất cả các trình kích hoạt trong cơ sở dữ liệu của bạn theo mặc định. Để có thể kết xuất triggers
của bảng , bạn phải có TRIGGER
đặc quyền cho bảng. Nếu người dùng kết xuất không có đặc quyền này, các trình kích hoạt sẽ bị bỏ qua và mysqldump sẽ không gây ra bất kỳ lỗi nào. Vì vậy, đừng ngạc nhiên nếu bạn không thấy bất kỳ trình kích hoạt nào được nhập vào cơ sở dữ liệu đích của bạn.
2. Nhập sự kiện
Để nhập sự kiện, bạn cần chỉ định --events
trong khi gọi tiện ích mysqldump. Tùy chọn này yêu cầu EVENT
đặc quyền cho các cơ sở dữ liệu đó. Một lần nữa, mysqldump sẽ âm thầm bỏ qua các sự kiện nếu người dùng kết xuất không có các đặc quyền này, ngay cả khi bạn đã chỉ định tùy chọn –event khi gọi mysqldump.
3. Nhập các hàm và thủ tục được lưu trữ
Để nhập quy trình, bạn cần chỉ định --routines
trong khi gọi tiện ích mysqldump. Tùy chọn này yêu cầu global select
đặc quyền. Ngay cả trong trường hợp này, mysqldump sẽ âm thầm bỏ qua các chức năng và thủ tục nếu người dùng kết xuất không có các đặc quyền này, ngay cả khi bạn đã chỉ định --routines
tùy chọn khi gọi mysqldump.
3.1 Nhập các hàm không xác định
Một chương trình được lưu trữ để sửa đổi dữ liệu được gọi là không xác định nếu nó không tạo ra kết quả có thể lặp lại. Ví dụ hàm rand (). Đặc biệt khó khăn khi sử dụng các chức năng như vậy trong các thiết lập sao chép, vì chúng có thể dẫn đến dữ liệu khác nhau trên nguồn và bản sao. Để kiểm soát những khả năng đó, MySQL áp đặt một số hạn chế nhất định đối với việc tạo hàm nếu nhật ký nhị phân được bật.
Theo mặc định, cho CREATE FUNCTION
tuyên bố được chấp nhận, ít nhất một trong số DETERMINISTIC
, NO SQL
hoặc READS SQL DATA
phải được chỉ định rõ ràng. Nếu không sẽ xảy ra lỗi:
ERROR 1418 (HY000) tại dòng 181:Hàm này không có DỮ LIỆU SQL DETERMINISTIC, KHÔNG SQL hoặc READS trong khai báo và ghi nhật ký nhị phân được bật (bạn * có thể * muốn sử dụng log_bin_trust_funable kém an toàn hơn)
Vì vậy, nếu hàm của bạn không được khai báo là xác định trên nguồn và ghi nhật ký nhị phân được bật trên đích của bạn, bạn sẽ thấy lỗi trên trong quá trình khôi phục kết xuất. Do đó, điều quan trọng là phải hiểu trước bản chất xác định của các chức năng của bạn. Nếu bạn chắc chắn rằng các chức năng của mình là xác định, bạn cần bật log_bin_trust_function_creators
cấu hình tại điểm đến của bạn trước khi khôi phục hoạt động. Khi được bật, MySQL cho phép tạo các hàm như vậy ngay cả khi bật ghi nhật ký nhị phân.
4. Đặc tính BẢO MẬT của SQL của các quy trình và chế độ xem được lưu trữ.
MySQL cho phép SQL SECURITY
ngữ cảnh được chỉ định trong khi tạo các chương trình hoặc chế độ xem cửa hàng. SQL SECURITY
đặc tính có thể được chỉ định là DEFINER
hoặc INVOKER
. Nếu SQL_SECURITY
ngữ cảnh là DEFINER
, quy trình thực thi bằng cách sử dụng các đặc quyền của tài khoản có tên trong quy trình DEFINER
mệnh đề. Nếu ngữ cảnh là INVOKER
, quy trình thực thi bằng cách sử dụng các đặc quyền của người dùng gọi nó. Giá trị mặc định là DEFINER
.
Nếu bạn đang khôi phục các quy trình hoặc chế độ xem đã lưu trữ, bạn cần đảm bảo tài khoản người dùng xác định tồn tại trên cơ sở dữ liệu đích của bạn với các khoản trợ cấp thích hợp. Nếu không, bạn sẽ gặp lỗi trong quá trình khôi phục.
Hãy chứng minh điều này bằng một ví dụ liên quan đến chế độ xem.
Giả sử bạn có Chế độ xem V1 và V2 được định nghĩa như sau:
CREATE definer =admin @ '%' XEM mydb.V1 AS SELECT * FROM solution_table; CREATE definer =admin @ '%' XEM mydb.V2 AS SELECT * FROM V1 trong đó num1 =10;
Lưu ý rằng các chế độ xem được kết xuất theo mặc định bởi mysqldump và nếu bạn không có 'quản trị viên' của người dùng trên đích của mình, bạn sẽ gặp phải lỗi dưới đây trong quá trình khôi phục:
Lệnh không thành công với lỗi - ERROR 1449 (HY000) tại dòng 206 trong tệp:'/mysql_data/mysqldump/sqldump_1582457155758.sql':Người dùng được chỉ định làm trình xác định ('admin' @ '%') không tồn tại.
Lưu ý rằng không chỉ đủ để đảm bảo người dùng tồn tại mà người dùng cần có các đặc quyền thích hợp để thực thi các chế độ xem. Ví dụ:nếu người dùng admin@'%'
tồn tại trên đích, nhưng không có SELECT
trên cơ sở dữ liệu mydb, bạn sẽ thấy thông báo lỗi:
'/mysql_data/mysqldump/sqldump_1582456858033.sql':View' mydb.V2 'tham chiếu đến (các) bảng hoặc (các) cột hoặc (các) hàm không hợp lệ hoặc bộ định nghĩa / người gọi của chế độ xem thiếu quyền sử dụng chúng.
|
Tóm tắt
Trong loạt bài blog gồm 2 phần này, chúng tôi đã đề cập đến các điều kiện tiên quyết quan trọng mà bạn cần xử lý để đảm bảo di chuyển thành công dữ liệu và các chương trình được lưu trữ của bạn. Lưu trữ MySQL ScaleGrid xử lý các nguyên tắc này để cung cấp trải nghiệm mượt mà trong khi nhập dữ liệu của bạn vào nền tảng ScaleGrid. Vui lòng chia sẻ với chúng tôi kinh nghiệm của bạn và các phương pháp hay nhất mà bạn áp dụng để di chuyển dữ liệu MySQL!