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();
}
}
Вдруг пригодится.