検索
ホームページバックエンド開発Python チュートリアルPython を使用して MYSQL データベースをバックアップする

仕事の必要で、会社の MYSQL データベースをバックアップしました。私は Python を学び始めたばかりなので、一連の簡単な Python 教育ビデオを見て、単純に Python のクラス、関数、ビルドに興味があることを表明しました。関数、プライベート変数、グローバル変数など、それらをどのように使用するか、いつ使用するかなどがわかりません。ここに記録するだけです。また、Python を渡してアドバイスを与えることも歓迎します。

私が知っているいくつかの問題:

1. スクリプトでは、mysql 設定ファイル内のすべての動作が key=value 形式である必要があり、冗長なコメントがあってはなりません。そうでない場合、ConfigParser モジュールはエラーを発生します。設定ファイルを解析するのに、ConfigParser に呼び出せるフォールトトレラントなメソッドがあるのか​​と疑問に思い、フォールトトレラントな処理を書く時間がないので、代わりに、私のファイルを整理することで解決しました。 ini 設定ファイルを編集して、ConfigParser の要件を満たすようにします。私が使用するmysql設定ファイルは後ほど添付します。

2. クラスプライベートメンバー変数の広範な使用。Python 変数、クラスメソッドなどをいつプライベート化する必要があるのか​​、そしてクラスプライベートメンバー変数がインポートまたは継承されるときの違いだけがわからないためです。他のスクリプトでは非表示になります。

3. 多くのファイル操作と値の転送操作が存在します。現時点では、正しい形式で値を渡すことに問題がないことを確認するだけであり、冗長なフォールト トレランス処理は行われません。 4. 大量の文字列のスプライシングが行われています。システム コマンドを呼び出して多くのパラメータを渡す必要があるため、運用とメンテナンス関連のスクリプトを作成するのは初めてです。サブプロセス モジュールがわかりません。他の人が操作スクリプトやメンテナンス スクリプトをどのように作成するかはわからないので、私はそのまま Spliced で作成します。

5. その他の未知のバグ、未発見の論理エラーなど。

環境:

- サーバー: Dell PowerEdge T110

- OS: CentOS 6.3_x86_64

- PythonVersion: 2.7.3

- MysqlVersion : 5.5.28 linux x86_64

Mys qlBackupScript.py

#!/usr/bin/env python
# coding: utf8
# script MysqlBackupScript
# by Becareful
# version v1.0
  
"""
This scripts provides auto backup mysql(version == 5.5.x) database .
"""
  
