Catatan:Berikut ini hanya diuji secara kasar, mungkin ada lebih banyak hal yang perlu dipertimbangkan saat membuang, tergantung pada database Anda.
Itu hanya mungkin dalam keadaan tertentu.
Kegagalan pertama adalah, bahwa transaksi terikat ke sesi. Karena Anda terhubung lagi untuk mengeluarkan rollback
, rollback
tidak ada gunanya karena tidak ada transaksi untuk dikembalikan. Itu di sesi lain.
Kegagalan kedua adalah, biasanya mysqldump memiliki beberapa pernyataan yang memberikan commit
implicit secara implisit dan karena itu mengakhiri transaksi. Ini mencakup semua pernyataan DDL (bahasa definisi data, ini termasuk drop
, alter
, create
dan seterusnya) serta (un)lock tables
.
Jadi, untuk mengeksekusi dumpfile Anda dalam satu transaksi, dump harus dibuat seperti ini:
mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles
--no-create-info
mari mysqldump lewati semua drop table ...; create table ...;
pernyataan.
--skip-add-locks
mari mysqldump lewati semua tabel kunci lock table ...; unlock table ...;
pernyataan.
--skip-disable-keys
mari mysqldump lewati semua alter table ... disable keys; alter table ...enable keys;
pernyataan.
--skip-triggers
mari mysqldump lewati semua create trigger ...;
pernyataan.
Ada juga --single-transaction
opsi, tetapi opsi ini hanya akan diterapkan ke tabel tunggal.
Kegagalan ketiga (kemungkinan) adalah, bahwa transaksi hanya dapat dibatalkan sepenuhnya, jika semua tabel yang terlibat mampu melakukan transaksi, seperti InnoDB atau BDB. Jika Anda memiliki tabel MyISAM di sana, insert
pernyataan tidak akan dibatalkan.
Berikut ini gagal, menyebabkan source
perintah tidak diperbolehkan dalam prosedur tersimpan, melainkan bagian dari klien mysql.
Jika semua sudah dipertimbangkan, Anda bisa melakukannya seperti ini:
Pertama buat prosedur seperti ini:
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 ;
Kemudian jalankan seperti ini di skrip Anda:
mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"
Atau tentu saja Anda membuat parameter prosedur dengan nama dumpfile.