Lưu ý:Sau đây chỉ là thử nghiệm đại khái, có thể có nhiều điều cần xem xét khi kết xuất, tùy thuộc vào cơ sở dữ liệu của bạn.
Điều đó chỉ có thể xảy ra trong một số trường hợp nhất định.
Thất bại đầu tiên là một giao dịch bị ràng buộc với một phiên. Vì bạn kết nối lại để phát hành rollback
, rollback
không có giá trị sử dụng vì không có giao dịch nào để khôi phục. Đó là trong phiên họp khác.
Lỗi thứ hai là, một mysqldump thường có một số câu lệnh tạo ra một commit
ngầm hiểu và do đó kết thúc giao dịch. Điều này bao gồm tất cả các câu lệnh DDL (ngôn ngữ định nghĩa dữ liệu, điều này bao gồm drop
, alter
, create
v.v.) cũng như các bảng khóa (un)lock tables
.
Vì vậy, để thực hiện tệp kết xuất của bạn trong một giao dịch duy nhất, tệp kết xuất phải được tạo như sau:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
cho phép mysqldump bỏ qua tất cả bảng thả drop table ...; create table ...;
tuyên bố.
--skip-add-locks
cho phép mysqldump bỏ qua tất cả bảng khóa lock table ...; unlock table ...;
tuyên bố.
--skip-disable-keys
cho phép mysqldump bỏ qua tất cả alter table ... disable keys; alter table ...enable keys;
các câu lệnh.
--skip-triggers
cho phép mysqldump bỏ qua tất cả create trigger ...;
tuyên bố.
Ngoài ra còn có một --single-transaction
, nhưng tùy chọn này sẽ chỉ được áp dụng cho các bảng đơn lẻ.
Lỗi thứ ba (có thể xảy ra) là, một giao dịch chỉ có thể được khôi phục hoàn toàn, nếu tất cả các bảng liên quan đều có khả năng giao dịch, như InnoDB hoặc BDB. Nếu bạn có các bảng MyISAM trong đó, hãy insert
các câu lệnh sẽ không được khôi phục.
Việc sau không thành công, gây ra source
lệnh không được phép trong một thủ tục được lưu trữ, nó là một phần của ứng dụng khách mysql.
Nếu tất cả những điều đó đã được xem xét, bạn có thể làm như sau:
Đầu tiên, hãy tạo một thủ tục như sau:
DELIMITER $$
CREATE PROCEDURE sp_exec_dumpfile()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END ;
START TRANSACTION;
SOURCE '/path/to/dumpfile.sql';
COMMIT;
END $$
DELIMITER ;
Sau đó, thực thi nó như thế này trong tập lệnh của bạn:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Hoặc tất nhiên bạn tham số hóa thủ tục với tên tệp kết xuất.