import os
import sys
import datetime         #用于生成备份文件的日期
import linecache        #用于读取文件的指定行
import ConfigParser     #解析mysql配置文件
  
  
class DatabaseArgs(object):
    """
  
    """
  
    __MYSQL_BASE_DIR = r'/usr/local/mysql'            #mysql安装目录
    __MYSQL_BIN_DIR = __MYSQL_BASE_DIR + '/bin'       #mysql二进制目录
    __MYSQL_CONFIG_FILE = r'/usr/local/mysql/my.cnf'  #mysql配置文件
  
    __ONEDAY = datetime.timedelta(days=1)             #一天的时长,用于计算下面的前一天和后一天日期
    __TODAY = datetime.date.today()      #当天日期格式为 YYYY-MM-DD
    __YESTERDAY = __TODAY - __ONEDAY                  #计算昨天日期
    __TOMORROW = __TODAY + __ONEDAY                   #计算明天日期
    __WEEKDAY = __TODAY.strftime('%w')                #计算当天是一星期的星期几
  
    __MYSQL_DUMP_ARGS = {                             #用一个字典存储mysqldump 命令备份数据库的参数
        'MYISAM': ' -v -E -e -R --triggers -F  -n --opt --master-data=2 --hex-blob -B ',
        'INNODB': ' -v -E -e -R --triggers -F --single-transaction -n --opt --master-data=2 --hex-blob -B '
    }
  
    __DUMP_COMMAND = __MYSQL_BIN_DIR + '/mysqldump'   #mysqldump 命令的 路径 用于dump mysql数据
    __FLUSH_LOG_COMMAND = __MYSQL_BIN_DIR + '/mysqladmin'    #mysqladmin 命令的路径 ,用于执行 flush-logs 生成每天增量binlog
  
    __BACKUP_DIR = r'/backup/'                        # 指定备份文件存放的目录
  
    __PROJECTNAME = 'example'                         # 指定需要备份的数据库对应的项目名,将来会生成 projectname-YYYY-MM-DD.sql 等文件
    __DATABASE_LIST = []                              # 指定需要备份的数据库名,可以是多个,使用列表
    __HOST = 'localhost'
    __PORT = 3306
    __USERNAME = 'root'
    __PASSWORD = ''
    __LOGINARGS = ''                                  # 如果在localhost登陆,需要密码,可以设定登陆的参数,具体在下面有说明
    __LOGFILE = __BACKUP_DIR + '/backup.logs'
  
    def __init__(self, baseDir=__MYSQL_BASE_DIR, backDir=__BACKUP_DIR, engine='MYISAM', projectName=__PROJECTNAME,
                 dbList=__DATABASE_LIST, host=__HOST, port=__PORT, user=__USERNAME, passwd=__PASSWORD):
  
        """
            实例化对象时传入的参数,如不传入默认使用类的私有成员变量作为默认值
    :param baseDir:   
    :param backDir:
    :param engine:
    :param projectName:
    :param dbList:
    :param host:
    :param port:
    :param user:
    :param passwd:
    """
        self.__MYSQL_BASE_DIR = baseDir
        self.__BACKUP_DIR = backDir
        self.__PROJECTNAME = projectName
        self.__DATABASE_LIST = dbList
        self.__HOST = host
        self.__PORT = port
        self.__USERNAME = user
        self.__PASSWORD = passwd
        self.__ENGINE = self.__MYSQL_DUMP_ARGS[engine]
        #下面定义了如需登陆时,参数 其实就是生成 这样的格式  “-hlocalhost -uroot --password=‘xxxx’”
        self.__LOGINARGS = " -h" + self.__HOST + " -P" + str(
            self.__PORT) + " -u" + self.__USERNAME + " --password='" + self.__PASSWORD + "'"
        self.checkDatabaseArgs()   #调用检查函数
  
    def __getconfig(self, cnf=__MYSQL_CONFIG_FILE, item=None):  # 解析mysql配置文件的小函数,简单封装了下,传入一个值作为my.cnf的key去查找对应的value
  
        __mycnf = ConfigParser.ConfigParser()
        __mycnf.read(cnf)
        try:
            return __mycnf.get("mysqld", item)
        except BaseException, e:
            sys.stderr.write(str(e))
            sys.exit(1)
  
    def __getBinlogPath(self): #  取每天需要增量备份的binlog日志的绝对路径,从mysql的binlog.index文件取倒数第二行
  
        __BINLOG_INDEX = self.__getconfig(item='log-bin') + '.index'
  
        if not os.path.isfile(__BINLOG_INDEX):
            sys.stderr.write('BINLOG INDEX FILE: [' + __BINLOG_INDEX + ' ] NOT FOUND! \n')
            sys.exit(1)
        else:
            try:
                __BINLOG_PATH = linecache.getline(__BINLOG_INDEX, len(open(__BINLOG_INDEX,'r').readlines()) - 1)
                linecache.clearcache()
            except BaseException, e:
                sys.stderr.write(str(e))
                sys.exit(1)
            return __BINLOG_PATH.strip()
  
    def flushDatabaseBinlog(self):  # 调用此函数,将会执行  mysqladmin flush-logs ,刷新binlog日志
        return os.popen(self.__FLUSH_LOG_COMMAND + self.__LOGINARGS + ' flush-logs')
  
    def dumpDatabaseSQL(self):  #|通过mysqladmin 对指定数据库进行全备
        if not os.path.isfile(self.__BACKUP_DIR + '/' + self.__PROJECTNAME + '/' + str(self.__YESTERDAY) + '-' + self.__PROJECTNAME + '.sql'):
            return os.popen(self.__DUMP_COMMAND + self.__LOGINARGS + self.__ENGINE + ' '.join(
                self.__DATABASE_LIST) + ' >> ' + self.__BACKUP_DIR + '/' + self.__PROJECTNAME + '/' +str(
                self.__YESTERDAY) + '-' + self.__PROJECTNAME + '.sql')
        else:
            sys.stderr.write('Backup File [' + str(self.__YESTERDAY) + '-' + self.__PROJECTNAME +'.sql]  already exists.\n')
  
  
  
    def dumpDatabaseBinlog(self):#通过copy2() 将需要备份的binlog日志复制到指定备份目录
  
        if not os.path.isfile(self.__BACKUP_DIR + '/' + self.__PROJECTNAME + '/' +str(self.__YESTERDAY) + '-' + os.path.split(self.__getBinlogPath())[1]):
            from shutil import copy2
            try:
                copy2(self.__getBinlogPath(), self.__BACKUP_DIR + '/' + self.__PROJECTNAME + '/' +str(self.__YESTERDAY) + '-' + os.path.split(self.__getBinlogPath())[1])
            except BaseException, e:
                sys.stderr.write(str(e))
        else:
            sys.stderr.write('Binlog File [' + str(self.__YESTERDAY) + '-' +os.path.split(self.__getBinlogPath())[1] + '] already exists\n' )
  
  
    def checkDatabaseArgs(self):  #对一些必要条件进行检查
        __rv = 0
  
        if not os.path.isdir(self.__MYSQL_BASE_DIR):  #检查指定的mysql安装目录是否存在
            sys.stderr.write('MYSQL BASE DIR: [ ' + self.__MYSQL_BASE_DIR + ' ] NOT FOUND\n')
            __rv += 1
  
        if not os.path.isdir(self.__BACKUP_DIR):   #检查指定的备份目录是否存在,如不存在自动创建
            sys.stderr.write('BACKUP DIR: [ ' + self.__BACKUP_DIR + '/' + self.__PROJECTNAME +  ' ] NOT FOUND ,AUTO CREATED\n')
            os.makedirs(self.__BACKUP_DIR + '/' + self.__PROJECTNAME)
  
        if not os.path.isfile(self.__MYSQL_CONFIG_FILE): #检查mysql配置文件是否存在
            sys.stderr.write('MYSQL CONFIG FILE: [' + self.__MYSQL_CONFIG_FILE + ' ] NOT FOUND\n')
            __rv += 1
  
        if not os.path.isfile(self.__DUMP_COMMAND):  #检查备份数据库时使用的mysqldump命令是否存在
            sys.stderr.write('MYSQL DUMP COMMAND: [' + self.__DUMP_COMMAND + ' ] NOT FOUND\n')
            __rv += 1
  
        if not os.path.isfile(self.__FLUSH_LOG_COMMAND): #检查刷新mysql binlog日志使用的mysqladmin命令是否存在
            sys.stderr.write('MYSQL FLUSH LOG COMMAND: [' + self.__DUMP_COMMAND + ' ] NOT FOUND\n')
            __rv += 1
  
        if not self.__DATABASE_LIST:  #检查需要备份的数据库列表是否存在
            sys.stderr.write('Database List is None \n')
            __rv += 1
  
        if __rv:   # 判断返回值,由于上述任何一步检查失败,都会导致 __rv 值 +1 ,只要最后__rv != 0就直接退出了。
            sys.exit(1)
  
  
