Чтобы перезаписывал строки таблицы, которые есть в файле бекапа, не дропая таблицу и тем самым сохраняя те строки, которые были добавлены после создания бекапа.
Или оно никому никогда такое не надо?
Спустя 45 минут, 4 секунды (27.05.2009 - 19:16) jetistyum написал(а):
бэкап это просто sql файлик, так же ...
ты можешь развернуть бэкап - базу (таблицу) паралельно с существующей, и потом запросом переписать старые записи из одной базы в другую
ты можешь развернуть бэкап - базу (таблицу) паралельно с существующей, и потом запросом переписать старые записи из одной базы в другую
Спустя 3 часа, 25 минут, 55 секунд (27.05.2009 - 22:42) FatCat написал(а):
Таблица сообщений в форуме - это сотни тысяч строк.
Теперь представь, сбой сервера, и у меня побилась эта таблица, причем побилось начало таблицы: сегодняшние записи не побиты. И у меня есть вчерашний бекап.
Да, конечно, можно развернуть вчерашний бекап, получить список айдишников (сотни тысяч), затем из сегодняшней таблицы выбрать записи по критерию NOT IN(список айдишников)...
Только в реальных условиях это занимает час времени на одну таблицу. Час рабочего времени. А у нас в БД форума 84 таблицы...
Вот я и думаю над чем:
Сипекс-дампер или любой другой бекапер/ресторер дропают и затем INSERT...
А если не дропать, а перед каждым инсертом проверять: есть ли строка с таким айдишником. Если есть - UPDATE, если нет - INSERT. Быстро ведь будет работать, может вдвое медленней чем дроп с инсертами...
Теперь представь, сбой сервера, и у меня побилась эта таблица, причем побилось начало таблицы: сегодняшние записи не побиты. И у меня есть вчерашний бекап.
Да, конечно, можно развернуть вчерашний бекап, получить список айдишников (сотни тысяч), затем из сегодняшней таблицы выбрать записи по критерию NOT IN(список айдишников)...
Только в реальных условиях это занимает час времени на одну таблицу. Час рабочего времени. А у нас в БД форума 84 таблицы...
Вот я и думаю над чем:
Сипекс-дампер или любой другой бекапер/ресторер дропают и затем INSERT...
А если не дропать, а перед каждым инсертом проверять: есть ли строка с таким айдишником. Если есть - UPDATE, если нет - INSERT. Быстро ведь будет работать, может вдвое медленней чем дроп с инсертами...
Спустя 43 минуты, 57 секунд (27.05.2009 - 23:26) kirik написал(а):
Если целых строк меньше чем битых, то имеет смысл восстановить старый дамп, и потом дописать новые строки, а если наоборот, то такая операция в любом случае займет какое-то время.
Цитата (FatCat @ 27.05.2009 - 14:42) |
А если не дропать, а перед каждым инсертом проверять: есть ли строка с таким айдишником. Если есть - UPDATE, если нет - INSERT. Быстро ведь будет работать, может вдвое медленней чем дроп с инсертами... |
Пожалуй это единственный возможный вариант Только можно не проверять на наличие, а вставлять через REPLACE, тогда если такой строки не будет - она вставится, если будет - заменится.
Спустя 2 минуты, 16 секунд (27.05.2009 - 23:28) jetistyum написал(а):
Генерю базу, буду пробовать.
Спустя 2 минуты, 49 секунд (27.05.2009 - 23:31) jetistyum написал(а):
kirik +1
я тоже имел в виду REPLACE
ща нагенерю пару тыщщьь .. посмотрим
я тоже имел в виду REPLACE
ща нагенерю пару тыщщьь .. посмотрим
Спустя 40 минут, 17 секунд (28.05.2009 - 00:11) jetistyum написал(а):
итак, была создана таблица на 4 поля..
1. - id
3 текстовых
было нагенерено 100 000 записей
таблица получилась размером 37 мегабайт
таблица была скопирована в другую..
из первой удалены записи по 10000<id<30000 тоесть фактически удалили в таблице 20 000 строк
затем в первую таблицу добавили еще почти 300 000 записей и сделал
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) |
Приходилось видеть таблицы и по несколько гигабайт. |
я не хвастаюсь Это просто для оценки, чтобы не расписывать длинну данных каждого поля.
кстати конечная таблица (рабочая) имеет 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 минут показал только маленькую долю из "выполнено" ... при дампе.. отменил.. посмотрим что при ресторе будет
_____________
Бесплатному сыру в дырки не заглядывают...