SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.06.2011 10:42:49

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Как обновить базу из результата mysqldump?

Привет,

У меня есть две базы (одинаковой структуры) и данные из одной нужно регулярно (раз в месяц) переносить в другую.
Раньше я делал так: делал sql дамп через mysqldump и после заливал его через mysql -f.

Сейчас я понял, что таким образом не все новые данные заливаются. Правильно ли использовать этот способ?

Как тогда можно переносить данные из одной базы в другую?

Поиском ничего полезного не нашел...

Отредактированно ady (28.06.2011 10:43:16)

Неактивен

 

#2 28.06.2011 11:28:08

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Как обновить базу из результата mysqldump?

Способ правильный и полностью рабочий. Все дело в ключе -f. Нужно его убрать и добиться того, чтобы не было ошибок при восстановлении дампа. Лучше использовать --add-drop-table в mysqldump и заливать всю базу целиком. Или использовать DROP DATABASE перед восстановлением как в примере в этой статье: http://webew.ru/articles/1462.webew

Неактивен

 

#3 28.06.2011 12:07:56

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Re: Как обновить базу из результата mysqldump?

(1) А как не может быть ошибок при восстановлении дампа, если в дампе есть данные, которые уже есть в базе и, при вставлении которых будет возникать ошибка аля "Duplicate entry '-26761558' for key 'PRIMARY'"?

(2) >Лучше использовать --add-drop-table в mysqldump и заливать всю базу целиком.

Это не вариант. Удалять таблицу (или базу) в 500 Mb, чтобы вставить в нее 10 Мб данных - это как-то не правильно.

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

Технически проблема не очень понятна: почему нельзя вставить только то, что вставляется?

(3) В идеале бы хотелось бы вставлять только то, что добавилось после определенного момента времени (время последнего обновления) smile. Простых средств для этого, нужно думать, нет?

(4) Решил попробовать обновляться через XML формат (в загрузчике есть опция пропускать Duplicate entry)

Отредактированно ady (28.06.2011 12:42:23)

Неактивен

 

#4 28.06.2011 12:43:19

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Как обновить базу из результата mysqldump?

Я не понимаю, почему с ключом -f вставляется не все. Трудность в том, что этот ключ игнорит ошибки и не видно какая именно ошибка произошла кроме Duplicate key. Попробуй найти все-таки эту ошибку, из-за которой не все данные восстанавливаются.

Есть механизм задампить данные после заданной даты:

SELECT * FROM table WHERE time> X INTO OUTFILE ...

а потом
LOAD DATA LOCAL INFILE ...


Странно это, на копии хранить другой набор данных, чем на оригинале.

Неактивен

 

#5 28.06.2011 14:45:31

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Re: Как обновить базу из результата mysqldump?

rgbeast написал:

Есть механизм задампить данные после заданной даты:

SELECT * FROM table WHERE time> X INTO OUTFILE ...

а потом
LOAD DATA LOCAL INFILE ...

time - это автоматический столбец, время, когда данные в последний раз были внесены?

rgbeast написал:

Странно это, на копии хранить другой набор данных, чем на оригинале.

Это не совсем копия. Есть сборщик данных, который собирает новые данные (а некоторых старых данных у него нет).

rgbeast написал:

Я не понимаю, почему с ключом -f вставляется не все. Трудность в том, что этот ключ игнорит ошибки и не видно какая именно ошибка произошла кроме Duplicate key. Попробуй найти все-таки эту ошибку, из-за которой не все данные восстанавливаются.

Да, я тоже об этом думал, но на вскидку две схемы одинаковые.

Неактивен

 

#6 28.06.2011 15:00:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Как обновить базу из результата mysqldump?

Под time имею в виду столбец таблицы типа TIMESTAMP. По умолчанию он будет содержать в себе время последнего обновления строки, но можно сделать, чтобы реагировал только на создание.

CREATE TABLE a (
id int PRIMARY_KEY AUTO_INCREMENT,
b text,
time_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
);

Неактивен

 

#7 28.06.2011 15:16:22

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Re: Как обновить базу из результата mysqldump?

Через дамп в XML тоже не все так гладко. Оказывается LOAD XML INFILE - глюченная операция.

LOAD XML INFILE '28_06_11_bf_market.xml'
IGNORE
INTO TABLE BF_MARKET

пишет

Warning:   Column set to default value; NULL supplied to NOT NULL column 'MARKET_ID' at row 1
SQLState:  01000
ErrorCode: 1263Warning:   Column set to default value; NULL supplied to NOT NULL column 'EVENT_ID' at row 1
SQLState:  01000
 


