Нещодавно я знайшов і виправив помилку на веб-сайті, над яким я працював, що призвело до мільйонів повторюваних рядків даних у таблиці, які будуть досить великими навіть без них (все ще в мільйонах). Я легко можу знайти ці повторювані рядки і можу запустити один запит на видалення, щоб убити їх усіх. Проблема полягає в тому, що спроба видалити стільки рядків одним пострілом блокує таблицю на довгий час, чого я хотів би уникнути, якщо це можливо. Єдиними способами, як я можу побачити ці рядки, не знімаючи сайт (заблокувавши таблицю), є:
- Напишіть сценарій, який буде виконувати тисячі менших запитів на видалення в циклі. Теоретично це дозволить обійти проблему заблокованої таблиці, оскільки інші запити зможуть потрапити до черги та виконуватися між видаленнями. Але це все одно буде значно збільшувати навантаження на базу даних і запускатиметься довго.
- Перейменуйте таблицю та відтворіть існуючу таблицю (вона тепер буде порожньою). Тоді зробіть мою прибирання на перейменованому столі. Перейменуйте нову таблицю, назвіть стару назад і об’єднайте нові рядки в перейменовану таблицю. Цей шлях робить значно більше кроків, але повинен виконувати роботу з мінімальними перервами. Єдина хитра частина тут полягає в тому, що дана таблиця є таблицею звітів, тому, як тільки вона буде перейменована, а порожня буде поставлена на її місце, всі історичні звіти зникають, поки я не поверну її на місце. Плюс процес злиття може трохи зашкодити через тип даних, що зберігаються. Загалом, це мій вірогідний вибір зараз.
Мені просто цікаво, чи була у когось така проблема раніше, і якщо так, то як ви з нею справлялися, не видаляючи сайт, і, сподіваємось, з мінімальними, якщо взагалі перервами для користувачів? Якщо я піду з номером 2 або іншим, подібним, підходом, я можу запланувати, щоб речі запускались пізно ввечері та зробили злиття рано вранці наступного дня, і просто повідомили користувачів заздалегідь, так що це не величезна справа. Я просто шукаю, чи хтось має ідеї щодо кращого чи простішого способу очищення.