Как я могу отслеживать ход импорта большого файла .sql?

Я импортирую 7 GB foobar.sql для восстановления таблицы в локальной базе данных.

$ mysql -h localhost -u root 'my_data' <foobar.sql

$ mysql --version
/usr /local /mysql /bin /mysql Ver 14.12. Распространение 5.0.96 для apple-darwin9.8.0 (i386) с использованием readline 5.1

Как я могу отслеживать его прогресс?

162 голоса | спросил qazwsx 2 Maypm12 2012, 20:54:41

9 ответов


211

Если вы просто импортируете файл дампа из CLI на * nix, например.

mysql -uxxx -pxxx dbname </sqlfile.sql

затем сначала установите просмотрщик труб на вашей ОС, затем попробуйте что-то вроде этого:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

, который покажет индикатор выполнения в ходе выполнения программы.

Это очень полезно, и вы также можете использовать его для получения оценки для прогресса mysqldump.

pv выгружает sqlfile.sql и передает их в mysql (из-за оператора pipe). Пока он демпинг, он показывает прогресс. Самое приятное в том, что mysql берет данные только так быстро, как может продвинуться, поэтому pv может показать ход импорта. У меня нет доказательств. Но это так. Я предполагаю, что есть некоторый буфер, но в какой-то момент я думаю, что mysql больше не читает данные, когда он все еще занят обработкой.

 Скриншот скриншота Pipe Viewer

ответил Rob 14 32012vEurope/Moscow11bEurope/MoscowWed, 14 Nov 2012 09:37:54 +0400 2012, 09:37:54
21

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

SELECT table_schema "Имя базы данных", сумма (data_length + index_length) /1024/1024 "Размер базы данных в MB"
FROM information_schema.TABLES GROUP BY table_schema;

Кредит: http://forums.mysql.com/read.php?108,201578, 201578

ответил Josh Grinberg 12 22013vEurope/Moscow11bEurope/MoscowTue, 12 Nov 2013 14:13:34 +0400 2013, 14:13:34
16

Когда вы выполняете mysqldump одной базы данных, все таблицы сбрасываются в алфавитном порядке.

Естественно, что перезагрузка mysqldump в базу данных также будет в алфавитном порядке.

Вы можете просто сделать SHOW PROCESSLIST; и узнайте, что соединение с DB работает с mysqldump. Когда дамп перезагружается, соединение с БД будет исчезать.

Если вы хотите узнать, какие таблицы находятся в файле dumpfile, запустите это для foobar.sql

cat foobar.sql | grep "^ CREATE TABLE" | awk '{print $ 3}'

ОБНОВЛЕНИЕ 2012-05-02 13:53 EDT

Извините, что не заметил, что существует только одна таблица.

Если таблица MyISAM, единственный способ отслеживания - с точки зрения ОС. Причина? Таблица перезаписывается во время перезагрузки. Что ты ищешь? Размер файлов .MYD и .MYI. Конечно, вам нужно сравнить это с тем, какой размер таблицы был ранее на другом сервере БД, из которого вы импортировали.

Если таблица InnoDB и < strong> innodb_file_per_table , единственный способ мониторинга - с точки зрения ОС. Причина? Таблица перезаписывается во время перезагрузки. Что ты ищешь? Размер файла .ibd. Конечно, вам нужно сравнить это с тем, какой размер таблицы был ранее на другом сервере БД, из которого вы импортировали.

Если таблица InnoDB и у вас отключена функция innodb_file_per_table , даже точка зрения ОС не может помочь.

ОБНОВЛЕНИЕ 2012-05-02 13:56 EDT

Я обратился к чему-то вроде этого в прошлом году: Как получить% progress для« type db.sql | mysql »

ОБНОВЛЕНИЕ 2012-05-02 14:09 EDT

Так как стандартный mysqldump записывает блокировку таблицы следующим образом:

