Глобальный скрипт для удаления старых таблиц 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)