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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2025/3/20 数据库 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 同步中历史记录_[Mysql]备份同库中一张表的历史记录 insert into ..select 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#!/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")

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜男人网 | 超能一家人电影免费喜剧在线观看 | 老熟女重囗味hdxx69 | 亚洲麻豆av| 亚洲国产精品久久久久婷婷老年 | 日本在线中文字幕专区 | 国产欧美一区二区三区另类精品 | 狠狠人妻久久久久久综合蜜桃 | 亚洲人成在线观看 | 日韩在线视频你懂的 | 日韩美女视频在线观看 | 天堂综合网久久 | 色多多在线观看 | 国产乱淫片视频 | 人善交videos欧美3d动漫 | 国产精在线 | 免费精品视频在线 | 天天天天天天操 | 午夜精品福利在线 | 欧美黄色图片 | 麻豆精品自拍 | 福利电影一区二区三区 | 中国在线观看片免费 | 波多野结衣一区在线 | 精品少妇一区二区三区在线观看 | 91精品国产一区二区在线观看 | 好男人视频www | 日本一区二区三区免费视频 | 亚洲另类在线观看 | 色大师在线观看 | 亚洲精品久久久久国产 | 国产一区二区三区视频 | 特种兵之深入敌后 | 久久久久久久久久久影院 | 伊人影院综合 | 久久久久亚洲精品系列色欲 | 操她视频在线观看 | 91丨porny丨 | 精品久久在线观看 | 亚洲精品国产欧美 | 波多av在线 | 欧美日韩一级黄色片 | 日本不卡视频一区 | 欧美黄视频在线观看 | 精品毛片在线观看 | av一级黄色片| 91一区二区三区 | 国产精品久久久久久久久久 | 亚洲AV无码成人精品一区 | 性一交一乱一透一a级 | 国产成人精品视频一区二区 | 国产成人一区二区三区影院在线 | 日本美女黄网站 | 国产超碰人人模人人爽人人添 | 深夜av在线| 亚洲天堂偷拍 | 日韩在线观看免费高清 | 日韩中文视频 | а√天堂资源在线 | www四虎com| 男女啪动最猛动态图 | 国产色综合天天综合网 | 久久久久久久久久久99 | 福利一区视频 | 好爽快一点高潮了 | 久久久久久久久久福利 | 精品国产乱码久久久久久蜜柚 | 法国空姐在线观看视频 | 涩涩网站在线看 | 亚洲一区二区不卡在线观看 | 午夜高清视频 | 在线观看一级片 | 黄色三级三级 | 久久国产一区二区三区 | 天天干天天操天天玩 | 亚欧美一区二区三区 | 99久久久国产精品无码性 | 国产熟女高潮一区二区三区 | 午夜一区二区三区四区 | 亚洲污视频 | 1000部国产精品成人观看 | 一级黄色网址 | 日韩av不卡在线播放 | 国产精品国产三级国产专播品爱网 | 中文字幕91视频 | 欧美黄色短视频 | 91视频com| 日韩少妇视频 | 人人妻人人澡人人爽人人dvd | 欧美一级特黄视频 | 国产精品资源在线 | 色777| 欧美丰满少妇 | 簧片av | 亚洲色婷婷久久精品av蜜桃 | 亚洲精品日韩在线观看 | 日韩欧美黄色片 | 午夜精品免费观看 | 久久久1 |