Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MYSQL replay dumpfile wszystko albo nic w transakcji

Uwaga:poniższe są testowane tylko z grubsza, może być więcej rzeczy do rozważenia podczas zrzucania, w zależności od bazy danych.

Jest to możliwe tylko w określonych okolicznościach.

Pierwszym niepowodzeniem jest powiązanie transakcji z sesją. Ponieważ łączysz się ponownie, aby wydać rollback , rollback nie ma sensu, ponieważ nie ma transakcji do wycofania. To było podczas drugiej sesji.

Drugi błąd polega na tym, że zwykle mysqldump ma kilka instrukcji, które rzucają niejawne commit i tym samym zakończyć transakcję. Obejmuje to wszystkie instrukcje DDL (język definicji danych, w tym drop , alter , create i tak dalej) oraz (un)lock tables .
Więc, aby wykonać plik zrzutu w jednej transakcji, zrzut powinien zostać utworzony mniej więcej tak:

mysqldump -uuser -ppw database --no-create-info --skip-add-locks --skip-disable-keys --skip-triggers >dumpfiles

--no-create-info pozwala mysqldump pominąć wszystkie drop table ...; create table ...; oświadczenia.

--skip-add-locks pozwala mysqldump pominąć wszystkie lock table ...; unlock table ...; oświadczenia.

--skip-disable-keys pozwala mysqldump pominąć wszystkie alter table ... disable keys; alter table ...enable keys; sprawozdania.

--skip-triggers pozwala mysqldump pominąć wszystkie create trigger ...; oświadczenia.

Istnieje również --single-transaction opcja, ale ta opcja byłaby stosowana tylko do pojedynczych stołów.

Trzecim (możliwym) niepowodzeniem jest to, że transakcja może zostać całkowicie wycofana tylko wtedy, gdy wszystkie zaangażowane tabele są zdolne do przeprowadzania transakcji, takich jak InnoDB lub BDB. Jeśli masz tam np. tabele MyISAM, insert oświadczenia nie zostaną wycofane.

Następujące błędy nie powiedzie się, ponieważ source polecenie nie jest dozwolone w procedurze składowanej, jest raczej częścią klienta mysql.

Jeśli wszystko, co zostało brane pod uwagę, możesz to zrobić w ten sposób:

Najpierw utwórz taką procedurę:

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 ;

Następnie wykonaj to w swoim skrypcie w następujący sposób:

mysql -uuser -ppw -hhost databasename -e "CALL sp_exec_dump()"

Lub oczywiście sparametryzujesz procedurę nazwą pliku zrzutu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:relacja wiele do wielu z wieloma warunkami AND

  2. zmień auto_increment w tej samej tabeli za pomocą podzapytania mysql

  3. dlaczego to zapytanie MySQL generuje nieprawidłowe numery wierszy?

  4. Błąd CodeIgniter - nie można połączyć się z bazą danych przy użyciu dostarczonych ustawień

  5. Jak zainstalować WordPress:oprogramowanie serwerowe