def crontab():  # 使用字典,来进行相关参数传递,并实例化对象,调用相关方法进行操作
  
    zabbix = {
        'baseDir': '/usr/local/mysql/',
        'backDir': '/backup/',
        'projectName': 'Monitor',
        'dbList': ['zabbix'],
        'host': 'localhost',
        'port': 3306,
        'user': 'root',
        'passwd': 'xxxxxxx'
    }
  
    monitor = DatabaseArgs(**zabbix)
    monitor.dumpDatabaseSQL()
    monitor.dumpDatabaseBinlog()
    monitor.flushDatabaseBinlog()
  
if __name__ == '__main__':
    crontab()

my.cnf

[client]
port                            = 3306
socket                          = /mysql/var/db.socket
  
[mysqld]
socket                          = /mysql/var/db.socket
datadir                         = /mysql/db/
skip-external-locking           = 1
skip-innodb                     = 0
key_buffer_size                 = 256M
max_allowed_packet              = 10M
table_open_cache                = 2048
sort_buffer_size                = 4M
read_buffer_size                = 4M
read_rnd_buffer_size            = 8M
myisam_sort_buffer_size         = 64M
myisam_max_sort_file_size       = 1G
myisam_repair_threads           = 1
myisam_recover                  = DEFAULT
thread_cache_size               = 32
query_cache_size                = 32M
query_cache_min_res_unit        = 2k
bulk_insert_buffer_size         = 64M
tmp_table_size                  = 128M
thread_stack                    = 192K
skip-name-resolve               = 1
max_connections                 = 65500
default-storage-engine          = myisam
federated                       = 0
server-id                       = 1
slave-skip-errors               = all
#log                            = /var/log/sql_query.log
slow-query-log                  = 1
slow-query-log-file             = /mysql/log/sql_query_slow.log
long-query-time                 = 5
log-queries-not-using-indexes   = 1
log-slow-admin-statements       = 1
log-bin                         = /mysql/var/log/binlog/bin-log
log-error                       = /mysql/var/log/mysql.err
master-info-file                = /mysql/var/log/master.info
relay-log                       = /mysql/var/log/relay-bin/relay-bin
relay-log-index                 = /mysql/var/log/relay-bin/relay-bin.index
relay-log-info-file             = /mysql/var/log/relay-bin/relay-bin.info
binlog_cache_size               = 8M
binlog_format                   = MIXED
max_binlog_cache_size           = 20M
max_binlog_size                 = 1G
binlog-ignore-db                = mysql
binlog-ignore-db                = performance_schema
binlog-ignore-db                = information_schema
replicate-ignore-db             = mysql
replicate-ignore-db             = performance_schema
replicate-ignore-db             = information_schema
  