LOCK TABLES `a` WRITE;
/*! 40000 ALTER TABLE `a` DISABLE KEYS * /;
ВСТАВИТЬ В ЦЕННОСТИ (123), (451), (199), (0), (23);
/*! 40000 ALTER TABLE `a` ENABLE KEYS * /;
РАЗБЛОКИРОВАТЬ ТАБЛИЦЫ;

, тогда невозможно получить прогресс с помощью mysql до тех пор, пока блокировка таблицы не будет выпущена.

Если вы можете получить LOCK TABLES и UNLOCK TABLES закомментированный из файла дампа ...

  • , если таблица MyISAM, SELECT COUNT (*) будет работать
  • , если таблица InnoDB, SELECT COUNT (*), вероятно, замедлит /остановит нагрузку, пока счет не будет выполнен.
ответил RolandoMySQLDBA 2 Maypm12 2012, 21:10:48
4

В качестве решения для тех, кто не может заставить pv работать или для кого pv лжет. Вы можете контролировать размер файла ibdata1 в /var /lib /mysql, который содержит данные. Это приведет к тому же размеру (или около того) файлов в исходном сервере.

Если есть много таблиц, вы также можете смотреть их поочередно в /var /lib /mysql /<имя базы данных>.

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

Я думаю, что очень маловероятно, что наступит день, когда база данных не будет использовать какой-либо файл. Тем временем вы можете отслеживать файл, чтобы узнать, как продвигается передача. Метод, который я предложил, был тем, что вы могли бы сделать в той или иной форме с момента написания первой базы данных sql. Я никогда не собирался предполагать, что это была какая-то «официальная» техника, которую мог бы вернуть ручной жокей. Он предполагает общий уровень владения компьютерами в целом и unix в частности.

ответил nerak99 18 ThuEurope/Moscow2014-12-18T18:34:43+03:00Europe/Moscow12bEurope/MoscowThu, 18 Dec 2014 18:34:43 +0300 2014, 18:34:43
2

Если вы просто хотите проверить, если он застопорен, вы можете запросить

show processlist;

и посмотреть, что выполняется.

ответил SCL 16 WedEurope/Moscow2015-12-16T20:12:24+03:00Europe/Moscow12bEurope/MoscowWed, 16 Dec 2015 20:12:24 +0300 2015, 20:12:24
2

Каждые 2 секунды вы увидите запущенные процессы.

просмотр списка событий «echo»; | mysql -uuser -ppassword ';

Если вы хотите, чтобы он был менее частым, добавьте -n x, где x - количество секунд. 5 секунд:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword ';
ответил Marcelo Luiz Onhate 9 FriEurope/Moscow2016-12-09T14:20:05+03:00Europe/Moscow12bEurope/MoscowFri, 09 Dec 2016 14:20:05 +0300 2016, 14:20:05
1

Если ваша БД в остальном спокойна (т. е. нет активных пользователей), и вы хотите просто увидеть активность чтения /записи, почему бы просто не сделать что-то вроде:

mysqladmin -h <host> -uroot -p <yourpass> extended -r -i 10 | grep 'row'

Вы увидите число чтения /записи /вставки /ожиданий /обновлений.

Если вы вставляете, например, вы увидите что-то вроде:

Innodb_rows_inserted | 28958

Где 28958 - количество строк, вставленных для вашего интервала (10 секунд в моем случае).

ответил user113373 21 WedEurope/Moscow2016-12-21T13:25:15+03:00Europe/Moscow12bEurope/MoscowWed, 21 Dec 2016 13:25:15 +0300 2016, 13:25:15
1

Для тех, кто ищет пример просмотра канала, используя mysqldump, вы просто делаете что-то вроде этого:

mysqldump -hxxx -uxxx -p dbname | pv-W> dump.sql

Флаг -W просто сообщает pv ждать появления первого байта перед показом прогресса (после подсказки)

ответил Mauricio Trajano 12 Jpm1000000pmFri, 12 Jan 2018 23:06:35 +030018 2018, 23:06:35
-3

Я так удивлен, что никто не отправил «mysql -v» в качестве опции. Если он застрянет, выход остановится.

ответил dtc 3 FebruaryEurope/MoscowbWed, 03 Feb 2016 22:06:40 +0300000000pmWed, 03 Feb 2016 22:06:40 +030016 2016, 22:06:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132