| # -*- 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) |