Задавайте вопросы, мы ответим
Вы не зашли.
Привет,
У меня есть две базы (одинаковой структуры) и данные из одной нужно регулярно (раз в месяц) переносить в другую.
Раньше я делал так: делал sql дамп через mysqldump и после заливал его через mysql -f.
Сейчас я понял, что таким образом не все новые данные заливаются. Правильно ли использовать этот способ?
Как тогда можно переносить данные из одной базы в другую?
Поиском ничего полезного не нашел...
Отредактированно ady (28.06.2011 10:43:16)
Неактивен
Способ правильный и полностью рабочий. Все дело в ключе -f. Нужно его убрать и добиться того, чтобы не было ошибок при восстановлении дампа. Лучше использовать --add-drop-table в mysqldump и заливать всю базу целиком. Или использовать DROP DATABASE перед восстановлением как в примере в этой статье: http://webew.ru/articles/1462.webew
Неактивен
(1) А как не может быть ошибок при восстановлении дампа, если в дампе есть данные, которые уже есть в базе и, при вставлении которых будет возникать ошибка аля "Duplicate entry '-26761558' for key 'PRIMARY'"?
(2) >Лучше использовать --add-drop-table в mysqldump и заливать всю базу целиком.
Это не вариант. Удалять таблицу (или базу) в 500 Mb, чтобы вставить в нее 10 Мб данных - это как-то не правильно.
Но самое главное в том, что в той базе, которую нужно обновить, есть данные, которых нет в той базе, которую нужно накатить.
Технически проблема не очень понятна: почему нельзя вставить только то, что вставляется?
(3) В идеале бы хотелось бы вставлять только то, что добавилось после определенного момента времени (время последнего обновления) . Простых средств для этого, нужно думать, нет?
(4) Решил попробовать обновляться через XML формат (в загрузчике есть опция пропускать Duplicate entry)
Отредактированно ady (28.06.2011 12:42:23)
Неактивен
Я не понимаю, почему с ключом -f вставляется не все. Трудность в том, что этот ключ игнорит ошибки и не видно какая именно ошибка произошла кроме Duplicate key. Попробуй найти все-таки эту ошибку, из-за которой не все данные восстанавливаются.
Есть механизм задампить данные после заданной даты:
Неактивен
rgbeast написал:
Есть механизм задампить данные после заданной даты:
SELECT * FROM table WHERE time> X INTO OUTFILE ...
а потомLOAD DATA LOCAL INFILE ...
time - это автоматический столбец, время, когда данные в последний раз были внесены?
rgbeast написал:
Странно это, на копии хранить другой набор данных, чем на оригинале.
Это не совсем копия. Есть сборщик данных, который собирает новые данные (а некоторых старых данных у него нет).
rgbeast написал:
Я не понимаю, почему с ключом -f вставляется не все. Трудность в том, что этот ключ игнорит ошибки и не видно какая именно ошибка произошла кроме Duplicate key. Попробуй найти все-таки эту ошибку, из-за которой не все данные восстанавливаются.
Да, я тоже об этом думал, но на вскидку две схемы одинаковые.
Неактивен
Под time имею в виду столбец таблицы типа TIMESTAMP. По умолчанию он будет содержать в себе время последнего обновления строки, но можно сделать, чтобы реагировал только на создание.
Неактивен
Через дамп в XML тоже не все так гладко. Оказывается LOAD XML INFILE - глюченная операция.
Отредактированно ady (28.06.2011 15:17:44)
Неактивен
LOAD XML это новая фича 5.5, я ее никогда не использовал. Используй обычную LOAD DATA INFILE из CSV - по сравнению с XML это экономия и места на диске и процессора для парсинга.
Неактивен
Через СSV - тоже оказалось проблема перенести данные. Выдаются "мудренные" warnings:
Неактивен
С LOAD DATA INFILE можно разобраться так, чтобы он работал. Попробуй явно задать опции FIELDS ENCLOSED BY '"' TERMINATED BY ',' LINES TERMINATED BY "\r\n" и заключить строки в кавычки (проще всего файл получить с помощью SELECT INTO OUTFILE с теми же опциями).
Кстати, у mysqldump есть опция --where, чтобы дампить не все
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
Неактивен
rgbeast написал:
С LOAD DATA INFILE можно разобраться так, чтобы он работал. Попробуй явно задать опции FIELDS ENCLOSED BY '"' TERMINATED BY ',' LINES TERMINATED BY "\r\n" и заключить строки в кавычки (проще всего файл получить с помощью SELECT INTO OUTFILE с теми же опциями).
Разобрался, спасибо. Правда, еще пришлось повозиться с foreign key, как как опция REPLACE означает, что ряд сначала удаляется, а потом записывается заново (и соответственно после удаления выскакивает ошибка на foreign key).
Неактивен