forum.bitel.ru
http://forum.bitel.ru/

удаление старых таблиц
http://forum.bitel.ru/viewtopic.php?f=22&t=8839
Страница 1 из 1

Автор:  survivor [ 16 янв 2014, 19:01 ]
Заголовок сообщения:  удаление старых таблиц

Добрый день!
За годы работы биллинга накопилось аж 800 таблиц. Многие из них регулярно чищу, какие-то данные храню в течение года, какие-то полгода, что-то не более трех месяцев. В результате - очень много пустых таблиц. Как-то попробовал их дропнуть - биллинг отказался загружаться. Пришлось возвращать бакапы.
Скрипт на вики для удаления старых таблиц видел, странно но он тоже просто дропает старые таблицы...
Хочу попробовать еще раз. Речь про эти таблицы:
bgs_query_log_yyyymm
log_error_1_yyyymm
log_function_process_yyyymm
log_server_1_yyyymm
log_session_net_1_yyyymm
session_account_1_yyyymm
session_detail_1_yyyymm
web_query_log_yyyymm
Можно ли их дропать спокойно или есть на них какие-то линки из других таблиц и биллинг не запустится из-за нарушения целостности базы?


Биллинг 4.6 580

Автор:  Phricker [ 16 янв 2014, 21:12 ]
Заголовок сообщения:  Re: удаление старых таблиц

Периодически удаляю кроме bgs_query_log_yyyymm ибо временами нужно лезть в предыдущие периоды.
Удаляю скриптом который создает модуль DBA.
По-моему начинал с 5.1/5.2 версии подобным страдать, за 4.6 не могу ничего сказать.

Автор:  snark [ 12 фев 2014, 16:57 ]
Заголовок сообщения:  Re: удаление старых таблиц

survivor писал(а):
Биллинг 4.6 580

У меня на 5.0 (почти то же самое что и 4.6) сейчас работает вот такой вариант скрипта из вики:
Код:
/**
 * Удаление старых таблиц
 */

import java.sql.*;
import java.util.*;
import java.util.regex.*;

import java.lang.Runtime;
import java.lang.Process;

import bitel.billing.common.*;
import bitel.billing.server.util.*;

