日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

[Mysql]备份同库中一张表的历史记录 insert into ..select

發(fā)布時(shí)間:2024/4/14 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Mysql]备份同库中一张表的历史记录 insert into ..select 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

需求

如今有個(gè)這么一個(gè)需求。mysql中有個(gè)表。數(shù)據(jù)增長的非??臁?墒悄剡@個(gè)數(shù)據(jù)有效期也就是1個(gè)月,一個(gè)月曾經(jīng)的記錄不太重要了,可是又不能刪除。為了保證這個(gè)表的查詢速度,須要一個(gè)簡單的備份表,把數(shù)據(jù)倒進(jìn)去。

代碼

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

原始表radius 備份的表為 radius2015

#!/usr/bin/python2.7 # -*- coding: utf-8 -*- #python2.7x #authror: orangleliu #備份radius中的上網(wǎng)記錄表,每一個(gè)月備份一次,原始表中保留一份數(shù)據(jù) #使用同一個(gè)數(shù)據(jù)庫中的一個(gè)不同表名的表備份import time import datetime import logging from datetime import timedeltaimport MySQLdb import MySQLdb.cursorslogging.basicConfig(format='%(asctime)s %(levelname)s - \%(message)s') logger = logging.getLogger('backup') logger.setLevel(logging.DEBUG)#數(shù)據(jù)庫配置 DBPARAMS = {"host":"127.0.0.1","user":"root","password":"","database":"test","charset": "" }#這里使用select into 來備份。數(shù)據(jù)校驗(yàn)對照記錄數(shù),一個(gè)月大概100w條數(shù)據(jù) #radacct2015 #檢查表,檢查重傳,備份。校驗(yàn)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 201505return datetime.datetime.strptime(month, "%Y%m").yeardef 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.monthreturn "{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 = connconfigelse:connname = connname or 'default'self.connconfig = self.__CONFIG.get(connname, 'default')self.conn = Nonedef __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.connexcept Exception, e:print str(e)return Nonedef __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 = connself.cursor = conn.cursor()self.month = monthself.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 Falsedef create_backup_table(self):sql = create_table_sql.format(self.tablename)self.cursor.execute(sql)logger.info(u"開始創(chuàng)建備份表 {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 tableif not self.check_table_exist():self.create_backup_table()if self.check_table_exist() == False:logger.error(u"無法找到備份表 exit")return flag#check datasif self.check_datas_count(self.tablename) > 0:return flagelse:return Truedef 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, Trueelse:return -1, Falsedef backup_handler(self):if self.check_before():logger.info(u"檢查完成,開始備份數(shù)據(jù)")self.backup_datas()logger.info(u"開始備份")num, flag = self.check_after()logger.info(u"本次備份{0} 數(shù)據(jù) {1}條".format(self.month, num))else:logger.info(u"數(shù)據(jù)已經(jīng)有備份,請檢查")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")

本文出自 “orangleliu筆記本” 博客,轉(zhuǎn)載請務(wù)必保留此出處http://blog.csdn.net/orangleliu/article/details/46650875 作者orangleliu 採用署名-非商業(yè)性使用-同樣方式共享協(xié)議

轉(zhuǎn)載于:https://www.cnblogs.com/yfceshi/p/7142672.html

總結(jié)

以上是生活随笔為你收集整理的[Mysql]备份同库中一张表的历史记录 insert into ..select的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一级视频在线免费观看 | 国产精品一区二区电影 | 加勒比色综合 | 亚洲天天视频 | 不卡欧美 | 一女被多男玩喷潮视频 | 最新国产网址 | 国产又猛又粗 | 久久国产精品国语对白 | 少妇又紧又色又爽又刺激 | 91九色蝌蚪porny | 男女激情视频网站 | 亚洲天堂黄 | 丁香花电影高清在线阅读免费 | 999精彩视频 | 日日夜夜狠 | 美女自卫网站 | 禁网站在线观看免费视频 | 国产日产欧美一区二区 | 93看片淫黄大片一级 | 艳妇乳肉亭妇荡乳av | 性欧美长视频 | 久久久久久久久久久久久久久久久久久久 | 一区二区三区视频在线观看免费 | 亚洲熟女乱色一区二区三区久久久 | 二区视频在线 | 欧美乱三级 | 在线观看国产精品入口男同 | 中文日韩在线 | 欧美日韩一区二区区 | 很黄很污的视频网站 | 精品人人人 | 色阁av| 污污网站在线 | 国产av剧情一区二区三区 | 国产凹凸一区二二区 | 黄视频国产 | aa成人| 久一国产 | 四虎伊人 | 欧美亚洲免费 | 美女脱了裤子让男人桶 | 日本五十路在线 | 狠狠狠狠狠狠狠 | 操操操操操操操操操 | 天天碰天天摸 | 久久久久久91 | 亚洲天天视频 | 免费看60分钟黄视频 | 97精品国产露脸对白 | 在线观看视频中文字幕 | 一级黄色视屏 | 偷偷操99 | 午夜不卡av免费 | av第一福利大全导航 | 国产妇女视频 | 驯服少爷漫画免费观看下拉式漫画 | 在线观看h视频 | 欧美69视频 | 久久女人 | 久久久永久久久人妻精品麻豆 | 日批小视频 | 在线观看亚洲视频 | 成年人看的网站 | 日韩一级在线播放 | 午夜激情电影院 | 欧美日韩一区在线 | 亚洲理论视频 | 久久天堂av综合合色蜜桃网 | 久久精品aaaaaa毛片 | 日韩伦乱 | 亚洲激情另类 | 九一爱爱 | 少妇被又大又粗又爽毛片久久黑人 | 蜜桃av一区二区三区 | 国产视频精品免费 | 亚洲男女一区二区三区 | 一级黄色免费 | 国产亚洲av在线 | 涩视频在线观看 | 哪个网站可以看毛片 | 欧美成人精品一区二区综合免费 | 欧美日韩国产亚洲沙发 | 国产在线日本 | 天天射影院 | 新香蕉视频 | 国产毛片91| 欧美第一页 | 欧美xxx性| 日韩精品成人一区二区在线 | 玩偶姐姐在线看 | 成人看片在线观看 | 国产视频播放 | 久久桃色 | 99re视频在线播放 | 免费成人深夜夜国外 | 欧美成人三级在线 | 国产色片 | 精品国语对白 |