Глобальный скрипт для удаления старых таблиц
Материал из BiTel WiKi
Глобальный скрипт для удаления старых таблиц
Предоставляю глобальный скрипт для ручной/автоматической чистки базы от старых таблиц.
Коллеги, естественно перед применением данного скрипта Вы должны понимать, что он УДАЛЯЕТ ТАБЛИЦЫ ИЗ БАЗЫ!!!
Список таблиц для проверки необходимо добавить в хеш checkTables:
checkTables.put("^ipn_contract_data_\\d+_(\\d{6})$", 6);
"^ipn_contract_data_\\d+_(\\d{6})$" - регексп таблицы
6 - кол-во месяцев.
Так же в /usr/bin/mysqldump -uUser -pPassword необходимо указать логин и пароль к базе.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package ru.ttk.billing.event.GlobalScript;
import bitel.billing.common.TimeUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Utils;
import ru.bitel.common.sql.ConnectionSet;
/**
*
* @author lda
*/
public class DeleteOldTables extends GlobalScriptBase{
private Calendar currentMonth = new GregorianCalendar();
private HashMap<String,Integer> checkTables = new HashMap<String, Integer>();
@Override
public void execute( Setup setup, ConnectionSet connectionSet )
throws Exception{
checkTables.put("^ipn_contract_data_\\d+_(\\d{6})$", 6);
checkTables.put("^data_log_\\d+_(\\d{8})$", 6);
checkTables.put("^log_gscript_process_(\\d{6})$", 12);
try {
Connection con = connectionSet.getConnection();
String query = "SHOW TABLES";
PreparedStatement ps = con.prepareStatement(query);
ResultSet rs = ps.executeQuery();
while (rs.next()){
boolean del = false;
String table = rs.getString( 1 );
for (Map.Entry<String, Integer> t : checkTables.entrySet()) {
String tableNameRegexp = t.getKey();
Integer tableMonth = t.getValue();
Pattern p = Pattern.compile(tableNameRegexp);
Matcher m = p.matcher(table);
if (m.find()){
String tableDate = m.group(1);
if (tableDate.length() == 6){
//yyyymm
Calendar date = new GregorianCalendar();
int yy = Utils.parseInt(tableDate.substring(0, 4));
int mm = Utils.parseInt(tableDate.substring(4, 6));
if ( mm <= 0 || mm > 12 || yy < 2000 || yy > 2100 ){
continue;
}
date.set( Calendar.MONTH, mm - 1 );
date.set( Calendar.YEAR, yy );
if( TimeUtils.monthsDelta( date, currentMonth ) >= tableMonth ){
del = true;
break;
}
}else if (tableDate.length() == 8){
//yyyymmdd
Calendar date = new GregorianCalendar();
int yy = Utils.parseInt(tableDate.substring(0, 4));
int mm = Utils.parseInt(tableDate.substring(4, 6));
int dd = Utils.parseInt(tableDate.substring(6, 8));
if (dd <= 0 || dd > 31 || mm <= 0 || mm > 12 || yy < 2000 || yy > 2100 ){
continue;
}
date.set( Calendar.DAY_OF_MONTH, dd );
date.set( Calendar.MONTH, mm - 1 );
date.set( Calendar.YEAR, yy );
Calendar date2 = (Calendar)currentMonth.clone();
date2.add(Calendar.MONTH, tableMonth * -1);
if (TimeUtils.dateBefore(date, date2)){
del = true;
break;
}
}
}
}
if (del){
print(table);
Process process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c","/usr/bin/mysqldump -uUser -pPassword bgbilling "+table+" | /bin/gzip > /var/lib/mysql/backup/tables/"+table+".gz"});
int processComplete = process.waitFor();
print("processComplete="+processComplete);
if (processComplete == 0){
PreparedStatement ps2 = con.prepareStatement( "DROP TABLE IF EXISTS "+table );
ps2.executeUpdate();
ps2.close();
}
}
}
ps.close();
}catch( Exception e ){
e.printStackTrace();
}
}
}
Скрипт рассчитан только на удаление ежемесячных и ежедневных таблиц.
Удачи!
