Глобальный скрипт для удаления старых таблиц

Материал из 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();
        }        
    }        
}

Скрипт рассчитан только на удаление ежемесячных и ежедневных таблиц.

Удачи!

Личные инструменты