在前一节内容中介绍了一个应用场景。假设你要开发一个新的数据库解决方案,需要真实的数据和用户账号进行测试,并且一条命令完成该任务。实现过程已说明了,来看看完整的代码copy_server.py:
# # Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # """ This file contains an example of how to build a customized utility using the MySQL Utilities scripts and libraries. """ import optparse import os import sys from mysql.utilities import VERSION_FRM from mysql.utilities.command import dbcopy from mysql.utilities.command import serverclone from mysql.utilities.command import userclone from mysql.utilities.common.server import Server from mysql.utilities.common.options import parse_connection from mysql.utilities.exception import UtilError # Constants NAME = "example - copy_server " DESCRIPTION = "copy_server - copy an existing server" USAGE = "%prog --server=user:pass@host:port:socket " \ "--new-dir=<path> --new-id=<server_id> " \ "--new-port=<port> --databases=<db list> " \ "--users=<user list>" # Setup the command parser parser = optparse.OptionParser( version=VERSION_FRM.format(program=os.path.basename(sys.argv[0])), description=DESCRIPTION, usage=USAGE, add_help_option=False) parser.add_option("--help", action="help") # Setup utility-specific options: # Connection information for the source server parser.add_option("--server", action="store", dest="server", type="string", default="root@localhost:3306", help="connection information for original server in " + \ "the form: <user>:<password>@<host>:<port>:<socket>") # Data directory for new instance parser.add_option("--new-data", action="store", dest="new_data", type="string", help="the full path to the location " "of the data directory for the new instance") # Port for the new instance parser.add_option("--new-port", action="store", dest="new_port", type="string", default="3307", help="the new port " "for the new instance - default=%default") # Server id for the new instance parser.add_option("--new-id", action="store", dest="new_id", type="string", default="2", help="the server_id for " "the new instance - default=%default") # List of databases parser.add_option("-d", "--databases", action="store", dest="dbs_to_copy", type="string", help="comma-separated list of databases " "to include in the copy (omit for all databases)", default=None) # List of users parser.add_option("-u", "--users", action="store", dest="users_to_copy", type="string", help="comma-separated list of users " "to include in the copy (omit for all users)", default=None) # Now we process the rest of the arguments. opt, args = parser.parse_args() # Parse source connection values try: conn = parse_connection(opt.server) except: parser.error("Server connection values invalid or cannot be parsed.") # Get a server class instance print "# Connecting to server..." server_options = { 'conn_info' : conn, 'role' : "source", } server1 = Server(server_options) try: server1.connect() except UtilError, e: print "ERROR:", e.errmsg # Get list of databases from the server if not specified in options print "# Getting databases..." db_list = [] if opt.dbs_to_copy is None: for db in server1.get_all_databases(): db_list.append((db[0], None)) else: for db in opt.dbs_to_copy.split(","): db_list.append((db, None)) # Get list of all users from the server print "# Getting users..." user_list=[] if opt.users_to_copy is None: users = server1.exec_query("SELECT user, host " "FROM mysql.user " "WHERE user != 'root' and user != ''") for user in users: user_list.append(user[0]+'@'+user[1]) else: for user in opt.users_to_copy.split(","): user_list.append(user) # Build options options = { 'new_data' : opt.new_data, 'new_port' : opt.new_port, 'new_id' : opt.new_id, 'root_pass' : 'root', 'mysqld_options' : '--report-host=localhost --report-port=%s' % opt.new_port, } # Clone the server print "# Cloning server instance..." try: res = serverclone.clone_server(conn, options) except UtilError, e: print "ERROR:", e.errmsg sys.exit() # Set connection values dest_values = { "user" : conn.get("user"), "passwd" : "root", "host" : conn.get("host"), "port" : opt.new_port, "unix_socket" : os.path.join(opt.new_data, "mysql.sock") } # Build dictionary of options options = { "quiet" : True, "force" : True } print "# Copying databases..." try: dbcopy.copy_db(conn, dest_values, db_list, options) except UtilError, e: print "ERROR:", e.errmsg sys.exit() # Build dictionary of options options = { "overwrite" : True, "quiet" : True, "globals" : True } print "# Cloning the users..." for user in user_list: try: res = userclone.clone_user(conn, dest_values, user, (user,), options) except UtilError, e: print "ERROR:", e.errmsg sys.exit() print "# ...done."
该代码需要Python基础,有兴趣的去学习下Python。可以先看看《Python快速入门》。文章源自运维生存时间-https://www.ttlsa.com/mysql/use-mysql-utilities-library-create-tools/ 文章源自运维生存时间-https://www.ttlsa.com/mysql/use-mysql-utilities-library-create-tools/

我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
评论