mysql for utilities_MySQL管理工具MySQL Utilities — 使用MySQL Utilities库创建工具

#

# 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= --new-id= " \

"--new-port= --databases= " \

"--users="

# 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: :@::")

# 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."

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值