Удаление массы MySQL ОТ 80 таблиц

У меня есть 50 ГБ mysql база данных (80 таблиц), что я должен удалить некоторое содержание из нее. У меня есть ссылочная таблица, которая содержит список, если идентификаторы продукта, который должен быть удален из другие таблицы.

Теперь, другие таблицы могут составить 2 ГБ каждый, содержит объекты, который должен быть удален.

  1. Мой вопрос: так как это не маленькая база данных, что самый безопасный путь состоит в том, чтобы удалить данные в одном выстреле для предотвращения проблем?

  2. Что лучший метод должен проверить, все данные были удалены?

5
задан Sam 15 August 2014 в 12:58
поделиться

5 ответов

Я согласен с Тирлером, что использование внешних ключей предпочтительнее. Это гарантирует ссылочную целостность и согласованность всей базы данных.
Я могу поверить, что жизнь иногда требует более хитрой логики. Поэтому вы можете использовать ручные запросы, например

delete from a where id in (select id from keys)  

Вы можете удалить все записи сразу, или по диапазону ключей, или используя LIMIT в DELETE. Правильный индекс является обязательным условием. Для проверки согласованности нужна функция или запрос. Например:

create function check_consistency() returns boolean
begin
   return not exists(select * from child where id not in (select id from parent) ) 
       and not exists(select * from child2 where id not in (select id from parent) );
   -- and so on  
end
0
ответ дан 15 December 2019 в 06:25
поделиться

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

Представьте, что вы создали приложение, которое предоставляет ряд услуг для подключаемых модулей. Таким образом, ваше приложение и его службы являются доверенным кодом. Съемные модули, однако, не обязательно являются доверенными и загружаются в собственные загрузчики классов (и имеют собственные домены защиты).

Когда подключаемый модуль вызывает службу, выполняется пользовательская проверка безопасности («имеет ли подключаемый модуль X разрешение на использование этой службы»). Однако для самой службы может потребоваться некоторое базовое разрешение Java (чтение системного свойства, запись в файл и т.д.). Код, требующий этих разрешений, заключен в doPrivileged () , поэтому недостаточные разрешения от ненадежных подключаемых модулей фактически игнорируются - применяются только привилегии доверенного модуля служб.

-121--1306494-

Использовать

<form> ...
<input type="search" /> ...
</form>

< форма > является обязательным условием.

(См. также http://groups.google.com/group/phonegap/browse_thread/thread/bca19709dbdf2e24/eb312d0607102395?lnk=raot )

-121--3791872-

Вероятно, это больше не поможет. Но следует помнить об этом при создании базы данных. В mysql (в зависимости от типа места хранения, например, в InnoDB) можно указать отношения (они называются ограничениями внешнего ключа ). Эти связи означают, что при удалении записи из одной строки (например, продуктов) можно автоматически обновлять или удалять записи в других таблицах, в которых эта строка является внешним ключом (например, product_storage). Эти отношения гарантируют 100% непротиворечивое состояние. Однако эти отношения трудно добавить назад. Если вы планируете делать это чаще, то, безусловно, стоит изучить, если вы можете добавить их в свою базу данных, они сэкономят вам много работы (все виды запросов становятся проще)

Без этих отношений вы не можете быть уверены на 100%. Таким образом, вам придется просмотреть все таблицы, а не столбцы, которые вы хотите проверить и написать кучу sql запросов, чтобы убедиться, что не осталось записей.

1
ответ дан 15 December 2019 в 06:25
поделиться

Можно вернуть любой список, реализующий IEnumerable. Проверьте этот .

-121--1740768-

Попробуйте Alt + стрелка влево , которая пойдет назад в истории - если вкладка закрыта, она снова откроется.

-121--731527-

Как отметил Тирлер, было бы неплохо, если бы у вас были внешние ключи. Без них решение burnall можно использовать для транзакций, чтобы гарантировать, что никакие несоответствия не ползуют.

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

1
ответ дан 15 December 2019 в 06:25
поделиться

Также, возможно, стоит обратить внимание на разделение таблиц MySQL на разделы. Для получения дополнительной информации посмотрите руководство:

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

Сводится к тому, что вы можете разделить таблицы (например) на различные разделы по значениям времени или наборам индексов.

0
ответ дан 15 December 2019 в 06:25
поделиться

Как указывалось ранее, в этом месте было бы неплохо использовать внешние ключи. Но что касается вопроса 1, возможно, вы могли бы внести изменения в транзакцию из командной строки MySQL. Это предполагает, что вы используете механизм безопасного хранения транзакций, такой как InnoDB. При необходимости вы можете преобразовать myisam в InnoDB. В любом случае что-то вроде этого:

START TRANSACTION;

...Perform changes...
...Control changes...

COMMIT;
...or...
ROLLBACK;

Допустимо ли время простоя?

При работе с PostgreSQL с базами данных> 250 Гб мы используем эту технику на производственных серверах для внесения изменений в базу данных. Если результат не такой, как ожидалось, мы просто откатываем транзакцию. Конечно, есть штраф, так как система ввода-вывода должна немного работать.

// John

1
ответ дан 15 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

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