Хотя вот данные:

<?xml version="1.0"?>
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="banalyse">
    <table_data name="BF_MARKET">
    <row>
        <field name="MARKET_ID">102014231</field>
        <field name="EVENT_ID">26651499</field>
        <field name="NAME">Match Odds</field>
        <field name="TYPE">O</field>
        <field name="DESCRIPTION" xsi:nil="true" />
        <field name="IS_INFO_SCANNED">0</field>
        <field name="EVENT_TYPE_ID" xsi:nil="true" />
    </row>
...
 


И в итоге не все данные вставляются.

Отредактированно ady (28.06.2011 15:17:44)

Неактивен

 

#8 28.06.2011 15:22:13

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Как обновить базу из результата mysqldump?

LOAD XML это новая фича 5.5, я ее никогда не использовал. Используй обычную LOAD DATA INFILE из CSV - по сравнению с XML это экономия и места на диске и процессора для парсинга.

Неактивен

 

#9 29.06.2011 17:59:26

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Re: Как обновить базу из результата mysqldump?

Через СSV - тоже оказалось проблема перенести данные. Выдаются "мудренные" warnings:


Warning:   Data truncated for column 'PRICE_ID' at row 1
SQLState:  01000
ErrorCode: 1265
Warning:   Row 1 doesn't contain data for all columns
SQLState:  01000
ErrorCode: 1261
Warning:   Row 1 doesn'
t contain data for all columns
SQLState:  01000
...
 

и в итоге данные не вставляются.

Пытался вставлять через

LOAD DATA LOCAL INFILE 'BF_PRICE.txt'
    IGNORE
    INTO TABLE BF_PRICE    
(      `PRICE_ID` ,
  `LINE_ID` ,
  `DATE_WHEN` ,
  `EVENT_ID` ,
  `MARKET_ID` ,
  `HANDI` ,
  `PRICE_GIVE` ,
  `PRICE_TAKE` ,
  `PRICE_GIVE_2` ,
  `PRICE_TAKE_2` ,
  `PRICE_GIVE_3` ,
  `PRICE_TAKE_3` ,
  `AMOUNT_GIVE_1` ,
  `AMOUNT_GIVE_2` ,
  `AMOUNT_GIVE_3` ,
  `AMOUNT_TAKE_1` ,
  `AMOUNT_TAKE_2` ,
  `AMOUNT_TAKE_3` ,
  `LAST_PRICE` ,
  `CURRENCY_CODE` )
 

Данные вполне культурные, аля

1,0,1305112470447,\N,102753174,0.00,10.00,12.00,9.40,15.50,8.40,19.50,88.75,27.10,112.99,120.31,166.60,86.92,12.00,\N
1,0,1305112472775,\N,102753174,0.00,10.00,12.00,9.40,15.50,8.40,19.50,88.75,27.10,112.99,120.31,166.60,86.92,12.00,\N
1,0,1305112475225,\N,102753173,0.00,2.44,3.25,2.42,3.30,2.38,3.40,551.93,161.16,119.38,305.64,121.67,14.82,\N,\N
1,0,1305112482273,\N,102753173,0.00,2.44,3.25,2.42,3.30,2.38,3.40,551.93,161.16,119.38,305.64,121.67,14.82,\N,\N
1,0,1305112548372,\N,102751941,0.00,13.50,14.00,13.00,14.50,12.50,15.00,13.66,68.44,19.13,527.46,189.90,22.22,14.00,\N

 

Неактивен

 

#10 30.06.2011 06:27:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Как обновить базу из результата mysqldump?

С 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

Неактивен

 

#11 01.07.2011 11:28:29

ady
Завсегдатай
Зарегистрирован: 02.04.2007
Сообщений: 38

Re: Как обновить базу из результата mysqldump?

rgbeast написал:

С LOAD DATA INFILE можно разобраться так, чтобы он работал.  Попробуй явно задать опции FIELDS  ENCLOSED BY '"' TERMINATED BY ',' LINES TERMINATED BY "\r\n" и заключить строки в кавычки (проще всего файл получить с помощью SELECT INTO OUTFILE с теми же опциями).

Разобрался, спасибо. Правда, еще пришлось повозиться с foreign key, как как опция REPLACE означает, что ряд сначала удаляется, а потом записывается заново (и соответственно после удаления выскакивает ошибка на foreign key).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson