目次
需求
代码
ホームページ データベース mysql チュートリアル [Mysql]备份同库中一张表的历史记录insertinto..select_MySQL

[Mysql]备份同库中一张表的历史记录insertinto..select_MySQL

Jun 01, 2016 pm 12:59 PM
歴史 バックアップ

需求

现在有个这么一个需求,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=&#39;%(asctime)s %(levelname)s - \
    %(message)s&#39;)
logger = logging.getLogger(&#39;backup&#39;)
logger.setLevel(logging.DEBUG)

#数据库配置
DBPARAMS = {
    "host":"127.0.0.1",
    "user":"root",
    "password":"",
    "database":"test",
    "charset": ""
}

#这里使用select into 来备份,数据校验对比记录数,一个月大概100w条数据
#radacct2015
#检查表,检查重传,备份,校验

create_table_sql = &#39;&#39;&#39;
CREATE TABLE `{0}` (
  `radacctid` bigint(21) NOT NULL AUTO_INCREMENT,
  `acctsessionid` varchar(64) NOT NULL DEFAULT &#39;&#39;,
  `acctuniqueid` varchar(32) NOT NULL DEFAULT &#39;&#39;,
  `username` varchar(64) NOT NULL DEFAULT &#39;&#39;,
  `groupname` varchar(64) NOT NULL DEFAULT &#39;&#39;,
  `realm` varchar(64) DEFAULT &#39;&#39;,
  `nasipaddress` varchar(15) NOT NULL DEFAULT &#39;&#39;,
  `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 &#39;&#39;,
  `callingstationid` varchar(50) NOT NULL DEFAULT &#39;&#39;,
  `acctterminatecause` varchar(32) NOT NULL DEFAULT &#39;&#39;,
  `servicetype` varchar(32) DEFAULT NULL,
  `framedprotocol` varchar(32) DEFAULT NULL,
  `framedipaddress` varchar(15) NOT NULL DEFAULT &#39;&#39;,
  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
&#39;&#39;&#39;


back_sql = &#39;&#39;&#39;
INSERT INTO {0}
SELECT *
FROM {1}
WHERE acctstarttime < UNIX_TIMESTAMP(
   STR_TO_DATE(&#39;{2}&#39;, &#39;%Y-%m-%d&#39;)
) AND acctstarttime >= UNIX_TIMESTAMP(
   STR_TO_DATE(&#39;{3}&#39;, &#39;%Y-%m-%d&#39;)
)&#39;&#39;&#39;


count_sql = """
SELECT count(*) FROM {0} WHERE 1=1 AND
acctstarttime < UNIX_TIMESTAMP(
   STR_TO_DATE(&#39;{1}&#39;, &#39;%Y-%m-%d&#39;)
) AND acctstarttime >= UNIX_TIMESTAMP(
   STR_TO_DATE(&#39;{2}&#39;, &#39;%Y-%m-%d&#39;)
)
"""


#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 = {
        &#39;default&#39;: {
            &#39;host&#39;: "",
            &#39;user&#39;: "",
            &#39;database&#39;: "",
            &#39;password&#39;: "",
            &#39;charset&#39;: "",
        }
    }

    def __init__(self, connname=&#39;&#39;, connconfig={}):
        if connconfig:
            self.connconfig = connconfig
        else:
            connname = connname or &#39;default&#39;
            self.connconfig = self.__CONFIG.get(connname, &#39;default&#39;)
        self.conn = None

    def __enter__(self):
        try:
            self.conn = MySQLdb.connect(
                user=self.connconfig[&#39;user&#39;],
                db=self.connconfig[&#39;database&#39;],
                passwd=self.connconfig[&#39;password&#39;],
                host=self.connconfig[&#39;host&#39;],
                use_unicode=True,
                charset=self.connconfig[&#39;charset&#39;] 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 &#39;%s: %s&#39; % (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 &#39;{0}&#39;".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>
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

鳴潮沈没の歴史における 5 つの灯台の位置の紹介 鳴潮沈没の歴史における 5 つの灯台の位置の紹介 Mar 07, 2024 pm 03:58 PM

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

Google Chrome拡張機能をバックアップする方法 Google Chrome拡張機能をバックアップする方法 Jan 30, 2024 pm 12:36 PM

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

PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? Jun 03, 2024 pm 12:19 PM

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

Windows 11のファイルエクスプローラーで起動バックアップを削除する方法 Windows 11のファイルエクスプローラーで起動バックアップを削除する方法 Feb 18, 2024 pm 05:40 PM

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

削除されたホストファイルを復元する方法 削除されたホストファイルを復元する方法 Feb 22, 2024 pm 10:48 PM

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

Linux コマンド履歴を表示および管理する方法 Linux コマンド履歴を表示および管理する方法 Aug 01, 2023 pm 09:17 PM

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

Windows サーバーのバックアップをインストール、アンインストール、リセットする方法 Windows サーバーのバックアップをインストール、アンインストール、リセットする方法 Mar 06, 2024 am 10:37 AM

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

ゴースト-ゴーストバックアップを使用してシステムをバックアップする方法のチュートリアル ゴースト-ゴーストバックアップを使用してシステムをバックアップする方法のチュートリアル Mar 06, 2024 pm 04:30 PM

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

See all articles