[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>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









「History of the Sinking Tide」クエストで 5 つの灯台をお探しですか?このガイドでは、これらの灯台が発見されるのを待っている場所について詳しく説明します。これが、必要な灯台をすぐに見つけてミッションを成功裏に完了するのに役立つことを願っています。明潮沈没の歴史 5 つの灯台の場所が紹介され、具体的な場所がリストされています。 1. 最初の灯台: 北洛エの真上にある不毛の石の高地に行ってください。 2. 2 番目の灯台: 次に、北東側のテレポート ポイントの周囲にある Zhongqu Platform に行ってください。 3. 第三灯台:湖口山脈の南東に行き、武明湾沿いにあります。 4. 4 番目の灯台: Angry Birds Zee の南東端、崖の近くにあるテレポート ポイントに行ってください。 5. 5 番目の灯台: 光のない森の最初のサイレント ゾーンに行ってください。崖の端にあります。

Google Chrome拡張機能をバックアップするにはどうすればよいですか?ほとんどの Google Chrome ユーザーは、日々の使用中に多かれ少なかれプラグインをインストールします。プラグインの存在により、使用エクスペリエンスが向上します。システムやブラウザを再インストールすると、これらのプラグインは保持できず、再度ダウンロードしてインストールするのが面倒なので、現在インストールされているプラグインをバックアップする方法はありますか?その方法は次のとおりです。 Chrome プラグインをバックアップするチュートリアルの方法では、まず Google Chrome を開き、右上隅のメニューをクリックして、[その他のツール] - [拡張機能] を選択します。拡張機能ページの上にある「パッケージ拡張機能」をクリックします。 C:UsersAdministratorAppDataLocalGoogleChromeUserDataDe

PHP で MySQL データベースをバックアップおよび復元するには、次の手順を実行します。 データベースをバックアップします。 mysqldump コマンドを使用して、データベースを SQL ファイルにダンプします。データベースの復元: mysql コマンドを使用して、SQL ファイルからデータベースを復元します。

Windows 11 のファイル エクスプローラーで [バックアップの開始] オプションを非表示にしたい場合は、次の方法を実行できます。ファイル エクスプローラーで起動バックアップ オプションを無効または非表示にする方法はいくつかあります。このタスクを迅速に実行するのに役立ついくつかの方法を簡単にリストします。始める前に、このオプションが OneDrive と密接に関係していることを理解する必要があります。ライブラリ フォルダー (ドキュメント、画像、音楽など) を開くと、ファイル エクスプローラーのパスにすぐに表示されます。 Windows 11 のファイル エクスプローラーで起動バックアップを削除する方法 Windows 11 のファイル エクスプローラーで起動バックアップを削除するには、次の手順に従います。

タイトル: 削除後に hosts ファイルを復元する方法 概要: hosts ファイルはオペレーティング システムの非常に重要なファイルであり、ドメイン名を IP アドレスにマップするために使用されます。誤って hosts ファイルを削除すると、特定の Web サイトにアクセスできなくなったり、その他のネットワークの問題が発生したりする可能性があります。この記事では、Windows および Mac オペレーティング システムで誤って削除したホスト ファイルを復元する方法を紹介します。テキスト: 1. Windows オペレーティング システムでホスト ファイルを復元する Windows オペレーティング システムでのホスト ファイル

Linux でコマンド履歴を表示する方法 Linux では、history コマンドを使用して、以前に実行されたすべてのコマンドのリストを表示します。構文は非常に単純です:history History コマンドと組み合わせるオプションには次のものがあります: オプションの説明 -c 現在のセッションのコマンド履歴をクリアします -w コマンド履歴をファイルに書き込みます -r 履歴ファイルからコマンド履歴を再ロードします - n 最近のコマンドの出力数を制限するhistory コマンドを実行するだけで、Linux ターミナルで以前に実行されたすべてのコマンドのリストが表示されます。コマンド履歴の表示に加えて、コマンド履歴を管理したり、以前に実行したコマンドの変更を実行したり、逆に実行したりすることもできます。コマンド履歴を検索したり、履歴を完全に削除したりすることもできます

WindowsServerBackup は、WindowsServer オペレーティング システムに付属する機能で、ユーザーが重要なデータとシステム構成を保護し、中小企業、エンタープライズ レベルの企業に完全なバックアップおよび回復ソリューションを提供できるように設計されています。この機能を使用できるのは、Server2022 以降を実行しているユーザーのみです。この記事では、WindowsServerBackup のインストール、アンインストール、またはリセットの方法を説明します。 Windows Server バックアップをリセットする方法 サーバー バックアップで問題が発生したり、バックアップに時間がかかりすぎたり、保存されているファイルにアクセスできない場合は、Windows Server バックアップ設定をリセットすることを検討してください。 Windowsをリセットするには

最近、多くの友人が編集者に Ghost でシステムをバックアップする方法を尋ねてきました。次に、Ghost でシステムをバックアップする方法のチュートリアルを学びましょう。皆さんのお役に立てれば幸いです。 1. Ghost を実行した後、図に示すように [OK] をクリックします。 2. 図に示すように、「ローカル」→「パーティション」→「ToImage」(ローカル→パーティション→イメージファイルへの意味)をクリックします。 3. 図に示すように、[ローカル ハードディスクの選択] ウィンドウが表示され、バックアップするパーティションが存在するハードディスクをクリックし、[OK] をクリックします。 4. [ソース パーティションの選択] ウィンドウが表示されます (ソース パーティションはバックアップするパーティションです)。システムが配置されているパーティション (通常はゾーン 1、必ず正しく指定してください) をクリックし、[OK] をクリックします。図に示すように。 5. この時点でプレイする
