Próbuję stworzyć prostą strukturę, tylko zrzut mojej bazy danych. Użycie mysqldump
daje mi wynik taki jak:
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
DROP TABLE IF EXISTS `foo`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
Bez względu na to, co próbuję, po prostu nie mogę pozbyć się tych komentarzy.
Obecnie używam: mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql
Edycja: chcę jednak zachować inne komentarze, takie jak-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
Odpowiedzi:
WHOA! To nie są tak naprawdę komentarze, mimo że tak wyglądają. Są to tokeny wykonania warunkowego.
Wybierz tę linię:
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
Jeśli wersja MySQL to 4.00.14 lub nowsza , serwer MySQL uruchomi tę instrukcję.
Ta magiczna składnia komentarzy jest udokumentowana w sekcji Składnia komentarzy podręcznika.
Prawdopodobnie nie chcesz się tego pozbyć.
źródło
Wiem, że to starożytne pytanie, ale oto przynajmniej odpowiedź. Nie mogłem również znaleźć flagi w mysqldump, aby usunąć komentarze warunkowe, ani nawet lepszej opcji ustawienia minimalnej wersji mysql, aby te komentarze się pojawiały. Jeśli chcesz po prostu zniszczyć je wszystkie, możesz to zrobić za pomocą grep lub sed (sed pozostawia puste linie, grep nie):
Aby odpowiedzieć na moje życzenie warunkowego usuwania komentarzy zależnych od wersji mysql, użyj jednego z nich (usuwa wszelkie komentarze do czegokolwiek <mysql5):
źródło
mysqldump ... | grep -v '^-- Dump completed on .*$'
DROP DATABASE IF EXISTS
ORIGNORING YOUR CURRENT SESSION VARIABLES
. Chyba że wiesz, co robisz: nie usuwaj ich, SZCZEGÓLNIE PODCZAS MIGRACJI MIĘDZY ŚRODOWISKAMI / HOSTAMI. ponieważ wynikowy wynik może nie być zgodny z oczekiwaniami z wielu powodów. Zostały tam umieszczone dla twojej ochrony. ale jeśli nie chcesz zapinać pasów, to twój wybór.--skip-dump-date
Spróbuj
--skip-comments
?Dzięki
Edytować:
Rozumiem… Spróbuj tego
--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset
Pobaw się, aby usunąć niektóre opcje, aż uzyskasz pożądany rezultat, w zasadzie jest to to samo, co
--compact
bez--skip-comments
--skip-comments
usuwa komentarze dotyczące wersji i innych elementów.źródło
SET NAMES
wezwanie, które--skip-set-charset
, jak sugeruje ta odpowiedź, usuwa; dzieje się to tylko raz na początku pliku zrzutu i może mieć istotny wpływ na przywrócenie danych. Lubię--skip-add-locks --skip-disable-keys
dla mojego przypadku użycia. Ale niektóre warunkowe komentarze, takie jak/*!40101 SET character_set_client = @saved_cs_client */;
i/*!40101 SET character_set_client = utf8 */
... przydatne, czy nie?character_set_client
nie można ustawić w 5.6 z powodu błędu lub czegoś podobnego, więc kiedy mysqldumping na przykładutf8mb4
dane, otrzymujesz te warunkowe komentarze tam, gdzie ich nie chcesz.Czy próbowałeś opcji skrótu
--compact
?Informacje tutaj .
źródło
-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
.Technicznie rzecz biorąc, linie, których próbujesz się pozbyć, nie są komentarzami. Tymczasowo modyfikują niektóre zmienne na początku, a na końcu resetują je do poprzedniej wartości.
Nie są one zbyt przydatne (ale są też nieszkodliwe) w twoim przypadku, ponieważ używasz --no-data, ale pomyślałem, że warto wspomnieć, że linie służą celowi, a nie są tylko komentarzami.
źródło
To nie są komentarze, wykonanie tej części skryptów zależy od wersji twojego mysql.
Możesz usunąć „część komentarza”, na przykład
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */
do
SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0
czyniąc skrypt bardziej „wygodnym” do czytania.
Jeśli spróbujesz uruchomić „wygodny” skrypt w wersji nowszej niż określona w „komentarzu”, pojawi się błąd.
źródło
Bardzo ważne jest, aby zachować komentarze dotyczące wykonania warunkowego. Ale jeśli absolutnie wiesz, że wersja MySQL, która załaduje zrzut jest większa lub równa tej, która go tworzy, możesz usunąć część "komentarza" w ten sposób:
sed -r s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g
Konwertuje linie, takie jak
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
do
SET SQL_MODE=@OLD_SQL_MODE ;
Ponieważ ta linia musi działać na każdym MySQL> = 4.1.1
Zauważ, że nie usunie to wielowierszowych komentarzy dotyczących warunkowego wykonywania, na przykład podczas zrzucania wyzwalacza.
Ponieważ nie można przewidzieć przyszłości, lepiej jest przechowywać zrzut z komentarzami i usuwać je tylko wtedy, gdy chcesz go zwizualizować.
mysqldump ... > dump.sql cat dump.sql | sed -E s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g > dump.no-comments.sql
źródło
Prawdopodobnie uruchomienie na nim wyrażenia regularnego w celu usunięcia wierszy zawierających 40014 lub 40111 itd.
źródło
Ponieważ używasz systemu Windows, jeśli nikt nie znajdzie lepszego rozwiązania, możesz zamiast tego użyć skryptu Python:
Użycie z wiersza poleceń:
Usuwa wszystkie takie linie:
/*!....... */;
źródło
Jeśli natknąłeś się na tę odpowiedź, próbując dołączyć swój plik structure.sql do git / github, możesz usunąć auto-inkrementację za pomocą następującego kodu zaraz po rake db: structure: dump
# Remove beginning auto increments to prevent merge conflicts filename = 'db/structure.sql' File.atomic_write(filename) do |output| File.open(filename, 'rb').each do |input| output.write(input.gsub(/\s+AUTO_INCREMENT=\d+\s+/, ' ')) end end
źródło
Zrobiłem ten skrypt, aby znormalizować zrzut, w tym usunąć komentarze warunkowe: https://github.com/luissquall/dbdump .
Ty po prostu musisz:
npm install -g @luissquall/dbdump # Redirect output to a file dbdump -u user -p -d database > struct.sql
źródło
Posługiwać się
--dump-date=FALSE
Robi dokładnie to, o co prosi OP. (nie do końca, widzę)
Źródło: podsumowanie opcji mysqldump
Edycja: Zaraz po minucie zdałem sobie sprawę, że to jest to , czego szukałem, a nie OP, ale wychodząc tutaj ... w nadziei, że ktoś może go użyć: Ta linia daty, która rujnuje kontrolę źródła, ponieważ zawsze to zmiana ...
źródło
Nie wiem, czy tego właśnie szukasz, po prostu chciałem pozbyć się wszystkich rzeczy związanych z komentarzami mysql, aby móc korzystać z podświetlacza składni. Użyłem prostego wyrażenia regularnego i zastąpiłem wszystko następującym „/ \ *! [ 0-9] {5} | \ * / "i voila! ładne kolory w kodzie;)
źródło
Jak zauważyła @Ollie i kilka innych, są to tokeny warunkowego wykonania napisane w stylu komentarza, ale służyły celowi. Bez nich możesz napotkać problemy z odtwarzaniem tabel z silnie wymuszonym ograniczeniem klucza obcego. Na przykład tabela A ma FK dla tabeli B i dlatego tabela A nie może zostać utworzona, dopóki nie zrobi tego tabela B i tak dalej. Bez wyłączenia kluczowych kontroli możesz nigdy nie być w stanie ich odtworzyć, w zależności od tego, jaka jest kara za zamówienie stolika.
źródło