# -*- coding: utf-8 -*- import sys import requests import json from urllib import quote import os from optparse import OptionParser from optparse import OptionGroup def run_cmd(host, query, port = 8123 , database = 'cxy7_db' ): url = 'http://%s:%d?user=%s&password=%s&database=%s&max_execution_time=300&query=' % ( host, port, user, password, database) print query url + = quote(query) resp = requests.post(url) print 'host------>%s' % host if resp.status_code = = 200 : return resp.content else : print 'err:' , resp.content if __name__ = = "__main__" : usage = "Usage: %prog [options] clickhouse python client" parser = OptionParser(usage = usage) ch_group = OptionGroup(parser, "cxy7.com clickhouse Config" , "..." ) ch_group.add_option( '-s' , '--source' , help = 'source server' ) ch_group.add_option( '-d' , '--dst' , help = 'dst server' ) ch_group.add_option( '-u' , '--user' , default = 'cxy7' , help = 'user' ) ch_group.add_option( '-p' , '--password' , default = 'cxy7_pwd' , help = 'password' ) ch_group.add_option( '-D' , '--dir' , help = 'data dir' ) parser.add_option_group(ch_group) options, args = parser.parse_args(sys.argv[ 1 :]) source = options.source dst = options.dst user = options.user password = options.password dir = options. dir if not source or not dst or not dir : print "field:(%s, %s, %s) can't be None" % (source, dst, dir ) parser.print_help() sys.exit( - 1 ) print 'migrate from %s to %s' , source, dst sql = "SELECT database, table, name FROM system.parts WHERE active AND database != 'system' FORMAT JSON;" resp = run_cmd(source, sql) json = json.loads(resp) parts = json[ 'data' ] ch_data = '/data1/clickhouse/data' for part in parts: database = part[ 'database' ] table = part[ 'table' ] part_name = part[ 'name' ] part_path = dir + '/' + database + '/' + table + '/' + part_name detached_part_path = ch_data + '/' + database + '/' + table + '/detached/' + part_name print 'move:%s -> %s' % (part_path, detached_part_path) try : shutil.move(part_path, detached_part_path) cmd = 'chown -R clickhouse:clickhouse ' + detached_part_path os.system(cmd) except (IOError,AttributeError): print 'error' continue sql = "ALTER TABLE %s.%s ATTACH PART '%s'" % (database, table, part_name) print run_cmd(dst, sql) |