windows - Single commit ved import af meget store SQL-filer (MySQL)

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at gendanne store SQL-filer (> 2,5 Gb) til en MySQL-database på Windows.


Jeg kan ikke redigere disse filer for at tilføje tekst som SET autocommit=0; i begyndelsen af ​​filen (hvilket er nødvendigt for at forbedre importtiden).


Jeg kan heller ikke bruge source, da disse udgange til skærmen (hvilket er meget langsomt) og udførelsen fortsætter, selv om der er fejl i filen.


mysql> CREATE DATABASE IF NOT EXISTS dbname;
mysql> USE dbname;
mysql> SET autocommit=0;
mysql> source file.sql;
mysql> COMMIT;


Er det muligt at køre vilkårlig kommandoer før og efter import af en SQL-fil, der kun gælder for den aktuelle session? Jeg har prøvet begge følgende, og hverken arbejder på Windows (i begge tilfælde ignoreres den anden operation):


mysql -u username -p -e "SET autocommit=0;" dbname < file.sql


eller,


mysql -u username -p < initial\_commands.sql < file.sql


Hvis det er muligt, ønsker jeg ikke at ændre den globale autocommit indstilling hver gang jeg gør det, og så skal jeg huske at ændre det igen (også jeg er ikke sikker på at dette vil fungere uden den endelige COMMIT;]]).


Måske er der en måde at bruge BEGIN ... COMMIT; i stedet for at slukke autocommit?


Jeg er glad for noget forslag fra folk, der skal gøre denne slags ting!

Bedste reference


(echo set autocommit=0; & &type type file.sql &&echo. & echo commit;) | mysql -u brugernavn -p passwd


Brug kun rør i stedet for input omdirigering, brug ekko til kommandoerne og ekko. til nye linjer

Andre referencer 1


Mit svar er sent, men det kan hjælpe nogen.


Jeg har haft det samme problem. Når du læser MySQL-dokumenter (https://dev.mysql.com/doc/refman/5.5/en/mysql-command-options.html), har jeg fundet ud af, at du kan bruge --init-command parameteren. [20]]]


Så din kommandolinje er simpelthen: (-v for verbose og er optionnal)


mysql **--init-command**="SET autocommit=0;" -v < **sql\_file**.sql

Andre referencer 2


Dit mål kan være kontraproduktivt. Det vil sige, at hele belastningen til en enkelt transaktion kan bliver langsommere end at begrænse sig gradvist.


set autocommit=0 betyder, at alle indlæg (og andre skriver) hermed frem (indtil commit) skal logges for potentielle ROLLBACK. I starten kan den almindelige logningsmekanisme en masse skrivninger. Men på et tidspunkt begynder en mere kompleks mekanisme. Dette indebærer meget mere disk I/O, som er den langsomste del af en database.


Et alternativ er at skære en væsentlig del af 'commit' -processen - fsync til at skylle den engagerede transaktion. innodb\_flush\_log\_at\_trx\_commit kontrollerer sådan. Standard er sandsynligvis =1 for 'secure'. Mange mennesker kører med =2, hvilket er mindre sikkert, men begrænser fsyncs til en gang om et sekund. Den 'usikre' del er, at hvis du har et strømsvigt, kan transaktioner, der kører i det sidste sekund, have været anerkendt til klienten, idet du faktisk har vedholdet disken.


Da denne indstilling sandsynligvis skal udføres, før du tilslutter, skal du overveje et enkelt, 3-line, .bat script (fil):


mysql -e 'SET GLOBAL innodb\_flush\_log\_at\_trx\_commit = 2'
mysql dbname < file.sql
mysql -e 'SET GLOBAL innodb\_flush\_log\_at\_trx\_commit = 1'