[{"data":1,"prerenderedAt":66},["ShallowReactive",2],{"article-63":3},{"code":4,"msg":5,"data":6,"count":14},200,"查询成功",{"id":7,"title":8,"keywords":9,"description":10,"category_id":11,"content":12,"body_html":13,"thumb_up":14,"clicks":15,"sort":14,"remark":16,"status":17,"is_open":17,"is_deleted":14,"is_top":14,"is_recommend":14,"create_time":18,"update_time":19,"image_id":20,"url":13,"member_id":14,"cate_name":21,"prev":22,"next":25,"tags":28,"words":37,"read_time":38,"comments":14,"cover":39,"relevant":40},63,"Python与mysqldump的数据库备份","python,Mysql","mysqldump是备份MySQL数据库的一种好工具。它相对于用phpmyadmin等备份工具更加快速，又避免受php.ini等的限制，在windows系统下还可以结合计划任务实现定时远程备份数据库",5,"\n##### 准备\n\n所需的库：`os,zipfile,re,datetime`\n\n##### 功能\n\n1、根据配置文件生成数据库备份压缩文件\n\n2、根据配置的过期时间（天）清理过期压缩文件\n\n##### 介绍\n\nmysqldump是备份MySQL数据库的一种好工具。它相对于用phpmyadmin等备份工具更加快速，又避免受php.ini等的限制，在windows系统下还可以结合计划任务实现定时远程备份数据库。\n\nmysqldump命令的一些用法：\n\n**1、将整个数据库以及建表文件导出到sql文件中**\n\n```bash\nmysqldump -uroot -proot database1 > database1.sql\n```\n\n**2.将sql文件的数据导入,不再是mysqldump,而是mysql**\n\n```bash\nmysql -uroot -proot database2 \u003C database1.sql\n```\n\n**3.将数据库中的某个表的数据及结构导出到sql文件中**\n\n```bash\nmysqldump -uroot -proot database1 tablename > table1.sql\n```\n\n**4..将sql文件的数据导入,不再是mysqldump,而是mysql**\n\n```bash\nmysql -uroot -proot database1 \u003C database1.sql\n```\n\n**5.mysql 数据迁移命令 备份database库table表中id大于22的数据，SQL如下**\n\n```bash\nmysqldump -utest -ptest database table --default-character-set=utf8 -t --where=\"id>22\" >c:\\test.sql\n```\n\n##### 代码实现\n\n```python\n#!\u002Fusr\u002Fbin\u002Fenv python\n# -*- encoding: utf-8 -*-\n'''\n@File    :   backupMySQL.py\n@Time    :   2019\u002F10\u002F12 14:48:49\n@Author  :   MrYong \n@Version :   1.0\n@Contact :   m.yong@foxmail.com\n@License :   (C)Copyright 2018-2019, MR YONG\n@Desc    :   None\n'''\n\n# here put the import lib\nimport os,zipfile,re\nfrom datetime import date, datetime\nclass BackupMySQL(object):\n\n    def __init__(self, options):\n        '''\n        初始化配置信息，mysql链接信息，备份文件保存信息\n        '''\n        self.host = options['host'] if \"host\" in options.keys() else 'localhost'\n        if 'db_name' not in options.keys():\n            print('请设置数据库名称')\n            return\n        self.db_name = options['db_name']\n\n        if 'db_user_name' not in options.keys():\n            print('请设置数据库用户名')\n            return\n        self.db_user_name = options['db_user_name']\n\n        if 'db_user_pwd' not in options.keys():\n            print('请设置数据库密码')\n            return\n        self.db_user_pwd = options['db_user_pwd']\n        self.port = options['port'] if 'port' in options.keys() else 3306\n        self.mysql_dump_exe = options['mysql_dump_exe'] if 'mysql_dump_exe' in options.keys() else '\"D:\\\\MySQL\\\\MySQL Server 5.7\\\\bin\\\\mysqldump.exe\"'\n        \n        self.backup_dir = options['backup_dir'] if 'backup_dir' in options.keys() else 'D:\\\\dataBaseBackup'\n\n        self.max_clear_days = options['max_clear_days'] if 'max_clear_days' in options.keys() else 15\n        \n        self.init()\n\n    def init(self):\n        '''\n        备份目录创建\n        文件名称生成\n        '''\n        #备份目录不存在创建\n        if not os.path.exists(self.backup_dir):\n            os.makedirs(self.backup_dir)\n        \n        #生成备份文件名称\n        today_date = date.today().strftime('%Y-%m-%d')\n        self.file_name = today_date + '.sql'\n        self.zip_file_name = today_date + '.zip'\n    \n    def search_file(self, pattern):\n        '''\n        列出备份文件目录\n        '''\n        file_lsit = []\n        with os.scandir(self.backup_dir) as files:\n            for file in files:\n                if not file.name.startswith('.') and file.is_file():\n                    if re.fullmatch(pattern, file.name):\n                        file_lsit.append(file.name)\n        return file_lsit\n    \n    def clear_file(self):\n        '''\n        清理max_clear_days的过期文件\n        '''\n        files = self.search_file(r'\\d{4}-\\d{2}-\\d{2}.zip')\n    \n        for file in files:\n            file_date = file.split('.')[0]\n            time = datetime.strptime(file_date, '%Y-%m-%d')\n            days = (datetime.today() - time).days\n            if days > self.max_clear_days:\n                print('正在删除文件：%s'%file)\n                os.remove(self.backup_dir + '\\\\' + file)\n        print('清理完成')\n\n    def run(self):\n        '''\n        数据库备份执行\n        '''\n        #切换到备份目录\n        os.chdir(self.backup_dir)\n        \n        #生成备份数据库命令\n        run_backup = '%s --host=%s --user=%s --password=%s --protocol=tcp --port=%s --default-character-set=utf8 %s > %s'%(\n            self.mysql_dump_exe, \n            self.host, \n            self.db_user_name, \n            self.db_user_pwd, \n            self.port,\n            self.db_name, \n            self.file_name\n        )\n        print(run_backup)\n        os.system(run_backup)\n\n        self.save_file()\n    \n    def save_file(self):\n        '''\n        保存为压缩文件\n        '''    \n        if os.path.exists(self.file_name):\n            with zipfile.ZipFile(self.zip_file_name, 'w', zipfile.ZIP_DEFLATED) as zp:\n                zp.write(self.file_name)\n\n        os.remove(self.file_name)\n        \n        print('备份数据库成功')\n\nif __name__ == \"__main__\":\n    options = {\n        'host':'127.0.0.1',\n        'db_name' :'test',\n        'db_user_name' :'root',\n        'db_user_pwd' :'root',\n        'max_clear_days':30,\n    }\n\n    backup = BackupMySQL(options)\n    #执行备份\n    backup.run()\n    #执行清理\n    #backup.clear_file()\n```",null,0,660,"",1,"2019-10-14 15:35:33","2026-04-19 15:11:55",136,"Python",{"id":23,"title":24},62,"内网使用Composer",{"id":26,"title":27},64,"Git提交历史查询功能介绍以及使用",[29,31,34],{"id":30,"name":21},27,{"id":32,"name":33},26,"MySQL",{"id":35,"name":36},28,"数据库",2550,6,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002F5a\u002Fb205f7e4e0e5c670fba97db6ab7ceb.jpg",[41,46,51,56,61],{"id":42,"title":43,"create_time":44,"description":45},95,"Django启用memcache缓存","2020-10-23 11:17:27","在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面.当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力.",{"id":47,"title":48,"create_time":49,"description":50},91,"用Python实现编程语言 20 年的动态排行榜","2020-06-24 16:06:54","爬取一下，自2001年5月至今，TIOBE 编程语言排行榜上编程语言的变化情况，看一下在接近20年的时间里，编程语言的热度是如何变化的。\r\n",{"id":52,"title":53,"create_time":54,"description":55},100,"re正则表达式","2021-07-10 18:09:52","正则表达式是一个特殊的字符序列，它能帮助你方便的检查一个字符串是否与某种模式匹配，本文罗列re正则表达式中，常用的匹配符号。",{"id":57,"title":58,"create_time":59,"description":60},34,"Python基础整理之列表常见操作","2019-02-10 16:53:55","列表是最常用的Python数据类型，它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型",{"id":62,"title":63,"create_time":64,"description":65},73,"城市天气爬去并绘制图表","2020-01-03 16:20:15","以爬去深圳城市七天天气为例，`BeautifulSoup`爬去天气数据，`echart`绘制最高气温与最低气温折线图。",1783431662955]