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

Материал из BiTel WiKi

Версия от 06:33, 13 июля 2018; Cromeshnic (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Глобальный скрипт для удаления старых таблиц (drop/truncate/dump)

Скрипт удаляет произвольные месячный или дневные таблицы в соответствии с настройками в глобальном конфиге биллинга.

Также опционально может делать бэкап таблицы перед удалением и делать truncate таблицы вместо её удаления.

package ru.dsi.bgbilling.kernel.scripts.global;
 
import bitel.billing.server.util.MailMsg;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.common.sql.ConnectionSet;
 
import java.io.IOException;
import java.sql.*;
import java.util.Calendar;
import java.util.Map;
 
import static ru.bitel.common.TimeUtils.*;
/**
 * Чистим старые таблицы
 */
public class DropOldTables
        extends GlobalScriptBase
{
    @Override
    public void execute( Setup setup, ConnectionSet connectionSet )
            throws Exception
    {
        ParameterMap params = setup.sub("script.droptables.");
        String prefix;
        String name;
        int months;
        int flagDrop = 0;
        int backup = 0;
        Calendar cal;
        StringBuilder report = new StringBuilder();
        boolean debug = params.getBoolean("debug", false);
        String email = params.get("email", null);
        String backupdir=params.get("dirbackup",null);
        String dumpstring=params.get("dumpstring",null);
 
        //daily
        //Подневные таблицы вида prefix_yyyymmdd
        // например, удаляем cdr-логи телефонии старше 6 месяцев (оставляем текущий + 5 предыдущих):
        //script.droptables.day.1.prefix=data_log_18
        //script.droptables.day.1.months=6
        for(Map.Entry<Integer, ParameterMap> entry: params.subIndexed("day.").entrySet()){
            prefix = entry.getValue().get("prefix");
            months = entry.getValue().getInt("months", 0);
            flagDrop = entry.getValue().getInt("drop", 0);
            backup = entry.getValue().getInt("backup", 0);
            if(prefix==null || months<=0){
                error("'prefix' not found or 'months'<=0 for config params script.droptables.day."+entry.getKey()+".");
                continue;
            }
            cal = Calendar.getInstance();
            cal.add(Calendar.MONTH,-months);
            //Удаляем 12 месяцев начиная с now.mm-months
            for(int i=1;i<=12;i++) {
                for (int dd=1; dd<=cal.getActualMaximum(Calendar.DAY_OF_MONTH); dd++){
                    cal.set(Calendar.DAY_OF_MONTH, dd);
                    name = prefix + format(cal, "_yyyyMMdd");
                    deleteRecord(connectionSet, name, flagDrop, report, backupdir, dumpstring, backup, debug);
                }
                cal.add(Calendar.MONTH,-1);
            }
        }
 
        //monthly
        //Подмесячные таблицы вида prefix_yyyymm
        // например, удаляем cdr-логи телефонии старше 6 месяцев (оставляем текущий + 5 предыдущих):
        //script.droptables.month.1.prefix=log_server_12
        //script.droptables.month.1.months=6
        for(Map.Entry<Integer, ParameterMap> entry: params.subIndexed("month.").entrySet()){
            prefix = entry.getValue().get("prefix");
            months = entry.getValue().getInt("months", 0);
            flagDrop = entry.getValue().getInt("drop", 0);
            backup = entry.getValue().getInt("backup", 0);
            if(prefix==null || months<=0){
                error("'prefix' not found or 'months'<=0 for config params script.droptables.month."+entry.getKey()+".");
                continue;
            }
            cal = Calendar.getInstance();
            cal.add(Calendar.MONTH,-months);
            //Удаляем 12 месяцев начиная с now.mm-months
            for(int i=1;i<=12;i++) {
                name = prefix + format(cal, "_yyyyMM");
                deleteRecord(connectionSet, name,flagDrop,report, backupdir, dumpstring, backup, debug);
                cal.add(Calendar.MONTH,-1);
            }
        }
 
        if(email!=null && !"".equals(email)){
            MailMsg msg = new MailMsg(setup);
            msg.sendMessage(email, "Удаление старых таблиц", report.toString());
        }
    }
    private void deleteRecord(ConnectionSet connectionSet, String tableName, int flagDrop, StringBuilder report, String backupdir, String dumpstring, int backup, boolean debug){
        if(tableExists(connectionSet.getConnection(), tableName)) {
            String trorDrop=flagDrop==0?"TRUNCATE":"DROP TABLE";
            String filedm=backupdir+"/"+tableName;
 
 
            print(trorDrop+" " + tableName);
            if (!debug){
                int exitValue=1;
                if(backup==1){
                    Runtime rt = Runtime.getRuntime();
                    String commandDump = dumpstring+" "+tableName+" -r "+ filedm+".sql";
                    String commandZip = " zip "+filedm+".zip "+filedm+".sql";
                    String commandRm = "rm "+filedm+".sql";
                    try {
                        Process proc=rt.exec(commandDump);
                        proc.waitFor();
                        if (proc.exitValue()==0){
                            proc=rt.exec(commandZip);
                            proc.waitFor();
                            if(proc.exitValue()==0){
                                proc=rt.exec(commandRm);
                                proc.waitFor();
                            }
                        }
                        exitValue=proc.exitValue();
 
                    } catch (IOException e) {
                        error("Не удалось сделать бэкап таблицы " + tableName+"; Exeption : "+e.toString());
                    } catch (InterruptedException e) {
                        error("Не удалось сделать бэкап таблицы " + tableName+"; Exeption : "+e.toString());
                    }
                }
                if((backup==1&&exitValue==0)||(backup==0)){
                    try {
                        Statement st = connectionSet.getConnection().createStatement();
                        st.executeUpdate(trorDrop+" " + tableName);
                        st.close();
                    }catch (SQLException e){
                        error(e.getMessage());
                    }
                }
 
            }
            report.append(trorDrop).append(" ").append(tableName).append("\n");
        }
    }
    private boolean tableExists(Connection con, String tableName){
        boolean result=false;
        try {
            PreparedStatement ps = con.prepareStatement("SHOW TABLES LIKE ?");
            ps.setString(1, tableName);
            ResultSet rs = ps.executeQuery();
            result = rs.next();
            rs.close();
            ps.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }
 
}

Пример конфига скрипта:

#Скрипт удаления старых таблиц DropOldTables
script.droptables.debug=0
#уведомление на email со списком удалённых таблиц
script.droptables.email=admin@provider.ru
#храним бэкапы
script.droptables.dirbackup=/mnt/backup/bgtables
script.droptables.dumpstring=mysqldump -uroot -p12345 -P 3306 -h 127.0.0.1 bgbilling
script.droptables.month.1.prefix=log_server_1
script.droptables.month.1.months=6
script.droptables.month.2.prefix=log_error_1
script.droptables.month.2.months=6
script.droptables.month.3.prefix=log_function_process
script.droptables.month.3.months=6
script.droptables.month.4.prefix=connection_log_entry_28
script.droptables.month.4.months=6
script.droptables.month.5.prefix=inet_auth_error_28
script.droptables.month.5.months=6
script.droptables.month.6.prefix=log_gscript_process
script.droptables.month.6.months=6
script.droptables.month.6.drop=1
script.droptables.month.7.prefix=npay_add_cost_detail_16
script.droptables.month.7.months=6
script.droptables.month.7.drop=1
script.droptables.month.8.prefix=npay_detail_16
script.droptables.month.8.months=24
script.droptables.month.8.drop=1
script.droptables.month.9.prefix=source_data
script.droptables.month.9.months=9
script.droptables.month.9.drop=1
script.droptables.month.10.prefix=tariff_detail_1
script.droptables.month.10.months=6
script.droptables.month.10.drop=1
script.droptables.month.11.prefix=bgs_query_log
script.droptables.month.11.months=12
script.droptables.month.11.drop=1
script.droptables.month.11.backup=1
script.droptables.month.12.prefix=web_query_log
script.droptables.month.12.months=6
script.droptables.month.12.drop=1
script.droptables.month.12.backup=1
script.droptables.day.13.prefix=data_log_18
script.droptables.day.13.months=3
script.droptables.day.13.drop=1
#

--Cromeshnic 06:33, 13 июля 2018 (UTC)

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