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

Czy mysqldump niezawodnie obsługuje dane binarne?

Nie, nie zawsze jest to niezawodne, gdy masz binarne obiekty blob. W takim przypadku MUSISZ użyć „--hex-blob ", aby uzyskać prawidłowe wyniki.

Zastrzeżenie od komentarza poniżej:

Mam przypadek, w którym te wywołania kończą się niepowodzeniem (importowanie na innym serwerze, ale oba z systemem Centos6/MariaDB 10):

mysqldump --single-transaction --routines --databases myalarm -uroot -p"PASSWORD" | gzip > /FILENAME.sql.gz
gunzip < FILENAME.sql.gz | mysql -p"PASSWORD" -uroot --comments

Tworzy plik, którego importowanie po cichu nie jest możliwe. Dodanie „--skip-extended-insert” daje mi plik, który jest znacznie łatwiejszy do debugowania i uważam, że ten wiersz jest generowany, ale nie można go odczytać (ale nie jest zgłaszany żaden błąd ani podczas eksportowania, ani importowania):

INSERT INTO `panels` VALUES (1003,1,257126,141,6562,1,88891,'??\\\?ŖeV???,NULL);

Zwróć uwagę, że w oryginale brakuje końcowego cytatu w danych binarnych.

select hex(packet_key) from panels where id=1003;
--> DE77CF5C075CE002C596176556AAF9ED

Kolumna to dane binarne:

CREATE TABLE `panels` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `enabled` tinyint(1) NOT NULL DEFAULT '1',
  `serial_number` int(10) unsigned NOT NULL,
  `panel_types_id` int(11) NOT NULL,
  `all_panels_id` int(11) NOT NULL,
  `installers_id` int(11) DEFAULT NULL,
  `users_id` int(11) DEFAULT NULL,
  `packet_key` binary(16) NOT NULL,
  `user_deleted` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  ...

Więc nie, nie tylko niekoniecznie możesz zaufać mysqldump, ale nie możesz nawet polegać na nim, aby zgłosić błąd, gdy się pojawi.

Brzydkim obejściem, którego użyłem, było mysqldump wykluczenie dwóch dotkniętych tabel przez dodanie takich opcji do zrzutu:

--ignore-table=myalarm.panels 

Potem ten hack skryptu BASH. Zasadniczo uruchom SELECT, który generuje wartości INSERT, w których obsługiwane są kolumny NULL, a kolumna binarna zostaje przekształcona w wywołanie UNHEX(), jak na przykład:

(123,45678,UNHEX("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),"2014-03-17 00:00:00",NULL),

Wklej go do wybranego edytora, aby się nim bawić, jeśli zajdzie taka potrzeba.

echo "SET UNIQUE_CHECKS=0;SET FOREIGN_KEY_CHECKS=0;DELETE FROM panels;INSERT INTO panels VALUES " > all.sql
mysql -uroot -p"PASSWORD" databasename -e "SELECT CONCAT('(',id,',', enabled,',', serial_number,',', panel_types_id,',', all_panels_id,',', IFNULL(CONVERT(installers_id,CHAR(20)),'NULL'),',', IFNULL(CONVERT(users_id,CHAR(20)),'NULL'), ',UNHEX(\"',HEX(packet_key),'\"),', IF(ISNULL(user_deleted),'NULL',CONCAT('\"', user_deleted,'\"')),'),') FROM panels" >> all.sql
echo "SET UNIQUE_CHECKS=1;SET FOREIGN_KEY_CHECKS=1;" > all.sql

To daje mi plik o nazwie „all.sql”, który wymaga końcowego przecinka we INSERT zamienionego na średnik, a następnie można go uruchomić jak powyżej. Potrzebowałem ulepszeń „dużego bufora importu” ustawionych zarówno w interaktywnej powłoce mysql, jak i w wierszu poleceń, aby przetworzyć ten plik, ponieważ jest on duży.

mysql ... --max_allowed_packet=1GB

Kiedy zgłosiłem błąd, w końcu zostałem skierowany na flagę „--hex-blob”, która działa tak samo, jak moje obejście, ale z mojej strony jest trywialna. Dodaj tę opcję, plamy zostaną zrzucone jako szesnastkowe, koniec.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wielopoziomowe menu z PHP/MySQL

  2. Wstawianie wartości $zmiennej lub $_POST do tabeli mysql

  3. Jak mogę wyszukiwać za pomocą emoji w MySQL za pomocą utf8mb4?

  4. Maksymalna długość kolumny JSON w MySQL

  5. Pobierz typ zmiennej w MySQL