目录
需求
代码
首页 数据库 mysql教程 [Mysql]备份同库中一张表的历史记录insertinto..select_MySQL

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

Jun 01, 2016 pm 12:59 PM
历史 备份

需求

现在有个这么一个需求,mysql中有个表,数据增长的很快,但是呢这个数据有效期也就是1个月,一个月以前的记录不太重要了,但是又不能删除。为了保证这个表的查询速度,需要一个简单的备份表,把数据倒进去。

代码

于是我写了一个小脚本,用来做定时任务,把这个表某段时间的数据备份到备份表中,核心就是个简单的sql。

原始表radius 备份的表为 radius2015

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

<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 Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

鸣潮沉没的历史5个灯塔位置介绍 鸣潮沉没的历史5个灯塔位置介绍 Mar 07, 2024 pm 03:58 PM

您是否正在寻找《鸣潮沉没的历史》任务中的五个灯塔?本篇攻略将为您详尽解读这些待发现的灯塔所在之地。我们期望这能助您快速找到所需灯塔,顺利完成任务!鸣潮沉没的历史5个灯塔位置介绍具体位置一览:1、第一座灯塔:请您前往荒石高地,位于北落野正上方处。2、第二座灯塔:接下来请您赴中曲台地,在东北侧传送点周围便可寻见。3、第三座灯塔:请到虎口山脉东南方位,沿着无明湾即可找到。4、第四座灯塔:请您前往怨鸟泽东南方路端传送点,接近山崖之处。5、第五座灯塔:请至无光之森第一无音区,悬崖边缘即为所寻。

如何备份谷歌浏览器的扩展程序 如何备份谷歌浏览器的扩展程序 Jan 30, 2024 pm 12:36 PM

谷歌浏览器扩展程序如何备份?对于大多数谷歌浏览器用户来说,日常使用时都会安装或多或少的插件,插件的存在可以提升我们的使用体验。当我们重装系统或浏览器时,这些插件却无法保留,重新下载安装又比较麻烦,那么有没有办法备份当前已安装的插件呢?下面就为大家带来操作方法。备份chrome插件的教程方法首先打开谷歌浏览器,点击右上角的菜单,选择更多工具——扩展程序。点击扩展程序页面上方的打包扩展程序。在C:UsersAdministratorAppDataLocalGoogleChromeUserDataDe

如何在Windows 11的文件资源管理器中删除启动备份 如何在Windows 11的文件资源管理器中删除启动备份 Feb 18, 2024 pm 05:40 PM

如果您希望在Windows11的文件资源管理器中隐藏“开始备份”选项,以下是您可以采取的方法。有多种途径可用于在文件资源管理器中禁用或隐藏启动备份选项,我们将简要列出一些方法,帮助您快速完成这项任务。在开始之前,您需要了解这个选项与OneDrive密切相关。一旦您打开某个库文件夹(比如Document、Pictures、Music等),它会立即显示在文件资源管理器的路径中。如何在Windows11的文件资源管理器中删除启动备份要在Windows11的文件资源管理器中删除启动备份,请按照以下方法操

如何查看和管理 Linux 命令历史记录 如何查看和管理 Linux 命令历史记录 Aug 01, 2023 pm 09:17 PM

如何在Linux中查看命令历史记录在Linux中,我们使用history命令来查看所有以前执行的命令的列表。它有一个非常简单的语法:history与历史记录命令配对的一些选项包括:选项描述-c清除当前会话的命令历史记录-w将命令历史记录写入文件-r从历史记录文件重新加载命令历史记录-n限制最近命令的输出数量只需运行history命令即可在Linux终端中查看所有以前执行的命令的列表:除了查看命令历史记录之外,您还可以管理命令历史记录并执行修改先前执行的命令、反向搜索命令历史记录甚至完全删除历史记

hosts文件删了怎么恢复 hosts文件删了怎么恢复 Feb 22, 2024 pm 10:48 PM

标题:hosts文件删除后如何恢复摘要:hosts文件是操作系统中非常重要的一个文件,用于将域名映射到IP地址。如果不小心将hosts文件删除了,可能会导致上网无法访问特定网站或者其他网络问题。本文将介绍如何在Windows和Mac操作系统中恢复被误删的hosts文件。正文:一、Windows操作系统中恢复hosts文件Windows操作系统中的hosts文

ghost怎么备份系统-ghost备份教程 ghost怎么备份系统-ghost备份教程 Mar 06, 2024 pm 04:30 PM

近期有很多小伙伴咨询小编ghost怎么备份系统,接下来就让我们一起学习一下ghost备份系统的方法教程,希望可以帮助到大家。1、运行Ghost后,单击“OK”,如图所示。2、依次单击“Local”→“Partition”→“ToImage”(意为:本地→分区→到镜像文件),如图所示。3、出现选择本地硬盘窗口,单击要备份的分区所在硬盘,再单击“OK”,如图所示。4、出现选择源分区窗口(源分区就是你要备份的那个分区),单击系统所在的分区(通常为1区,一定要弄准),再单击“OK”,如图所示。5、此时弹

如何在 PHP 中使用 MySQL 备份和还原? 如何在 PHP 中使用 MySQL 备份和还原? Jun 03, 2024 pm 12:19 PM

在PHP中备份和还原MySQL数据库可通过以下步骤实现:备份数据库:使用mysqldump命令转储数据库为SQL文件。还原数据库:使用mysql命令从SQL文件还原数据库。

如何安装、卸载、重置Windows服务器备份 如何安装、卸载、重置Windows服务器备份 Mar 06, 2024 am 10:37 AM

WindowsServerBackup是WindowsServer操作系统自带的一个功能,旨在帮助用户保护重要数据和系统配置,并为中小型和企业级企业提供完整的备份和恢复解决方案。只有运行Server2022及更高版本的用户才能使用这一功能。在本文中,我们将介绍如何安装、卸载或重置WindowsServerBackup。如何重置Windows服务器备份如果您的服务器备份遇到问题,备份所需时间过长,或无法访问已存储的文件,那么您可以考虑重新设置WindowsServer备份设置。要重置Windows

See all articles