innodb_data_home_dir            = /mysql/ibdata/
innodb_data_file_path           = ibdata:156M:autoextend
innodb_log_group_home_dir       = /mysql/ibdata/
log-slave-updates               = 0
back_log                        = 512
transaction_isolation           = READ-COMMITTED
max_heap_table_size             = 246M
interactive_timeout             = 120
wait_timeout                    = 120
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size         = 512M
innodb_file_io_threads          = 4
innodb_thread_concurrency       = 8
innodb_flush_log_at_trx_commit  = 2
innodb_log_buffer_size          = 16M
innodb_log_file_size            = 128M
innodb_log_files_in_group       = 3
innodb_max_dirty_pages_pct      = 90
innodb_lock_wait_timeout        = 120
innodb_file_per_table           = 1
innodb_open_file                = 327500
open_files_limit                = 327500
  
[mysqldump]
quick                           = 1
max_allowed_packet              = 50M
  
[mysql]
auto-rehash                     = 1
socket                          = /mysql/var/db.socket
safe-updates                    = 0
  
[myisamchk]
key_buffer_size                 = 256M
sort_buffer_size                = 256M
read_buffer                     = 2M
write_buffer                    = 2M
  
[mysqlhotcopy]
interactive-timeout             = 100

最終的に生成されたバックアップディレクトリ構造は次のようになります

[root@zabbix backup]# find ./
./
./Monitor
./Monitor/2013-03-16-bin-log.000008
./Monitor/2013-03-14-bin-log.000006
./Monitor/2013-03-16-Monitor.sql
./Monitor/2013-03-15-Monitor.sql
./Monitor/2013-03-15-bin-log.000007
./Monitor/2013-03-14-Monitor.sql
  
~END~


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. C:曲線と使いやすさの学習Python vs. C:曲線と使いやすさの学習Apr 19, 2025 am 12:20 AM

Pythonは学習と使用が簡単ですが、Cはより強力ですが複雑です。 1。Python構文は簡潔で初心者に適しています。動的なタイピングと自動メモリ管理により、使いやすくなりますが、ランタイムエラーを引き起こす可能性があります。 2.Cは、高性能アプリケーションに適した低レベルの制御と高度な機能を提供しますが、学習しきい値が高く、手動メモリとタイプの安全管理が必要です。

Python vs. C:メモリ管理とコントロールPython vs. C:メモリ管理とコントロールApr 19, 2025 am 12:17 AM

