Für berufliche Zwecke habe ich gerade angefangen, Python zu lernen, also habe ich mir eine Reihe einfacher Python-Lehrvideos angesehen und einfach ein Backup-Skript geschrieben. Ich habe pers?nlich Interesse an den Klassen und Funktionen von Python ge?u?ert. und eingebaute Funktionen, private Variablen, globale Variablen usw. Ich habe keine Ahnung, wie ich sie verwenden soll, wann ich sie verwenden soll usw. Ich nehme sie hier nur auf und freue mich auch über vorbeikommende Pythoner, die mir Ratschl?ge geben.
Einige mir bekannte Probleme:
1. Das Skript muss erfordern, dass alle Verhaltensweisen in der MySQL-Konfigurationsdatei im Schlüssel=Wert-Format vorliegen und es dürfen keine redundanten Kommentare vorhanden sein, andernfalls Das ConfigParser-Modul analysiert die Konfiguration. Beim Schreiben der Datei ist ein Fehler aufgetreten. Da ich nicht untersucht habe, ob ConfigParser über fehlertolerante Methoden verfügt, die aufgerufen werden k?nnen, und ich keine Zeit habe, eine fehlertolerante Verarbeitung zu schreiben, habe ich das Problem durch Aussortieren gel?st die Konfigurationsdatei my.ini, damit sie den Anforderungen von ConfigParser entspricht. Die von mir verwendete MySQL-Konfigurationsdatei wird sp?ter angeh?ngt.
2. Umfangreiche Verwendung von klassenprivaten Mitgliedsvariablen, da ich nicht wei?, wann Python-Variablen, Klassenmethoden usw. privatisiert werden sollten und was die Unterschiede sind. Ich wei? nur, dass klassenprivate Mitgliedsvariablen sind in andere Skripte importiert oder bei Vererbung unsichtbar.
3. Es gibt viele Dateioperationen und Wertübertragungsoperationen. Derzeit stellen wir nur sicher, dass es keine Probleme bei der übergabe von Werten im richtigen Format gibt und keine redundante Fehlertoleranzverarbeitung durchgeführt wird. 4. Es ist das erste Mal, dass ich ein betriebs- und wartungsbezogenes Skript schreibe. Da ich Systembefehle aufrufen und viele Parameter übergeben muss, kenne ich das Unterprozessmodul nicht Ich wei?, wie andere Betriebs- und Wartungsskripte schreiben, also habe ich es einfach direkt gesplei?t.
5. Andere unbekannte Fehler, unentdeckte logische Fehler usw.
Umgebung:
- Server: Dell PowerEdge T110
- Betriebssystem: CentOS 6.3_x86_64
- PythonVersion: 2.7.3
- MysqlVersion: 5.5.28 Linux x86_64
MysqlBackupScript.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 命令備份數(shù)據(jù)庫的參數(shù) '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數(shù)據(jù) __FLUSH_LOG_COMMAND = __MYSQL_BIN_DIR + '/mysqladmin' #mysqladmin 命令的路徑 ,用于執(zhí)行 flush-logs 生成每天增量binlog __BACKUP_DIR = r'/backup/' # 指定備份文件存放的目錄 __PROJECTNAME = 'example' # 指定需要備份的數(shù)據(jù)庫對應的項目名,將來會生成 projectname-YYYY-MM-DD.sql 等文件 __DATABASE_LIST = [] # 指定需要備份的數(shù)據(jù)庫名,可以是多個,使用列表 __HOST = 'localhost' __PORT = 3306 __USERNAME = 'root' __PASSWORD = '' __LOGINARGS = '' # 如果在localhost登陸,需要密碼,可以設定登陸的參數(shù),具體在下面有說明 __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): """ 實例化對象時傳入的參數(shù),如不傳入默認使用類的私有成員變量作為默認值 :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] #下面定義了如需登陸時,參數(shù) 其實就是生成 這樣的格式 “-hlocalhost -uroot --password=‘xxxx’” self.__LOGINARGS = " -h" + self.__HOST + " -P" + str( self.__PORT) + " -u" + self.__USERNAME + " --password='" + self.__PASSWORD + "'" self.checkDatabaseArgs() #調(diào)用檢查函數(shù) def __getconfig(self, cnf=__MYSQL_CONFIG_FILE, item=None): # 解析mysql配置文件的小函數(shù),簡單封裝了下,傳入一個值作為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文件取倒數(shù)第二行 __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): # 調(diào)用此函數(shù),將會執(zhí)行 mysqladmin flush-logs ,刷新binlog日志 return os.popen(self.__FLUSH_LOG_COMMAND + self.__LOGINARGS + ' flush-logs') def dumpDatabaseSQL(self): #|通過mysqladmin 對指定數(shù)據(jù)庫進行全備 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): #檢查指定的備份目錄是否存在,如不存在自動創(chuàng)建 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): #檢查備份數(shù)據(jù)庫時使用的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: #檢查需要備份的數(shù)據(jù)庫列表是否存在 sys.stderr.write('Database List is None \n') __rv += 1 if __rv: # 判斷返回值,由于上述任何一步檢查失敗,都會導致 __rv 值 +1 ,只要最后__rv != 0就直接退出了。 sys.exit(1) def crontab(): # 使用字典,來進行相關參數(shù)傳遞,并實例化對象,調(diào)用相關方法進行操作 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
Die endgültig generierte Backup-Verzeichnisstruktur sieht so aus
[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~

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Installieren Sie PYODBC: Verwenden Sie den Befehl pipinstallpyoDBC, um die Bibliothek zu installieren. 2. SQLServer verbinden: Verwenden Sie die Verbindungszeichenfolge, die Treiber, Server, Datenbank, UID/PWD oder Trusted_Connection über die Methode Pyodbc.Connect () und die SQL -Authentifizierung bzw. der Windows -Authentifizierung unterstützen; 3. überprüfen Sie den installierten Treiber: Führen Sie Pyodbc.Drivers () aus und filtern Sie den Treibernamen mit 'SQLServer', um sicherzustellen, dass der richtige Treiberame wie 'ODBCDRIVER17 für SQLServer' verwendet wird. 4. Schlüsselparameter der Verbindungszeichenfolge

Die Einführung in statistische Arbitrage Statistical Arbitrage ist eine Handelsmethode, die auf der Grundlage mathematischer Modelle Preisfehlanpassungen auf dem Finanzmarkt erfasst. Die Kernphilosophie beruht auf der mittleren Regression, dh, dass die Verm?genspreise kurzfristig von langfristigen Trends abweichen, aber schlie?lich zu ihrem historischen Durchschnitt zurückkehren. H?ndler verwenden statistische Methoden, um die Korrelation zwischen Verm?genswerten zu analysieren und nach Portfolios zu suchen, die normalerweise synchron ver?ndern. Wenn das Preisverh?ltnis dieser Verm?genswerte ungew?hnlich abgewichen ist, ergeben sich Arbitrage -M?glichkeiten. Auf dem Kryptow?hrungsmarkt ist die statistische Arbitrage besonders weit verbreitet, haupts?chlich aufgrund der Ineffizienz und drastischen Marktschwankungen des Marktes selbst. Im Gegensatz zu den traditionellen Finanzm?rkten arbeiten Kryptow?hrungen rund um die Uhr und ihre Preise sind ?u?erst anf?llig für Verst??e gegen Nachrichten, Social -Media -Stimmung und technologische Upgrades. Diese konstante Preisschwankung schafft h?ufig Preisgestaltung und liefert Arbitrageure mit

Shutil.rmtree () ist eine Funktion in Python, die den gesamten Verzeichnisbaum rekursiv l?scht. Es kann bestimmte Ordner und alle Inhalte l?schen. 1. Basisnutzung: Verwenden Sie Shutil.rmtree (Pfad), um das Verzeichnis zu l?schen, und Sie müssen FilenotFoundError, Erlaubnissekror und andere Ausnahmen verarbeiten. 2. Praktische Anwendung: Sie k?nnen Ordner, die Unterverzeichnisse und Dateien enthalten, in einem Klick l?schen, z. B. tempor?re Daten oder zwischengespeicherte Verzeichnisse. 3. ANMERKUNGEN: Der L?schvorgang wird nicht wiederhergestellt; FilenotFoundError wird geworfen, wenn der Weg nicht existiert. Es kann aufgrund von Berechtigungen oder Einstellungen fehlschlagen. 4. Optionale Parameter: Fehler k?nnen von ignore_errors = true ignoriert werden

Installieren Sie den entsprechenden Datenbanktreiber; 2. verwenden Sie Connect (), um eine Verbindung zur Datenbank herzustellen. 3. Erstellen Sie ein Cursorobjekt; V. 5. Verwenden Sie Fetchall () usw., um Ergebnisse zu erhalten. 6. Commit () ist nach der ?nderung erforderlich; 7. Schlie?lich schlie?en Sie die Verbindung oder verwenden Sie einen Kontextmanager, um sie automatisch zu behandeln. Der vollst?ndige Prozess stellt sicher, dass die SQL -Operationen sicher und effizient sind.

Die empfohlene M?glichkeit, Dateienzeile nach Zeile in Python zu lesen, besteht darin, mit Open () und für Schleifen zu verwenden. 1. Verwenden Sie mit Open ('Beispiel. 2. Verwenden Sie ForlineInFile: zum Linien für Linien zu realisieren, ma?geschneidert, ma?geschneidert; 3.. Line.strip () verwenden, um Zeilen-für-Linie-Zeichen und Whitespace-Zeichen zu entfernen; 4. Geben Sie Coding = 'UTF-8' an, um Codierungsfehler zu verhindern. Andere Techniken umfassen das überspringen von leeren Linien, das Lesen von N -Zeilen zuvor, das Erhalten von Zeilennummern und Verarbeitungsleitungen entsprechend den Bedingungen und das stets ma?gebliche ?ffnen ohne Schlie?en vermeiden. Diese Methode ist vollst?ndig und effizient und für eine gro?e Dateiverarbeitung geeignet

TorunapythonscriptWithArgumenteInvScode, configurelaunch.jsonByopeningTherunanddebugpanel, erstellte thelaunch.jsonFile, undaddingthesireSeiRedArgumentSthe "args" arrayWitHinTheconfiguration.2.Inthonscript, Useargparseys.Argvtoaccce

Verwenden Sie Multiprocessing.queue, um Daten zwischen mehreren Prozessen zu übergeben, die für Szenarien mehrerer Hersteller und Verbraucher geeignet sind. 2. Verwenden Sie Multiprocessing.Pipe, um eine bidirektionale Hochgeschwindigkeitskommunikation zwischen zwei Prozessen zu erreichen, jedoch nur für Zweipunktverbindungen; 3. Verwenden Sie Wert und Array, um einfache Datentypen im gemeinsamen Speicher zu speichern, und müssen mit Sperre verwendet werden, um Wettbewerbsbedingungen zu vermeiden. 4. Verwenden Sie den Manager, um komplexe Datenstrukturen wie Listen und W?rterbücher auszutauschen, die hoch flexibel sind, aber eine geringe Leistung haben und für Szenarien mit komplexen gemeinsamen Zust?nden geeignet sind. Geeignete Methoden sollten basierend auf Datengr??e, Leistungsanforderungen und Komplexit?t ausgew?hlt werden. Warteschlange und Manager eignen sich am besten für Anf?nger.

Verwenden Sie Boto3, um Dateien auf S3 hochzuladen, um Boto3 zuerst zu installieren und AWS -Anmeldeinformationen zu konfigurieren. 2. Erstellen Sie einen Client über boto3.client ('s3') und rufen Sie die Methode upload_file () auf, um lokale Dateien hochzuladen. 3.. Sie k?nnen S3_Key als Zielpfad angeben und den lokalen Dateinamen verwenden, wenn er nicht angegeben ist. V. 5. ACL, ContentType, StorageClass und Metadaten k?nnen durch den Parameter exteralArgs eingestellt werden. 6. Für Speicherdaten k?nnen Sie Bytesio verwenden, um W?rter zu erstellen
