[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Частичный рестор таблицы из бекапа
FatCat
Кто нибудь встречал такой софт?
Чтобы перезаписывал строки таблицы, которые есть в файле бекапа, не дропая таблицу и тем самым сохраняя те строки, которые были добавлены после создания бекапа.
Или оно никому никогда такое не надо?



Спустя 45 минут, 4 секунды (27.05.2009 - 19:16) jetistyum написал(а):
бэкап это просто sql файлик, так же ...
ты можешь развернуть бэкап - базу (таблицу) паралельно с существующей, и потом запросом переписать старые записи из одной базы в другую

Спустя 3 часа, 25 минут, 55 секунд (27.05.2009 - 22:42) FatCat написал(а):
Таблица сообщений в форуме - это сотни тысяч строк.
Теперь представь, сбой сервера, и у меня побилась эта таблица, причем побилось начало таблицы: сегодняшние записи не побиты. И у меня есть вчерашний бекап.
Да, конечно, можно развернуть вчерашний бекап, получить список айдишников (сотни тысяч), затем из сегодняшней таблицы выбрать записи по критерию NOT IN(список айдишников)...
Только в реальных условиях это занимает час времени на одну таблицу. Час рабочего времени. А у нас в БД форума 84 таблицы...

Вот я и думаю над чем:
Сипекс-дампер или любой другой бекапер/ресторер дропают и затем INSERT...
А если не дропать, а перед каждым инсертом проверять: есть ли строка с таким айдишником. Если есть - UPDATE, если нет - INSERT. Быстро ведь будет работать, может вдвое медленней чем дроп с инсертами...

Спустя 43 минуты, 57 секунд (27.05.2009 - 23:26) kirik написал(а):
Если целых строк меньше чем битых, то имеет смысл восстановить старый дамп, и потом дописать новые строки, а если наоборот, то такая операция в любом случае займет какое-то время.

Цитата (FatCat @ 27.05.2009 - 14:42)
А если не дропать, а перед каждым инсертом проверять: есть ли строка с таким айдишником. Если есть - UPDATE, если нет - INSERT. Быстро ведь будет работать, может вдвое медленней чем дроп с инсертами...

Пожалуй это единственный возможный вариант smile.gif Только можно не проверять на наличие, а вставлять через REPLACE, тогда если такой строки не будет - она вставится, если будет - заменится.

Спустя 2 минуты, 16 секунд (27.05.2009 - 23:28) jetistyum написал(а):
Генерю базу, буду пробовать.

Спустя 2 минуты, 49 секунд (27.05.2009 - 23:31) jetistyum написал(а):
kirik +1
я тоже имел в виду REPLACE
ща нагенерю пару тыщщьь .. посмотрим

Спустя 40 минут, 17 секунд (28.05.2009 - 00:11) jetistyum написал(а):
итак, была создана таблица на 4 поля..
1. - id
3 текстовых
было нагенерено 100 000 записей
таблица получилась размером 37 мегабайт
таблица была скопирована в другую..
из первой удалены записи по 10000<id<30000 тоесть фактически удалили в таблице 20 000 строк
затем в первую таблицу добавили еще почти 300 000 записей и сделал
SQL
REPLACE INTO `big_working_table` SELECT *
FROM `not_full_backup`


результаты
Код

Query OK, 177160 rows affected (52.26 sec)
Records: 98580  Duplicates: 78580  Warnings: 0

длительность - минута... на нотике...

Спустя 31 минута, 45 секунд (28.05.2009 - 00:43) FatCat написал(а):
Цитата (kirik @ 27.05.2009 - 23:26)
вставлять через REPLACE

Опа! Не знал...
Тогда вообще всё просто должно быть. Беру сипекс-дампер и добавляю строку
PHP
$sql str_replace("INSERT INTO ""REPLACE INTO "$sql);



Цитата (jetistyum @ 28.05.2009 - 00:11)
таблица получилась размером 37 мегабайт

Приходилось видеть таблицы и по несколько гигабайт.
Чем хорош сипекс - он "рубит" дамп на куски в пределах заданной величины, и выполняет поэтапно.
Для денвера экспериментально установил, что максимальное быстродействие будет при размере кусков 6Мб; для нашего хостинга то же составляет 10 Мб.
Боюсь, что твоим методом паругиговую таблицу просто не обработает: подвесишь сервер.

Спустя 57 минут, 13 секунд (28.05.2009 - 01:40) jetistyum написал(а):
Цитата (FatCat @ 28.05.2009 - 00:43)
Приходилось видеть таблицы и по несколько гигабайт.

я не хвастаюсь smile.gif Это просто для оценки, чтобы не расписывать длинну данных каждого поля.
кстати конечная таблица (рабочая) имеет 397779 записей и весит 236 + мб.

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

а когда одна таблица весит несколько гигабайт, может тут уже либо
а) неправильная архитектура бд
б) просто огромное кол-во данных и пора переходить на кластер

попробовал сейчас сделать полную копию таблицы
SQL
create table `big_working_table_copy` select * from `big_working_table`

потом
SQL
REPLACE INTO `big_working_table` SELECT *
FROM `big_working_table_copy `;


фактически по всем этим 236 мб. и 400 000 записей
итог
Код
Query OK, 795558 rows affected (1 min 42.60 sec)
Records: 397779  Duplicates: 397779  Warnings: 0


все махинации делал из консоли... чтобы не париться с возможными ttl-ями php

Спустя 1 минута (28.05.2009 - 01:41) jetistyum написал(а):
могу скинуть sql файлик дампа своей таблички (текстовые данные должны сжаться хорошо) .. и ты просто для сравнения сделаешь через скрипт то же самое.

Спустя 10 минут, 40 секунд (28.05.2009 - 01:52) FatCat написал(а):
Цитата (jetistyum @ 28.05.2009 - 01:41)
могу скинуть sql файлик дампа своей таблички

Не, спасибо, мне проще взять реальную таблицу одного из реальных форумов.
Есть и опыт размножения строк таблицы посредством SELECT * INTO OUTFILE => LOAD DATA INFILE
Жаль на сервере это не удается сделать: у sql права доступа не соответствуют правам пользователя, и создавать файлы не может...

Спустя 18 минут, 35 секунд (28.05.2009 - 02:11) jetistyum написал(а):
скрипт этот через 15 минут показал только маленькую долю из "выполнено" ... при дампе.. отменил.. посмотрим что при ресторе будет


_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.