Как подавить количество строк для таблиц, добавленных (AUTO_INCREMENT = N) в вывод mysqldump? - PullRequest
12 голосов
/ 03 февраля 2009

Я использую следующую команду для вывода схемы для базы данных MySQL:

mysqldump --no-data --skip-add-drop-table

Я сделаю это для двух баз данных, которые я хочу сравнить, и затем разошлю два выходных файла. Это мой грубый способ отслеживания изменений базы данных между средами.

Однако небольшое неудобство для меня заключается в том, что счетчик строк для каждой таблицы включен как часть определения таблицы в качестве значения AUTO_INCREMENT, например:

ENGINE=MyISAM AUTO_INCREMENT=844 DEFAULT CHARSET=latin1;

Я бы подумал, что флаг --no-data 'будет подавлять любую информацию о таблице, которая ссылается на данные, включая количество строк.

Как мне подавить AUTO_INCREMENT = N в этом выводе?

Ответы [ 4 ]

22 голосов
/ 03 февраля 2009

Проверьте это ticket по этой проблеме. Он был закрыт как "Не исправлю"

Вы можете сделать это, альтернативно:

mysqldump --no-data --skip-add-drop-table my_database | sed 's/AUTO_INCREMENT=[0-9]*\b//' > database.dump
1 голос
/ 08 мая 2012

После долгих исследований и настроек я обнаружил, что в Windows (с доступным Powershell) вы можете сделать ...

mysqldump -h SERVER -u USERNAME --password=PASSWORD -d DATABASE -C | powershell -Command "$input | ForEach-Object { $_ -replace \" AUTO_INCREMENT=\S+\", \"\" }"

Просто добавьте > output.txt в конец, чтобы сохранить его в файл, а не печатать его на экран.

1 голос
/ 03 февраля 2009
mysqldump --no-data --skip-add-drop-table | grep -v AUTO_INCREMENT

0 голосов
/ 29 ноября 2012

( Редактировать Конечно, принятый ответ правильный. Никто в здравом уме не делает столбец со значением по умолчанию "AUTO_INCREMENT = 123")

Борясь с тем же вопросом и читая предупреждение о ссылках на sed-решение, я дал вывод --xml из вихря, и я нашел рабочее решение без ошибок (например, кто-то создает колонку со значением по умолчанию "AUTO_INCREMENT = 123" - извлечено, я знаю, но все же ...):

mysqldump \
  --xml \
  --compact \
  --no-data \
  mydb |
xmlstarlet ed -d '
  //key/@Cardinality |
  //options/@Rows |
  //options/@Avg_row_length |
  //options/@Data_length |
  //options/@Auto_increment |
  //options/@Index_length
' |
xmllint --format -

По сути, он удаляет некоторые значения, используя xmlstarlet, который, как я видел, различался (даже из последовательных дампов одной и той же базы данных). Таблица стилей XSLT может выполнять ту же работу.

<?xml version="1.0"?>
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <database name="mydb">
    <table_structure name="SomeTable">
      <field Field="foo" Type="int(12)" Null="NO" Key="PRI" Extra="" Comment=""/>
      <field Field="bar" Type="int(11)" Null="NO" Key="PRI" Extra="" Comment=""/>
      <field Field="baz" Type="int(11)" Null="NO" Key="PRI" Extra="" Comment=""/>
      <key Table="AccessControlList" Non_unique="0" Key_name="PRIMARY"
           Seq_in_index="1" Column_name="referenceID" Collation="A" Null=""
           Index_type="BTREE" Comment="" Index_comment=""/>
    <options Name="SomeTable" Engine="InnoDB" Version="10" Row_format="Compact"
           Max_data_length="0" Data_free="0" Create_time="2012-09-11 15:31:11"
           Collation="utf8_general_ci" Create_options="" Comment=""/>
[...]

(для удобства чтения добавлены новые строки между атрибутами XML; их нет в выводе xmllint)

...