Глобальный скрипт для удаления старых таблиц
Материал из BiTel WiKi
Версия от 10:19, 5 апреля 2013; Lda (Обсуждение | вклад)
Глобальный скрипт для удаления старых таблиц
Предоставляю глобальный скрипт для ручной/автоматической чистки базы от старых таблиц.
Коллеги, естественно перед применением данного скрипта Вы должны понимать, что он УДАЛЯЕТ ТАБЛИЦЫ ИЗ БАЗЫ!!!
Список таблиц для проверки необходимо добавить в хеш 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(); } } }
Скрипт рассчитан только на удаление ежемесячных и ежедневных таблиц.
Удачи!