public void main(setup, con, conSlave)
{
    private Calendar currentDate = new GregorianCalendar();
    private HashMap checkTables = new HashMap();

    // kernel
    checkTables.put("^bgs_query_log_(\\d{6})$", 3);         // месячная таблица запросов клиентов биллинга к серверу
    checkTables.put("^data_log_error_(\\d{6})$", 1);        // ошибки обработки логов
    checkTables.put("^log_function_process_(\\d{6})$", 1);  // логи обработки событий функциями скриптов
    checkTables.put("^log_gscript_process_(\\d{6})$", 1);   // логи выполнения глобальных скриптов
    checkTables.put("^source_data_(\\d{6})$", 3);           // данные о загруженных часовых логах
    checkTables.put("^web_query_log_(\\d{6})$", 3);         // журнал web-запросов клиентов на странице статистики

    // dialup
    private int dialupModuleId = 1;
    checkTables.put("^log_error_" + dialupModuleId + "_(\\d{6})$", 1);          // ошибки авторизации
    checkTables.put("^log_server_" + dialupModuleId + "_(\\d{6})$", 1);         // радиус запросы сессий
    checkTables.put("^log_session_" + dialupModuleId + "_(\\d{6})$", 13);       // лог сессии
    checkTables.put("^session_account_" + dialupModuleId + "_(\\d{6})$", 13);   // детализации наработки сессии по услугам
    checkTables.put("^session_detail_" + dialupModuleId + "_(\\d{6})$", 13);    // детализация наработки сессии
    // постоянно пустые таблицы
    checkTables.put("^login_account_" + dialupModuleId + "_(\\d{6})$", 1);      // наработка по логину за месяц (используется системой ограничений)
    checkTables.put("^log_session_net_" + dialupModuleId + "_(\\d{6})$", 1);    // сети, маршрутизируемые через выданные сессиям ip адреса
    checkTables.put("^tariff_detail_" + dialupModuleId + "_(\\d{6})$", 1);      // детализация по тарифу (см. модуль бухгалтерии)

    // card
    //private int cardModuleId = 2;
    //checkTables.put("^card_dealer_pay_" + cardModuleId + "_(\\d{6})$", 13);     // платежи дилеров

    // npay
    private int npayModuleId = 3;
    checkTables.put("^npay_add_cost_detail_" + npayModuleId + "_(\\d{6})$", 1); // детализация сумм до которых "доводятся" доводящие абонплаты. используется макросом вычисления суммы позиции модуля bill
    checkTables.put("^npay_detail_" + npayModuleId + "_(\\d{6})$", 13);         // детализация начислений модуля (может использоваться сторонними системами)

    // ipn
    private int ipnModuleId = 4;
    checkTables.put("^ipn_contract_data_" + ipnModuleId + "_(\\d{6})$", 1);     // аггрегированная наработка по адресам

    // mps
    private int mpsModuleId = 5;
    checkTables.put("^mps_payment_" + mpsModuleId + "_(\\d{6})$", 13);          // платежи за месяц

    String backupDir = "/home/backup/old_tables";

    Process mkdir = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", "/bin/mkdir -p " + backupDir });
    int mkdirDone = mkdir.waitFor();
    if (mkdirDone != 0)
    {
        return;
    }

    try
    {
        String query = "SHOW TABLES FROM bgbilling WHERE Tables_in_bgbilling REGEXP '_[0-9]{6}$'";
        PreparedStatement ps = con.prepareStatement(query);
        ResultSet rs = ps.executeQuery();
        while (rs.next())
        {
            String tableName = rs.getString(1);
            Boolean dropTable = false;
            for (Map.Entry e : checkTables.entrySet())
            {
                String tableNameRegexp = e.getKey();
                int tableTTL = e.getValue();
                Pattern p = Pattern.compile(tableNameRegexp);
                Matcher m = p.matcher(tableName);
                if (m.matches())
                {
                    String tableDate = m.group(1);
                    int yy = Utils.parseIntString(tableDate.substring(0, 4));
                    int mm = Utils.parseIntString(tableDate.substring(4, 6));
                    if (yy > 0 && mm > 0)
                    {
                        Calendar checkDate = new GregorianCalendar();
                        //checkDate = currentDate.clone();
                        checkDate.set(Calendar.MONTH, mm - 1);
                        checkDate.set(Calendar.YEAR, yy);
                        if (TimeUtils.monthsDelta(checkDate, currentDate) >= tableTTL)
                        {
                            dropTable = true;
                        }
                    }
                }
            }
            if (dropTable)
            {
                String[] args = { "/bin/sh", "-c", "/usr/bin/mysqldump --user=bill --password=bgbilling --quick --single-transaction --default-character-set=cp1251 bgbilling " + tableName + " | /bin/gzip > " + backupDir +"/" + tableName + ".sql.gz" };
                Process dumper = Runtime.getRuntime().exec(args);
                int dumperDone = dumper.waitFor();
                if (dumperDone == 0)
                {
                    print(tableName);
                    PreparedStatement psd = con.prepareStatement("DROP TABLE IF EXISTS " + tableName);
                    psd.executeUpdate();
                    psd.close();
                }
                else
                {
                    print("dumper exit code = " + dumper.exitValue() + " on table: " + tableName);
                }
            }
        }
        ps.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Вдруг пригодится.

Автор:  survivor [ 19 фев 2014, 14:46 ]
Заголовок сообщения:  Re: удаление старых таблиц

Спасибо :)

Автор:  max [ 07 мар 2014, 22:51 ]
Заголовок сообщения:  Re: удаление старых таблиц

а куда его вставлять?

Автор:  snark [ 11 мар 2014, 15:51 ]
Заголовок сообщения:  Re: удаление старых таблиц

max писал(а):
а куда его вставлять?

Автоматизация -> Глобальные скрипты поведения
Текущая, рабочая версия скрипта здесь.

Автор:  skyb [ 11 мар 2014, 18:08 ]
Заголовок сообщения:  Re: удаление старых таблиц

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

Автор:  snark [ 11 мар 2014, 18:37 ]
Заголовок сообщения:  Re: удаление старых таблиц

В вики есть скрипт ;) У меня просто чуть переделанный вариант.
Я планирую запилить динкод для чистки inet после запуска у себя 6.0/6.1.

Автор:  skyb [ 12 мар 2014, 05:42 ]
Заголовок сообщения:  Re: удаление старых таблиц

snark писал(а):
В вики есть скрипт ;) У меня просто чуть переделанный вариант.
Я планирую запилить динкод для чистки inet после запуска у себя 6.0/6.1.

аха, давай, когда ты уже там перейдешь?

Автор:  snark [ 12 мар 2014, 14:58 ]
Заголовок сообщения:  Re: удаление старых таблиц

skyb писал(а):
когда ты уже там перейдешь?

Гоу флудить :)

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/