<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        [Mysql]備份同庫中一張表的歷史記錄insertinto..select_MySQL

        來源:懂視網 責編:小采 時間:2020-11-09 19:52:11
        文檔

        [Mysql]備份同庫中一張表的歷史記錄insertinto..select_MySQL

        [Mysql]備份同庫中一張表的歷史記錄insertinto..select_MySQL:需求 現在有個這么一個需求,mysql中有個表,數據增長的很快,但是呢這個數據有效期也就是1個月,一個月以前的記錄不太重要了,但是又不能刪除。為了保證這個表的查詢速度,需要一個簡單的備份表,把數據倒進去。 代碼 于是我寫了一個小腳本,用來做定時任務
        推薦度:
        導讀[Mysql]備份同庫中一張表的歷史記錄insertinto..select_MySQL:需求 現在有個這么一個需求,mysql中有個表,數據增長的很快,但是呢這個數據有效期也就是1個月,一個月以前的記錄不太重要了,但是又不能刪除。為了保證這個表的查詢速度,需要一個簡單的備份表,把數據倒進去。 代碼 于是我寫了一個小腳本,用來做定時任務

        需求

        現在有個這么一個需求,mysql中有個表,數據增長的很快,但是呢這個數據有效期也就是1個月,一個月以前的記錄不太重要了,但是又不能刪除。為了保證這個表的查詢速度,需要一個簡單的備份表,把數據倒進去。

        代碼

        于是我寫了一個小腳本,用來做定時任務,把這個表某段時間的數據備份到備份表中,核心就是個簡單的sql。

        原始表radius 備份的表為 radius2015

        #!/usr/bin/python2.7
        # -*- coding: utf-8 -*-
        #python2.7x
        #authror: orangleliu
        #備份radius中的上網記錄表,每個月備份一次,原始表中保留一份數據
        #使用同一個數據庫中的一個不同表名的表備份
        
        import time
        import datetime
        import logging
        from datetime import timedelta
        
        import MySQLdb
        import MySQLdb.cursors
        
        
        logging.basicConfig(format='%(asctime)s %(levelname)s - \
         %(message)s')
        logger = logging.getLogger('backup')
        logger.setLevel(logging.DEBUG)
        
        #數據庫配置
        DBPARAMS = {
         "host":"127.0.0.1",
         "user":"root",
         "password":"",
         "database":"test",
         "charset": ""
        }
        
        #這里使用select into 來備份,數據校驗對比記錄數,一個月大概100w條數據
        #radacct2015
        #檢查表,檢查重傳,備份,校驗
        
        create_table_sql = '''
        CREATE TABLE `{0}` (
         `radacctid` bigint(21) NOT NULL AUTO_INCREMENT,
         `acctsessionid` varchar(64) NOT NULL DEFAULT '',
         `acctuniqueid` varchar(32) NOT NULL DEFAULT '',
         `username` varchar(64) NOT NULL DEFAULT '',
         `groupname` varchar(64) NOT NULL DEFAULT '',
         `realm` varchar(64) DEFAULT '',
         `nasipaddress` varchar(15) NOT NULL DEFAULT '',
         `nasportid` varchar(15) DEFAULT NULL,
         `nasporttype` varchar(32) DEFAULT NULL,
         `acctstarttime` int(11) DEFAULT NULL,
         `acctupdatetime` int(11) DEFAULT NULL,
         `acctstoptime` int(11) DEFAULT NULL,
         `acctinterval` int(12) DEFAULT NULL,
         `acctsessiontime` int(12) unsigned DEFAULT NULL,
         `acctauthentic` varchar(32) DEFAULT NULL,
         `connectinfo_start` varchar(50) DEFAULT NULL,
         `connectinfo_stop` varchar(50) DEFAULT NULL,
         `acctinputoctets` bigint(20) DEFAULT NULL,
         `acctoutputoctets` bigint(20) DEFAULT NULL,
         `calledstationid` varchar(50) NOT NULL DEFAULT '',
         `callingstationid` varchar(50) NOT NULL DEFAULT '',
         `acctterminatecause` varchar(32) NOT NULL DEFAULT '',
         `servicetype` varchar(32) DEFAULT NULL,
         `framedprotocol` varchar(32) DEFAULT NULL,
         `framedipaddress` varchar(15) NOT NULL DEFAULT '',
         PRIMARY KEY (`radacctid`),
         UNIQUE KEY `acctuniqueid` (`acctuniqueid`),
         KEY `username` (`username`),
         KEY `framedipaddress` (`framedipaddress`),
         KEY `acctsessionid` (`acctsessionid`),
         KEY `acctsessiontime` (`acctsessiontime`),
         KEY `acctstarttime` (`acctstarttime`),
         KEY `acctinterval` (`acctinterval`),
         KEY `acctstoptime` (`acctstoptime`),
         KEY `nasipaddress` (`nasipaddress`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8
        '''
        
        
        back_sql = '''
        INSERT INTO {0}
        SELECT *
        FROM {1}
        WHERE acctstarttime < UNIX_TIMESTAMP(
         STR_TO_DATE('{2}', '%Y-%m-%d')
        ) AND acctstarttime >= UNIX_TIMESTAMP(
         STR_TO_DATE('{3}', '%Y-%m-%d')
        )'''
        
        
        count_sql = """
        SELECT count(*) FROM {0} WHERE 1=1 AND
        acctstarttime < UNIX_TIMESTAMP(
         STR_TO_DATE('{1}', '%Y-%m-%d')
        ) AND acctstarttime >= UNIX_TIMESTAMP(
         STR_TO_DATE('{2}', '%Y-%m-%d')
        )
        """
        
        
        #date tools
        def get_year(month):
         #month like 201505
         return datetime.datetime.strptime(month, "%Y%m").year
        
        
        def get_month_firstday_str(month):
         return datetime.datetime.strptime(month,"%Y%m").\
         strftime("%Y-%m-%d")
        
        def get_next_month_firstday_str(month):
         month_firstday = datetime.datetime.strptime(month,"%Y%m")
         monthnum = month_firstday.month
         return "{0}-{1}-{2}".format(
         month_firstday.year if monthnum < 12 else \
         month_firstday.year + 1,
         monthnum + 1 if monthnum < 12 else 1, 1)
        
        
        class DBConn(object):
         __CONFIG = {
         'default': {
         'host': "",
         'user': "",
         'database': "",
         'password': "",
         'charset': "",
         }
         }
        
         def __init__(self, connname='', connconfig={}):
         if connconfig:
         self.connconfig = connconfig
         else:
         connname = connname or 'default'
         self.connconfig = self.__CONFIG.get(connname, 'default')
         self.conn = None
        
         def __enter__(self):
         try:
         self.conn = MySQLdb.connect(
         user=self.connconfig['user'],
         db=self.connconfig['database'],
         passwd=self.connconfig['password'],
         host=self.connconfig['host'],
         use_unicode=True,
         charset=self.connconfig['charset'] or "utf8",
         #cursorclass=MySQLdb.cursors.DictCursor
         )
        
         return self.conn
         except Exception, e:
         print str(e)
         return None
        
         def __exit__(self, exe_type, exe_value, exe_traceback):
         if exe_type and exe_value:
         print '%s: %s' % (exe_type, exe_value)
         if self.conn:
         self.conn.close()
        
        
        class RadiusBackup(object):
         def __init__(self, month, conn):
         self.conn = conn
         self.cursor = conn.cursor()
         self.month = month
         self.year = get_year(month)
         self.month_firstday = get_month_firstday_str(month)
         self.next_month_firstday = get_next_month_firstday_str(month)
         self.tablename = "radacct{0}".format(self.year)
         self.stable = "radacct"
        
        
         def check_table_exist(self):
         check_table_sql = "SHOW TABLES LIKE '{0}'".format(
         self.tablename)
         self.cursor.execute(check_table_sql)
         res = self.cursor.fetchall()
         return True if len(res) > 0 else False
        
        
         def create_backup_table(self):
         sql = create_table_sql.format(self.tablename)
         self.cursor.execute(sql)
         logger.info(u"開始創建備份表 {0}".format(self.tablename))
        
        
         def check_datas_count(self, tablename):
         sql = count_sql.format(tablename, self.next_month_firstday,
         self.month_firstday)
         logger.debug(sql)
         self.cursor.execute(sql)
         res = self.cursor.fetchone()
         return res[0]
        
        
         def check_before(self):
         flag = False
         #check table
         if not self.check_table_exist():
         self.create_backup_table()
         if self.check_table_exist() == False:
         logger.error(u"無法找到備份表 exit")
         return flag
         #check datas
         if self.check_datas_count(self.tablename) > 0:
         return flag
         else:
         return True
        
        
         def backup_datas(self):
         sql = back_sql.format(self.tablename, self.stable,
         self.next_month_firstday, self.month_firstday)
         logger.debug(sql)
         self.cursor.execute(sql)
         self.conn.commit()
        
        
         def check_after(self):
         snum = self.check_datas_count(self.stable)
         bnum = self.check_datas_count(self.tablename)
         if snum > 0 and (snum == bnum):
         logger.info(u"備份成功")
         return snum, True
         else:
         return -1, False
        
         def backup_handler(self):
         if self.check_before():
         logger.info(u"檢查完畢,開始備份數據")
         self.backup_datas()
         logger.info(u"開始備份")
         num, flag = self.check_after()
         logger.info(u"本次備份{0} 數據 {1}條".format(self.month, num))
         else:
         logger.info(u"數據已經有備份,請檢查")
        
        
        if __name__ == "__main__":
         month = "201504"
        
         with DBConn(connconfig=DBPARAMS) as dbconn:
         if dbconn:
         backup = RadiusBackup(month, dbconn)
         backup.backup_handler()
         else:
         logger.error("can not connect to db")

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        [Mysql]備份同庫中一張表的歷史記錄insertinto..select_MySQL

        [Mysql]備份同庫中一張表的歷史記錄insertinto..select_MySQL:需求 現在有個這么一個需求,mysql中有個表,數據增長的很快,但是呢這個數據有效期也就是1個月,一個月以前的記錄不太重要了,但是又不能刪除。為了保證這個表的查詢速度,需要一個簡單的備份表,把數據倒進去。 代碼 于是我寫了一個小腳本,用來做定時任務
        推薦度:
        標簽: 歷史 備份 mysql
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久国产精品免费专区| 亚洲精品黄色视频在线观看免费资源 | 91福利免费视频| 亚洲成AV人片一区二区| 成人免费区一区二区三区| 亚洲最大AV网站在线观看| fc2免费人成在线| 亚洲小说区图片区另类春色| 国产精品玖玖美女张开腿让男人桶爽免费看 | 国产高清在线免费视频| 亚洲第一成年免费网站| 国产美女精品久久久久久久免费| 亚洲精品无码专区| 国产精品亚洲а∨无码播放| jizz免费观看视频| 国产成人亚洲精品狼色在线| 你是我的城池营垒免费观看完整版| 最新国产AV无码专区亚洲| 国产免费拔擦拔擦8X高清在线人 | 51午夜精品免费视频| 久久精品亚洲日本佐佐木明希| 嫩草影院在线播放www免费观看| 久久久久无码精品亚洲日韩| 久久精品国产免费| 亚洲伊人久久大香线蕉在观| 精品国产免费观看久久久| 免费大片av手机看片高清| 国产成人亚洲综合色影视| 97人妻无码一区二区精品免费| 精品国产日韩久久亚洲| 亚洲国产综合无码一区二区二三区 | 成人无码区免费视频观看| 免费毛片毛片网址| 亚洲AV无码专区国产乱码电影| 猫咪免费人成网站在线观看| 亚洲中文字幕丝袜制服一区| 精品在线免费观看| 一区二区亚洲精品精华液 | 国产成人免费AV在线播放 | 亚洲成在人线aⅴ免费毛片| 国产精品亚洲专区在线播放|