[Mysql]备份同库中一张表的历史记录insertinto..select_MySQL
需求
现在有个这么一个需求,mysql中有个表,数据增长的很快,但是呢这个数据有效期也就是1个月,一个月以前的记录不太重要了,但是又不能删除。为了保证这个表的查询速度,需要一个简单的备份表,把数据倒进去。
代码
于是我写了一个小脚本,用来做定时任务,把这个表某段时间的数据备份到备份表中,核心就是个简单的sql。
原始表radius 备份的表为 radius2015
<code class="hljs python">#!/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")</code>

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Are you looking for the five lighthouses in the History of the Sinking Tide quest? This guide will give you a detailed explanation of where these lighthouses are waiting to be discovered. We hope this will help you find the lighthouse you need quickly and complete your mission successfully! The history of the sinking of the Mingtide Five lighthouse locations are introduced and the specific locations are listed: 1. The first lighthouse: Please go to the barren stone highland, located directly above Beiluoye. 2. The second lighthouse: Next, please go to the Zhongqu Platform, which can be found around the teleportation point on the northeast side. 3. The third lighthouse: Please go to the southeast of Hukou Mountains and find it along Wuming Bay. 4. The fourth lighthouse: Please go to the teleportation point at the southeastern end of the Angry Birds Zee, near the cliff. 5. The fifth lighthouse: Please go to the first silent zone of the Lightless Forest, and you will find it on the edge of the cliff.

How to backup Google Chrome extension? For most Google Chrome users, more or less plug-ins are installed during daily use. The existence of plug-ins can improve our usage experience. When we reinstall the system or browser, these plug-ins cannot be retained, and it is troublesome to download and install them again. So is there a way to back up the currently installed plug-ins? Here’s how to do it. The tutorial method of backing up chrome plug-ins first opens Google Chrome, click the menu in the upper right corner, and select More Tools - Extensions. Click Package extension above the extensions page. In C:UsersAdministratorAppDataLocalGoogleChromeUserDataDe

Backing up and restoring a MySQL database in PHP can be achieved by following these steps: Back up the database: Use the mysqldump command to dump the database into a SQL file. Restore database: Use the mysql command to restore the database from SQL files.

If you wish to hide the "Start Backup" option in Windows 11's File Explorer, here's what you can do. There are several ways to disable or hide the startup backup option in File Explorer, and we'll briefly list some methods to help you accomplish this task quickly. Before you get started, you need to understand that this option is closely tied to OneDrive. Once you open a library folder (such as Document, Pictures, Music, etc.), it will immediately appear in the file explorer's path. How to delete startup backup in Windows 11’s File Explorer To delete startup backup in Windows 11’s File Explorer, follow the steps below

Title: How to restore the hosts file after deletion Summary: The hosts file is a very important file in the operating system and is used to map domain names to IP addresses. If you accidentally delete the hosts file, you may be unable to access certain websites or have other network problems. This article will introduce how to recover accidentally deleted hosts file in Windows and Mac operating systems. Text: 1. Restore hosts file in Windows operating system. Hosts file in Windows operating system

How to View Command History in Linux In Linux, we use the history command to view the list of all previously executed commands. It has a very simple syntax: history Some options for pairing with the history command include: Option description -c clears the command history for the current session -w writes the command history to a file -r reloads the command history from the history file -n Limit the number of output of recent commands Simply run the history command to see a list of all previously executed commands in a Linux terminal: In addition to viewing command history, you can also manage command history and perform modifications to previously executed commands , reverse search command history or even delete history completely

WindowsServerBackup is a function that comes with the WindowsServer operating system, designed to help users protect important data and system configurations, and provide complete backup and recovery solutions for small, medium and enterprise-level enterprises. Only users running Server2022 and higher can use this feature. In this article, we will explain how to install, uninstall or reset WindowsServerBackup. How to Reset Windows Server Backup If you are experiencing problems with your server backup, the backup is taking too long, or you are unable to access stored files, then you may consider resetting your Windows Server backup settings. To reset Windows

Recently, many friends have asked the editor how to back up the system with ghost. Next, let us learn the tutorial on how to back up the system with ghost. I hope it can help everyone. 1. After running Ghost, click "OK", as shown in the figure. 2. Click "Local" → "Partition" → "ToImage" (meaning: local → partition → to image file), as shown in the figure. 3. The Select Local Hard Disk window appears, click the hard disk where the partition to be backed up is located, and then click "OK", as shown in the figure. 4. The Select Source Partition window appears (the source partition is the partition you want to back up), click on the partition where the system is located (usually Zone 1, be sure to get it right), and then click "OK", as shown in the figure. 5. Play at this time
