#!/usr/bin/env python # -*- encoding: utf8 -*- import calendar import time import os import sys from datetime import datetime,timedelta import mysql.connector # 定义一些全局变量 work_dir = "G:" #argv_database_name=sys.argv[1] #argv_table_name=sys.argv[2] getdbconfig_0_152 = { 'host': '127.0.0.1', 'user': 'root', 'password': 'root', 'port': '3306', 'database': 'partition_test' } # 此函数用来打印输出制定内容,第一个变量是输出内容,第二个变量是文件前缀,第三个变量是后缀名 def print_log(print_content,filename,suffix): my_log_day = time.strftime("%Y%m%d") my_log_file="%s%s_%s.%s" %(work_dir,filename,my_log_day,suffix) #with open(my_log_file, "aw") as f: with open(my_log_file, "a") as f: f.write( print_content+"\n") f.close() # 此函数用来指定某个月增加一个月 def add_month(srcDate, addMonths): if not srcDate or not srcDate: pass if addMonths < 1: return srcDate month = srcDate.month - 1 + addMonths year = srcDate.year + month / 12 month = month % 12 + 1 day = min(srcDate.day, calendar.monthrange(year, month)[1]) return srcDate.replace(year=year, month=month, day=day) def select_any_sql(getdbconfig,select_sql): select_any_sql_cnn = mysql.connector.connect(host=getdbconfig['host'], db=getdbconfig['database'], user=getdbconfig['user'], password=getdbconfig['password'],port=getdbconfig['port']) select_any_sql_cursor = select_any_sql_cnn.cursor() select_any_sql_cursor.execute(select_sql) select_any_sql_data = select_any_sql_cursor.fetchone() return select_any_sql_data def select_partition(getdbconfig): select_partition_sql = "SELECT table_schema,table_name,PARTITION_NAME,PARTITION_ORDINAL_POSITION,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION FROM information_schema.`PARTITIONS` " \ "WHERE table_schema not in ('information_schema','performance_schema','mysql','test','sqlexe') and PARTITION_NAME is not null order by table_schema,PARTITION_NAME, PARTITION_ORDINAL_POSITION;" partition_contain_before = () partition_info = [] cnn = mysql.connector.connect(**getdbconfig) cursor = cnn.cursor() cursor.execute(select_partition_sql) for (table_schema, table_name, PARTITION_NAME, PARTITION_ORDINAL_POSITION, PARTITION_METHOD, PARTITION_EXPRESSION, PARTITION_DESCRIPTION) in cursor: PARTITION_ORDINAL_POSITION_NUM = int(PARTITION_ORDINAL_POSITION) - 1 if PARTITION_DESCRIPTION == 'MAXVALUE': select_paritition_description_sql = "SELECT PARTITION_NAME AS PARTITION_NAME_BEFORE,PARTITION_DESCRIPTION AS PARTITION_DESCRIPTION_BEFORE FROM information_schema.`PARTITIONS` " \ "WHERE table_schema='%s' and table_name='%s' and PARTITION_ORDINAL_POSITION='%s' ;" % (table_schema, table_name, PARTITION_ORDINAL_POSITION_NUM) mysql_select_cnn = mysql.connector.connect(**getdbconfig) mysql_select_cursor = mysql_select_cnn.cursor() mysql_select_cursor.execute(select_paritition_description_sql) for (PARTITION_NAME_BEFORE, PARTITION_DESCRIPTION_BEFORE) in mysql_select_cursor: partition_contain_before = (table_schema, table_name, PARTITION_NAME, PARTITION_NAME_BEFORE, PARTITION_METHOD,PARTITION_DESCRIPTION, PARTITION_DESCRIPTION_BEFORE) partition_info.append(partition_contain_before) if len(partition_info) == 0: print "PARTITION in the Database does not exist!!!" else: for i in partition_info: print "database:", i[0] if i[4] == 'RANGE': # 此部分数据用于生成alter table drop 语句 alter table t_lgj_log add PARTITION(PARTITION p201804 VALUES LESS THAN (737150)); select_max_partition_name_sql = "select count(*) as COUNT from %s.%s partition(%s)" % (i[0], i[1], i[2]) max_partition_name_count = select_any_sql(getdbconfig, select_max_partition_name_sql)[0] if max_partition_name_count==0: prompt_database="-- database : %s" %(i[0]) print_log(prompt_database, "auto_create_partition", "sql") print_user_database="use %s;" %(i[0]) print_log(print_user_database, "auto_create_partition", "sql") sql_alter_table_drop_partition = "alter table %s.%s drop PARTITION %s;" % (i[0], i[1], i[2]) # auto_create_partition 指的是用于自动删除最大分区并添加分区的脚本 print_log(sql_alter_table_drop_partition, "auto_create_partition", "sql") else: return_info_can_not_drop_max_partition = "%s.%s.%s" % (i[0], i[1], i[2]) # can_not_drop_max_partition 指的是最大分区中有数据,然后这部分数据并不能直接删除,把这些分区信息记录下来 print_log(return_info_can_not_drop_max_partition, "can_not_drop_max_partition", "sql") # 此部分数据用于生成alter table add 语句 alter table t_lgj_log add PARTITION(PARTITION p201804 VALUES LESS THAN (737150)); select_next_paritition_description_name="select from_days(%s);" %(i[6]) maxvalue_date=add_month(select_any_sql(getdbconfig, select_next_paritition_description_name)[0],1).strftime('%Y-%m-%d') maxvalue_date_year_month=add_month(select_any_sql(getdbconfig, select_next_paritition_description_name)[0],1).strftime('%Y%m') add_partition_name_01="p%s" %(maxvalue_date_year_month) # 此部分用于判断生成的 PARTITION_NAME 是否已经存在,如果存在,则需要在月份上加1 if add_partition_name_01 == i[3]: add_partition_name=add_partition_name_01 else: maxvalue_date_year_month_01=add_month(add_month(select_any_sql(getdbconfig, select_next_paritition_description_name)[0],1),1).strftime('%Y%m') add_partition_name = "p%s" % (maxvalue_date_year_month_01) less_than_sql="select to_days('%s')" %(maxvalue_date) less_than_name=select_any_sql(getdbconfig,less_than_sql)[0] sql_alter_table_add_partition="alter table %s.%s add PARTITION(PARTITION %s VALUES LESS THAN (%s));" %(i[0], i[1],add_partition_name,less_than_name) print_log(sql_alter_table_add_partition, "auto_create_partition", "sql") else: # can_not_drop_max_partition 指的是分区规则并不是range分区,把这些分区信息记录下来 print_log(i, "partition_info_not_in_range", "sql") print "Done!!!" select_partition(getdbconfig_0_152)
auto_create_partition
猜你喜欢
转载自www.cnblogs.com/liang545621/p/9075423.html
今日推荐
周排行