Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MYSQL replay dumpfile tất cả hoặc không có gì trong một giao dịch

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm kiếm nhiều số trong trường nhiều số

  2. MySQL:Nhận các mục mới nhất cũ hơn xxx, Hiệu suất

  3. Chèn biến MySQL bằng Python, không hoạt động

  4. Làm cách nào để lấy tất cả các kết hợp dữ liệu từ một bảng MySQL?

  5. MySQL ADD COLUMN