PythonとCは、メモリ管理と制御に大きな違いがあります。 1。Pythonは、参照カウントとガベージコレクションに基づいて自動メモリ管理を使用し、プログラマーの作業を簡素化します。 2.Cには、メモリの手動管理が必要であり、より多くの制御を提供しますが、複雑さとエラーのリスクが増加します。どの言語を選択するかは、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

科学コンピューティングのためのPython:詳細な外観科学コンピューティングのためのPython:詳細な外観Apr 19, 2025 am 12:15 AM

科学コンピューティングにおけるPythonのアプリケーションには、データ分析、機械学習、数値シミュレーション、視覚化が含まれます。 1.numpyは、効率的な多次元配列と数学的関数を提供します。 2。ScipyはNumpy機能を拡張し、最適化と線形代数ツールを提供します。 3. Pandasは、データ処理と分析に使用されます。 4.matplotlibは、さまざまなグラフと視覚的な結果を生成するために使用されます。

PythonとC:適切なツールを見つけるPythonとC:適切なツールを見つけるApr 19, 2025 am 12:04 AM

PythonまたはCを選択するかどうかは、プロジェクトの要件に依存するかどうかは次のとおりです。1)Pythonは、簡潔な構文とリッチライブラリのため、迅速な発展、データサイエンス、スクリプトに適しています。 2)Cは、コンピレーションと手動メモリ管理のため、システムプログラミングやゲーム開発など、高性能および基礎となる制御を必要とするシナリオに適しています。

データサイエンスと機械学習のためのPythonデータサイエンスと機械学習のためのPythonApr 19, 2025 am 12:02 AM

Pythonは、データサイエンスと機械学習で広く使用されており、主にそのシンプルさと強力なライブラリエコシステムに依存しています。 1)Pandasはデータ処理と分析に使用され、2)Numpyが効率的な数値計算を提供し、3)SCIKIT-LEARNは機械学習モデルの構築と最適化に使用されます。これらのライブラリは、Pythonをデータサイエンスと機械学習に理想的なツールにします。

Pythonの学習:2時間の毎日の研究で十分ですか?Pythonの学習:2時間の毎日の研究で十分ですか?Apr 18, 2025 am 12:22 AM

Pythonを1日2時間学ぶだけで十分ですか?それはあなたの目標と学習方法に依存します。 1)明確な学習計画を策定し、2)適切な学習リソースと方法を選択します。3)実践的な実践とレビューとレビューと統合を練習および統合し、統合すると、この期間中にPythonの基本的な知識と高度な機能を徐々に習得できます。

Web開発用のPython:主要なアプリケーションWeb開発用のPython:主要なアプリケーションApr 18, 2025 am 12:20 AM

Web開発におけるPythonの主要なアプリケーションには、DjangoおよびFlaskフレームワークの使用、API開発、データ分析と視覚化、機械学習とAI、およびパフォーマンスの最適化が含まれます。 1。DjangoandFlask Framework:Djangoは、複雑な用途の迅速な発展に適しており、Flaskは小規模または高度にカスタマイズされたプロジェクトに適しています。 2。API開発:フラスコまたはdjangorestFrameworkを使用して、Restfulapiを構築します。 3。データ分析と視覚化:Pythonを使用してデータを処理し、Webインターフェイスを介して表示します。 4。機械学習とAI:Pythonは、インテリジェントWebアプリケーションを構築するために使用されます。 5。パフォーマンスの最適化:非同期プログラミング、キャッシュ、コードを通じて最適化

Python vs. C:パフォーマンスと効率の探索Python vs. C:パフォーマンスと効率の探索Apr 18, 2025 am 12:20 AM

Pythonは開発効率でCよりも優れていますが、Cは実行パフォーマンスが高くなっています。 1。Pythonの簡潔な構文とリッチライブラリは、開発効率を向上させます。 2.Cのコンピレーションタイプの特性とハードウェア制御により、実行パフォーマンスが向上します。選択を行うときは、プロジェクトのニーズに基づいて開発速度と実行効率を比較検討する必要があります。

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 中国語版

SublimeText3 中国語版

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

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール