更新mysql8.17的脚本:2019-09-19
# -*- coding: utf-8 -*- import sys reload(sys) import getopt import commands import subprocess import fileinput import os __author__ = ' Lenny ' INFO = " \033[1;33;40m%s\033[0m " ERROR = " \033[1;31;40m%s\033[0m " NOTICE = " \033[1;32;40m%s\033[0m " LINE = " # " * 50 LINE_ERROR = " - " * 50 def CheckAndHelp(project_name, option): usage_help = ''' Usage: python %s install [OPTION] [arg...] ''' % project_name example = ''' Example: Simple: python mysql_install.py install --instance-ports=3366 Multiple instances: python mysql_install.py install --instance-ports=3366,3399,4466 If you know enough to the MySQL, you can use configure area: Simple: python %s install --instance-ports=3366 --innodb-buffer-pool-size=1G ''' % project_name configure_usage = ''' ''' install_usage = ''' install: custom install: --instance-ports default:3306 --mysql-user default:mysql --base-prefix default:/usr/local/mysql --data-prefix default:/data/db ''' if option == " install " or option is None: usage = usage_help + " \n " + example + " \n " + install_usage + " \n " + configure_usage return usage else : usage = usage_help + " \n " + example + " \n " + install_usage + " \n " + configure_usage return usage def CheckArgv(argvs): check_start_message = " Check Argument Start . . . " print LINE print INFO % check_start_message print LINE invalid_list = [] result_dic = {} # print argvs,"???" try : opts, args = getopt.getopt(argvs, " v " , [ " instance-ports= " , " mysql-user= " , " base-prefix= " , " data-prefix= " , " log-prefix= " , " max-allowed-packet= " , " max-binlog-size= " , " binlog-cache-size= " , " expire-logs-days= " , " slow-query-log= " , " long-query-time= " , " log-queries-not-using-indexes= " , " key-buffer-size= " , " innodb-data-file-path= " , " innodb-buffer-pool-size= " , " innodb-log-file-size= " , " innodb-log-buffer-size= " , " innodb-thread-concurrency= " , " innodb-write-io-threads= " , " innodb-read-io-threads= " , " innodb_io_capacity= " , " max-connections= " , " read-buffer-size= " , " read-rnd-buffer-size= " , " tmp-table-size= " , " max-heap-table-size= " , " thread-cache-size= " , " wait-timeout= " ]) # print opts, "opts++" # print args, "args--" result_dic = { ' result_state ' : ' true ' , ' result ' : opts} except getopt.GetoptError, err: # print err err_msg = " use -h or -help check " result_dic = { ' result_state ' : ' false ' , ' result ' : str(err) + " \n\n " + err_msg} # print result_dic return result_dic def CreateConfigurationFiles(configure): # print configure instance_ports = ' 3306 ' mysql_user = ' mysql ' base_prefix = ' /usr/local/mysql ' data_prefix = ' /data/db ' log_prefix = ' /data/dblogs ' max_allowed_packet = ' 64M ' max_binlog_size = ' 1024M ' binlog_cache_size = ' 4M ' expire_logs_days = ' 7 ' slow_query_log = ' 0 ' long_query_time = ' 1 ' log_queries_not_using_indexes = ' 0 ' key_buffer_size = ' 64M ' innodb_data_file_path = ' ibdata1:1G:autoextend ' innodb_log_file_size = ' 256M ' innodb_log_buffer_size = ' 2M ' innodb_io_capacity = ' 200 ' max_connections = ' 5000 ' read_buffer_size = ' 8M ' read_rnd_buffer_size = ' 16M ' tmp_table_size = ' 128M ' max_heap_table_size = ' 128M ' wait_timeout = ' 600 ' system_free_memory = commands.getstatusoutput( " cat /proc/meminfo | grep MemFree|awk '{print $(NF-1)}' " )[1 ] # system_total_memory = '1048576' system_total_memory = commands.getstatusoutput( " cat /proc/meminfo | grep MemTotal|awk '{print $(NF-1)}' " )[1 ] sort_buffer_size = ' 16M ' # innodb_buffer_pool_size = '128M' innodb_buffer_pool_size = ' %sM ' % int((int(system_free_memory) / 1024 - int(key_buffer_size[:-1]) - int( max_connections) * (int(sort_buffer_size[:-1]) + int(read_buffer_size[:-1]) + int( binlog_cache_size[: -1])) - int(max_connections) - int(max_binlog_size[:-1]) - int(tmp_table_size[:-1])) * 0.95 ) if int(innodb_buffer_pool_size[:-1]) < 0: innodb_buffer_pool_size = ' 512M ' cpu_core = commands.getstatusoutput( " cat /proc/cpuinfo | grep processor | wc -l " )[1 ] # innodb_thread_concurrency = '8' # innodb_write_io_threads = '4' # innodb_read_io_threads = '4' r1 = commands.getstatusoutput( """ ip a|grep 'scope global'|awk -F[:' '/]+ '{print $3}'|grep ^192|tail -1 """ )[1].split( ' . ' )[2 :] server_id = "" .join(r1) + instance_ports innodb_thread_concurrency = ' %s ' % (int(cpu_core) * 2 ) innodb_write_io_threads = ' %s ' % (int(cpu_core)) innodb_read_io_threads = ' %s ' % (int(cpu_core)) thread_cache_size = ' %s ' % int(int(max_connections) * 0.1 ) default_argv = { ' --server-id ' : server_id, ' --instance-ports ' : instance_ports, ' --mysql-user ' : mysql_user, ' --base-prefix ' : base_prefix, ' --data-prefix ' : data_prefix, ' --log-prefix ' : log_prefix, ' --max-allowed-packet ' : max_allowed_packet, ' --max-binlog-size ' : max_binlog_size, ' --binlog-cache-size ' : binlog_cache_size, ' --expire-logs-days ' : expire_logs_days, ' --slow-query-log ' : slow_query_log, ' --long-query-time ' : long_query_time, ' --log-queries-not-using-indexes ' : log_queries_not_using_indexes, ' --key-buffer-size ' : key_buffer_size, ' --innodb-data-file-path ' : innodb_data_file_path, ' --innodb-buffer-pool-size ' : innodb_buffer_pool_size, ' --innodb-log-file-size ' : innodb_log_file_size, ' --innodb-log-buffer-size ' : innodb_log_buffer_size, ' --innodb-thread-concurrency ' : innodb_thread_concurrency, ' --innodb-write-io-threads ' : innodb_write_io_threads, ' --innodb-read-io-threads ' : innodb_read_io_threads, ' --innodb_io_capacity ' : innodb_io_capacity, ' --max-connections ' : max_connections, ' --read-buffer-size ' : read_buffer_size, ' --read-rnd-buffer-size ' : read_rnd_buffer_size, ' --tmp-table-size ' : tmp_table_size, ' --max-heap-table-size ' : max_heap_table_size, ' --thread-cache-size ' : thread_cache_size, ' --wait-timeout ' : wait_timeout } for k, v in configure: if k == " --max-allowed-packet " : if int(v[:-1]) < 1000 : default_argv[k] = v continue else : default_argv[k] = max_allowed_packet msg = " %s The Value Is Unavailable, Change Default Value " % k print LINE print NOTICE % msg print LINE continue elif k == " --max-binlog-size " : if int(v[:-1]) < 2000 : default_argv[k] = v continue else : default_argv[k] = max_binlog_size msg = " %s The Value Is Unavailable, Change Default Value " % k print LINE print NOTICE % msg print LINE continue elif k == " --binlog-cache-size " : if 2 <= int(v[:-1]) <= 4 : default_argv[k] = v continue else : default_argv[k] = binlog_cache_size msg = " %s The Value Is Unavailable, Change Default Value " % k print LINE print NOTICE % msg print LINE continue elif k == " --key-buffer-size " : if int(v[:-1]) <= int(int(system_total_memory) / 1024 * 0.2 ): default_argv[k] = v continue else : default_argv[k] = key_buffer_size msg = " %s The Value Is Unavailable, Change Default Value " % k print LINE print NOTICE % msg print LINE continue elif k == " --tmp-table-size " : if int(v[:-1]) <= int(int(system_total_memory) / 1024 * 0.1 ): default_argv[k] = v continue else : default_argv[k] = tmp_table_size msg = " %s The Value Is Unavailable, Change Default Value " % k print LINE print NOTICE % msg print LINE continue elif k == " --max-heap-table-size " : if int(v[:-1]) <= int(int(system_total_memory) / 1024 * 0.1 ): default_argv[k] = v continue else : default_argv[k] = max_heap_table_size msg = " %s The Value Is Unavailable, Change Default Value " % k print LINE print NOTICE % msg print LINE continue else : default_argv[k] = v # default_argv['--server-id'] = "".join(server_id) + instance_ports # print default_argv check_finish_message = " Check Argument Finish " print LINE print INFO % check_finish_message print LINE return default_argv def CheckReplaceFile(configure_dic): check_environment_start_message = " Check Environment Start . . . " print LINE print INFO % check_environment_start_message print LINE data_file_path = " %s/mysql%s " % (configure_dic[ ' --data-prefix ' ], configure_dic[ ' --instance-ports ' ]) log_file_path = " %s/mysql%s " % (configure_dic[ ' --log-prefix ' ], configure_dic[ ' --instance-ports ' ]) local_file = ' my.cnf ' # if os.path.exists(configure_dic['--base-prefix']): # pass # else: # commands.getstatusoutput("mkdir -p %s" % configure_dic['--base-prefix']) # print "The %s create success" % configure_dic['--base-prefix'] if os.path.exists(configure_dic[ ' --data-prefix ' ]): pass else : commands.getstatusoutput( " mkdir -p %s " % configure_dic[ ' --data-prefix ' ]) msg = " The Path: %s Create Success " % configure_dic[ ' --data-prefix ' ] print LINE print NOTICE % msg print LINE if os.path.exists(configure_dic[ ' --log-prefix ' ]): pass else : commands.getstatusoutput( " mkdir -p %s " % configure_dic[ ' --log-prefix ' ]) msg = " The Path: %s Create Success " % configure_dic[ ' --log-prefix ' ] print LINE print NOTICE % msg print LINE if os.path.exists(data_file_path): msg = " [Error]: The MySQL Instance Port: %s exists, Pleace Change " % configure_dic[ ' --instance-ports ' ] print LINE_ERROR print ERROR % msg print LINE_ERROR sys.exit() else : commands.getstatusoutput( " mkdir -p %s " % data_file_path) msg = " The Path: %s Create Success " % data_file_path print LINE print NOTICE % msg print LINE if os.path.exists(log_file_path): msg = " [Error]: The MySQL Instance Port: %s exists, Pleace Change " % configure_dic[ ' --instance-ports ' ] print LINE_ERROR print ERROR % msg print LINE_ERROR sys.exit() else : commands.getstatusoutput( " mkdir -p %s " % log_file_path) msg = " The Path: %s Create Success " % log_file_path print LINE print NOTICE % msg print LINE if int(commands.getstatusoutput( " id %s " % configure_dic[ ' --mysql-user ' ])[0]) == 0: pass else : commands.getstatusoutput( " useradd %s " % configure_dic[ ' --mysql-user ' ]) msg = " Add MySQL User: %s Succsee " % configure_dic[ ' --mysql-user ' ] print LINE print NOTICE % msg print LINE check_environment_finish_message = " Check Environment Finish " print LINE print INFO % check_environment_finish_message print LINE create_file_start_message = " Create MySQL Configuration File Start . . . " print LINE print INFO % create_file_start_message print LINE cp_file = commands.getstatusoutput( " cp -fr %s %s " % (local_file, data_file_path)) if int(cp_file[0]) == 0: pass else : print cp_file[1 ] mysql_file = os.path.join(data_file_path, local_file) # print configure_dic for k, v in configure_dic.items(): commands.getstatusoutput( " sed -i 's#$%s#%s#g' %s " % (k, v, mysql_file)) result_dic = { ' result_state ' : " true " , ' result ' : mysql_file} create_file_finish_message = " Create MySQL Configuration File Finish " print LINE print INFO % create_file_finish_message print LINE return result_dic def InstallMysql(install_cfg, filename): install_start_message = " Install MySQL Start Port: %s. . . " % install_cfg[ ' --instance-ports ' ] print LINE print INFO % install_start_message print LINE rootpwd = " root " mysql_conf_name = " my.cnf " old_mysql_file = " /etc/my.cnf " data_file_path = " %s/mysql%s " % (install_cfg[ ' --data-prefix ' ], install_cfg[ ' --instance-ports ' ]) log_file_path = " %s/mysql%s " % (install_cfg[ ' --log-prefix ' ], install_cfg[ ' --instance-ports ' ]) data_dir = [ ' data ' , ' mysqltmp ' ] log_dir = [ ' binlogs ' , ' slowlogs ' , ' relaylogs ' ] install_dir = " /usr/local/ " mysql_src_tar = filename mysql_src_name = mysql_src_tar.replace( " .tar " , "" ).strip() mysql_run_script = ' mysql ' mysql_safe_file = ' %s/bin/mysqld_safe ' % install_cfg[ ' --base-prefix ' ] mysql_conf_file = os.path.join(data_file_path, mysql_conf_name) mysql_run_file = os.path.join(data_file_path, mysql_run_script) sys_run_file = " /etc/init.d/mysql%s " % install_cfg[ ' --instance-ports ' ] mysql_sock = " %s/mysql%s/mysql%s.sock " % (install_cfg[ ' --data-prefix ' ], install_cfg[ ' --instance-ports ' ], install_cfg[ ' --instance-ports ' ]) if os.path.exists(install_cfg[ ' --base-prefix ' ]) and os.path.exists(os.path.join(install_dir, mysql_src_name)): pass else : tar_mysql = commands.getstatusoutput( " tar xvf %s -C %s " % (mysql_src_tar, install_dir)) if int(tar_mysql[0]) == 0: commands.getstatusoutput( " ln -s %s %s " % (os.path.join(install_dir, mysql_src_name), install_cfg[ ' --base-prefix ' ])) print install_dir, mysql_src_name create_environment_start_message = " Create MySQL Environment Start . . . " print LINE print INFO % create_environment_start_message print LINE if os.path.exists( ' /usr/sbin/lsof ' ): pass else : lsof_install = commands.getstatusoutput( " yum install lsof -y " ) if int(lsof_install[0]) != 0: msg = " [Error]: Failed To Install Lsof " print LINE_ERROR print ERROR % msg print LINE_ERROR sys.exit() if os.path.exists( ' /usr/bin/perl ' ): pass else : perl_install = commands.getstatusoutput( " yum install perl -y " ) if int(perl_install[0]) != 0: msg = " [Error]: Failed To Install Perl " print LINE_ERROR print ERROR % msg print LINE_ERROR sys.exit() if os.path.exists( ' /lib/libaio.so.1 ' ): pass else : libaio_install = commands.getstatusoutput( " yum install libaio-devel libaio -y " ) if int(libaio_install[0]) != 0: msg = " [Error]: Failed To Install Libaio " print LINE_ERROR print ERROR % msg print LINE_ERROR sys.exit() commands.getstatusoutput( " sed -i 's#/usr/local/mysql#'%s'#g' %s " % (install_cfg[ ' --base-prefix ' ], mysql_safe_file)) if os.path.exists(old_mysql_file): commands.getstatusoutput( " mv %s %s.bak " % (old_mysql_file, old_mysql_file)) for data in data_dir: commands.getstatusoutput( " mkdir -p %s/%s " % (data_file_path, data)) for log in log_dir: commands.getstatusoutput( " mkdir -p %s/%s " % (log_file_path, log)) commands.getstatusoutput( " cp -fr %s %s " % (mysql_run_script, data_file_path)) commands.getstatusoutput( " chown -R mysql.mysql %s " % data_file_path) commands.getstatusoutput( " chown -R mysql.mysql %s " % log_file_path) commands.getstatusoutput( " sed -i 's#{MYCNF-DIR}#'%s'#g' %s " % (mysql_conf_file, mysql_run_file)) commands.getstatusoutput( " sed -i 's#{BIN-DIR}#'%s/bin'#g' %s " % (install_cfg[ ' --base-prefix ' ], mysql_run_file)) commands.getstatusoutput( " sed -i 's#{PID-DIR}#'%s/mysql%s.pid'#g' %s " % (log_file_path, install_cfg[ ' --instance-ports ' ], mysql_run_file)) commands.getstatusoutput( " cp -fr %s %s " % (mysql_run_file, sys_run_file)) # commands.getstatusoutput("/bin/rm -f /etc/init.d/mysqld") commands.getstatusoutput( " chmod 700 %s " % sys_run_file) commands.getstatusoutput( " /sbin/chkconfig add mysql%s " % install_cfg[ ' --base-prefix ' ]) commands.getstatusoutput( " /sbin/chkconfig mysql%s on " % install_cfg[ ' --base-prefix ' ]) commands.getstatusoutput( " find %s -name mysql -exec chmod 700 {} \; " % data_file_path) mysql_value = commands.getstatusoutput( " grep -w mysql%s /etc/profile | wc -l " % install_cfg[ ' --instance-ports ' ]) if int(mysql_value[1]) == 0: commands.getstatusoutput( " echo alias mysql%s='\"'%s/bin/mysql --defaults-file=%s -S %s'\"' >> /etc/profile " % ( install_cfg[ ' --instance-ports ' ], install_cfg[ ' --base-prefix ' ], mysql_conf_file, mysql_sock)) create_environment_finish_message = " Create MySQL Environment Finish " print LINE print INFO % create_environment_finish_message print LINE initialize_mysql_start_message = " Initialize MySQL . . . " print LINE print INFO % initialize_mysql_start_message print LINE MYSTR = " %s/bin/mysqld --defaults-file=%s --basedir=%s --user=mysql --initialize --explicit_defaults_for_timestamp >/dev/null " % ( install_cfg[ ' --base-prefix ' ], mysql_conf_file, install_cfg[ ' --base-prefix ' ]) print INFO % MYSTR # mysql_initialize = commands.getstatusoutput() scommand = " %s/bin/mysqld --defaults-file=%s --basedir=%s --user=mysql --initialize --explicit_defaults_for_timestamp>/dev/null " % ( install_cfg[ ' --base-prefix ' ], mysql_conf_file, install_cfg[ ' --base-prefix ' ]) status = subprocess.call(scommand, shell= True) if status > 0: msg = " [Error]: Failed to initialize MySQL data directory. Port: %s " % install_cfg[ ' --instance-ports ' ] print LINE_ERROR print ERROR % msg print LINE_ERROR sys.exit() # # # mysql_initialize = commands.getstatusoutput("%s/scripts/mysql_install_db --basedir=%s --defaults-file=%s --user=mysql --explicit_defaults_for_timestamp >/dev/null" % (install_cfg['--base-prefix'], install_cfg['--base-prefix'], mysql_conf_file)) # if mysql_initialize != 0: initialize_mysql_finish_message = " Initialize MySQL Finish " print LINE print INFO % initialize_mysql_finish_message print LINE mysql_start_message = " MySQL Start . . . " print LINE print INFO % mysql_start_message print LINE print " the sys_run_file is %s " % sys_run_file mysql_start = subprocess.call([sys_run_file, ' start ' ]) print " start print mysql_start " if mysql_start> 0: print " MySQL failed to start on %s " % install_cfg[ ' --instance-ports ' ] sys.exit() mysql_finish_message = " MySQL Start Finish " print LINE print INFO % mysql_finish_message print LINE mysql_privileges_start_message = " Cfg MySQL(%s) Privileges Start . . . " % install_cfg[ ' --instance-ports ' ] print LINE print INFO % mysql_privileges_start_message print LINE a = """ grep 'temporary password' %s/error.log |sed 's/.*root@localhost: //' """ % (log_file_path) password_temp =commands.getstatusoutput(a)[1 ] # print password_temp scommand= """ /usr/sbin/lsof -i :%s &>/dev/null && %s/bin/mysql --connect-expired-password --socket=%s -u root -p"%s" -e "SET SQL_LOG_BIN=0;alter user 'root'@'localhost' identified by 'root';SET SQL_LOG_BIN=1;" """ % (install_cfg[ ' --instance-ports ' ], install_cfg[ ' --base-prefix ' ], mysql_sock,password_temp) print scommand cfg_mysql_privileges =subprocess.call(scommand, shell= True) if cfg_mysql_privileges > 0: msg = " [Error]: Failed to set MySQL root password! Please do it manually. " print LINE_ERROR print ERROR % cfg_mysql_privileges print ERROR % msg print LINE_ERROR sys.exit() # cfg_mysql_privileges = commands.getstatusoutput( # "/usr/sbin/lsof -i :%s &>/dev/null && %s/bin/mysqladmin -u root password '%s' -S %s >/dev/null 2>&1" % ( # install_cfg['--instance-ports'], install_cfg['--base-prefix'], rootpwd, mysql_sock)) # /usr/local/mysql/ bin / mysqladmin - uroot - p 'jSh#jXtkC6i8' password 'root' - -socket = / data / db / mysql3306 / mysql3306.sock # if int(cfg_mysql_privileges[0]) != 0: # print cfg_mysql_privileges[1] # msg = "[Error]: Failed to set MySQL root password! Please do it manually." # print LINE_ERROR # print ERROR % cfg_mysql_privileges[1] # print ERROR % msg # print LINE_ERROR # sys.exit() mysql_privileges_finish_message = " Cfg MySQL(%s) Privileges Finish " % install_cfg[ ' --instance-ports ' ] print LINE print INFO % mysql_privileges_finish_message print LINE check_mysql_start_message = " Check MySQL(%s) Connected to port Start " % install_cfg[ ' --instance-ports ' ] print LINE print INFO % check_mysql_start_message print LINE check_mysql = commands.getstatusoutput( ''' %s/bin/mysql -uroot -p%s -S %s -Bse "SELECT concat(version(),' started in %s port')" ''' % ( install_cfg[ ' --base-prefix ' ], rootpwd, mysql_sock, install_cfg[ ' --instance-ports ' ])) if int(check_mysql[0]) != 0: msg = " [Error]: Failed to connect to port %s! You need to create MySQL monitoring user manually. " % install_cfg[ ' --instance-ports ' ] print LINE_ERROR print ERROR % check_mysql[1 ] print ERROR % msg print LINE_ERROR sys.exit() else : msg = " Connected to port %s successful. " % install_cfg[ ' --instance-ports ' ] print LINE print NOTICE % msg print LINE check_mysql_finish_message = " Check MySQL(%s) Connected to port Finish " % install_cfg[ ' --instance-ports ' ] print LINE print INFO % check_mysql_finish_message print LINE create_user_start_message = " Creating MySQL Monitoring User Start... " print LINE print INFO % create_user_start_message print LINE create_mysql_monitor = commands.getstatusoutput( ''' %s/bin/mysql -uroot -p%s -S %s -Bse "GRANT PROCESS,REPLICATION CLIENT ON *.* TO 'monitoring'@'127.0.0.1 identified by '8e3d7855e5681ee463e28394c2bb33043e65dbb9';FLUSH PRIVILEGES;" ''' % ( install_cfg[ ' --base-prefix ' ], rootpwd, mysql_sock)) create_user_finish_message = " Creating MySQL Monitoring User Finish... " print LINE print INFO % create_user_finish_message print LINE install_rpl_start_message = " Install rpl_semi_sync on %s Start.... " % install_cfg[ ' --instance-ports ' ] print LINE print INFO % install_rpl_start_message print LINE install_rpl_semi_sync = commands.getstatusoutput( ''' %s/bin/mysql -uroot -p%s -S %s -e "INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';" ''' % ( install_cfg[ ' --base-prefix ' ], rootpwd, mysql_sock)) if int(install_rpl_semi_sync[0]) != 0: print install_rpl_semi_sync[1 ] msg = " [Error]: Install rpl_semi_sync failed on %s " % install_cfg[ ' --instance-ports ' ] print LINE_ERROR print ERROR % install_rpl_semi_sync[1 ] print ERROR % msg print LINE_ERROR sys.exit() install_rpl_finish_message = " Install rpl_semi_sync on %s Finish.... " % install_cfg[ ' --instance-ports ' ] print LINE print INFO % install_rpl_finish_message print LINE return " true " if __name__ == ' __main__ ' : if os.geteuid() != 0: msg = " [Error]: This script must be run as root. Aborting. " print LINE_ERROR print ERROR % msg print LINE_ERROR sys.exit() if len(sys.argv) < 3 or sys.argv[1] != " install " : configure_help = CheckAndHelp(sys.argv[0], " install " ) print configure_help sys.exit() check_argv = sys.argv[2 :] # print check_argv if " --instance-ports " not in str(check_argv) or " --innodb-buffer-pool-size " not in str(check_argv): print " python %s install --instance-ports=3366 --innodb-buffer-pool-size=1G " % sys.argv[0] sys.exit() filename = ' mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz ' filename2 = ' mysql-8.0.17-linux-glibc2.12-x86_64.tar ' if not os.path.exists(filename2): if not os.path.exists(filename): msg = " %s not exists! " % filename print LINE_ERROR print ERROR % msg print " wget http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-8.0/mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz " print LINE_ERROR sys.exit() else : commands.getstatusoutput( " xz -d %s " % (filename)) check_result = CheckArgv(check_argv) if check_result[ ' result_state ' ] == " false " : print check_result[ ' result ' ] else : # print check_result['result'] create_result = CreateConfigurationFiles(check_result[ ' result ' ]) for port in create_result[ ' --instance-ports ' ].split( ' , ' ): create_result[ ' --instance-ports ' ] = port create_file_result = CheckReplaceFile(create_result) # print create_file_result if create_file_result[ ' result_state ' ] == " true " : msg = " Configuration File %s Create Success " % create_file_result[ ' result ' ] print LINE print INFO % msg print LINE install_result = InstallMysql(create_result, filename2) # install_result = CfgMysql(create_result) if install_result == " true " : commands.getstatusoutput( ' source /etc/profile ' ) install_finish_message = " Install MySQL Finish Port: %s " % port print LINE print INFO % install_finish_message print LINE
my.cnf 配置文件:
# # # my.cnf for MySQL8.17 # # # # [client] port = $--instance- ports socket = $--data-prefix/mysql$--instance-ports/mysql$--instance- ports.sock [mysql] prompt = " \u@\h[\d]> " no -auto- rehash [mysqld] user = $--mysql- user port = $--instance- ports basedir = $--base- prefix datadir = $--data-prefix/mysql$--instance-ports/ data socket = $--data-prefix/mysql$--instance-ports/mysql$--instance- ports.sock pid_file = $--log-prefix/mysql$--instance-ports/mysql$--instance- ports.pid # --- GLOBAL ---# server_id = $--server- id character_set_server = utf8mb4 collation_server = utf8mb4_unicode_ci # default_authentication_plugin = 'mysql_native_password' tmpdir = $--data-prefix/mysql$--instance-ports/ mysqltmp log_timestamps = SYSTEM log_error = $--log-prefix/mysql$--instance-ports/ error.log log_error_verbosity = 2 slow_query_log = 1 slow_query_log_file = $--log-prefix/mysql$--instance-ports/slowlogs/ mysql_slow.log long_query_time = 1 general_log_file = $--log-prefix/mysql$--instance-ports/ mysql_gene.log open_files_limit = 65535 thread_cache_size = 3000 table_open_cache = 1024 table_definition_cache = 1024 table_open_cache_instances = 64 thread_stack = 512K external -locking = FALSE sort_buffer_size = 4M join_buffer_size = 4M thread_cache_size = 5000 tmp_table_size = 32M max_heap_table_size = 32M slave_rows_search_algorithms = ' INDEX_SCAN,HASH_SCAN ' key_buffer_size = 32M read_buffer_size = 8M read_rnd_buffer_size = 4M bulk_insert_buffer_size = 64M myisam_sort_buffer_size = 128M myisam_max_sort_file_size = 10G myisam_repair_threads = 1 lock_wait_timeout = 3600 lower_case_table_names = 1 explicit_defaults_for_timestamp = 1 innodb_thread_concurrency = 0 innodb_sync_spin_loops = 100 innodb_spin_wait_delay = 30 transaction_isolation = READ- COMMITTED # innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = $--innodb-buffer-pool- size innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_data_file_path = ibdata1:1G:autoextend innodb_log_buffer_size = 32M innodb_log_file_size = 2G innodb_log_files_in_group = 2 innodb_max_undo_log_size = 4G # --- REPL ---# log_bin = $--log-prefix/mysql$--instance-ports/binlogs/ mysql_bin binlog_rows_query_log_events = ON # for mysql8 binlog_expire_logs_seconds instead of binlog_expire_logs_days expire_logs_days = 30 binlog_checksum = 1 binlog_format = row binlog_cache_size = 4M max_binlog_cache_size = 2G max_binlog_size = 1G min_examined_row_limit = 100 log_slow_admin_statements = 1 log_slow_slave_statements = 1 log_queries_not_using_indexes = 0 log_slave_updates master_info_repository = TABLE relay_log_info_repository = TABLE skip_slave_start # --gtid gtid_mode = ON enforce_gtid_consistency = 1 # --flush disk innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 # --relay_log relay_log = relay- log relay_log_recovery = 1 relay_log_purge = 1 # --- NETWORK ---# max_allowed_packet = 128M back_log = 1024 interactive_timeout = 600 wait_timeout = 600 max_connections = 5000 skip_name_resolve = 1 max_connect_errors = 1000000 # --UNDO # innodb_undo_directory = ./ # innodb_undo_logs = 128 # innodb_undo_log_truncate = ON # The setting INNODB_UNDO_TABLESPACES is deprecated and is no longer used. InnoDB always creates 2 undo tablespaces to start with # innodb_undo_tablespaces = 3 # --并行复制 loose-binlog_transaction_dependency_tracking = WriteSet_Session loose -transaction_write_set_extraction = XXHASH64 slave_parallel_type = LOGICAL_CLOCK slave_parallel_workers = 8 # 根据您的服务器IOPS能力适当调整 # 一般配普通SSD盘的话,可以调整到 10000 - 20000 # 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000 innodb_io_capacity = 4000 innodb_io_capacity_max = 8000 innodb_flush_sync = 0 innodb_flush_neighbors = 0 innodb_write_io_threads = 8 innodb_read_io_threads = 8 innodb_purge_threads = 4 innodb_page_cleaners = 4 innodb_open_files = 65535 innodb_max_dirty_pages_pct = 50 innodb_flush_method = O_DIRECT innodb_lru_scan_depth = 4000 innodb_checksum_algorithm = crc32 innodb_lock_wait_timeout = 10 innodb_rollback_on_timeout = 1 innodb_print_all_deadlocks = 1 innodb_file_per_table = 1 innodb_online_alter_log_max_size = 4G # for mysql 8 this variables ls unknown # #internal_tmp_disk_storage_engine = InnoDB innodb_stats_on_metadata = 0 # some var for MySQL 5.7 # for mysql8.0 innodb_checksums is a unkown variables # innodb_checksums = 1 # innodb_file_format = Barracuda # innodb_file_format_max = Barracuda innodb_status_file = 1 # 注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log-error文件增长较快 innodb_status_output = 0 innodb_status_output_locks = 0 # performance_schema performance_schema = 1 performance_schema_instrument = ' %=on ' # innodb monitor innodb_monitor_enable= " module_innodb " innodb_monitor_enable = " module_server " innodb_monitor_enable = " module_dml " innodb_monitor_enable = " module_ddl " innodb_monitor_enable = " module_trx " innodb_monitor_enable = " module_os " innodb_monitor_enable = " module_purge " innodb_monitor_enable = " module_log " innodb_monitor_enable = " module_lock " innodb_monitor_enable = " module_buffer " innodb_monitor_enable = " module_index " innodb_monitor_enable = " module_ibuf_system " innodb_monitor_enable = " module_buffer_page " innodb_monitor_enable = " module_adaptive_hash " log_bin_trust_function_creators = 1 # group replication settings # plugin-load = "group_replication.so;validate_password.so;semisync_master.so;semisync_slave.so" # transaction-write-set-extraction = XXHASH64 # report_host = 172.31.92.104 # binlog_checksum = NONE # loose_group_replication = FORCE_PLUS_PERMANENT # loose_group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # loose_group_replication_compression_threshold = 100 # loose_group_replication_flow_control_mode = 0 # loose_group_replication_single_primary_mode = 1 # loose_group_replication_transaction_size_limit = 10485760 # loose_group_replication_unreachable_majority_timeout = 120 # loose_group_replication_start_on_boot = 0 # loose_group_replication_local_address = '172.31.92.104:6606' # loose_group_replication_group_seeds = '172.31.92.102:6606,172.31.92.103:6606,172.31.92.104:6606' # loose_group_replication_ip_whitelist= '172.31.92.0/20' [mysqldump] quick
守护进程脚本:
#! / bin / sh # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB # This file is public domain and comes with NO WARRANTY of any kind # MySQL daemon start / stop script. # Usually this is put in / etc / init.d (at least on machines SYSV R4 based # systems) and linked to / etc / rc3.d / S99mysql and / etc / rc0.d / K01mysql. # When this is done the mysql server will be started when the machine is # started and shut down when the systems goes down. # Comments to support chkconfig on RedHat Linux # chkconfig: 2345 64 36 # description: A very fast and reliable SQL database engine. # Comments to support LSB init script conventions ### BEGIN INIT INFO # Provides: mysql # Required - Start: $local_fs $network $remote_fs # Should - Start: ypbind nscd ldap ntpd xntpd # Required - Stop: $local_fs $network $remote_fs # Default - Start: 2 3 4 5 # Default - Stop: 0 1 6 # Short - Description: start and stop MySQL # Description: MySQL is a very fast and reliable SQL database engine. ### END INIT INFO # If you install MySQL on some other places than / usr / local / mysql, then you # have to do one of the following things for this script to work : # # - Run this script from within the MySQL installation directory # - Create a / etc / my.cnf file with the following information: # [ mysqld ] # basedir =< path - to - mysql - installation - directory > # - Add the above to any other configuration file ( for example ~/ .my.ini) # and copy my_print_defaults to / usr / bin # - Add the path to the mysql - installation - directory to the basedir variable # below. # # If you want to affect other MySQL variables, you should make your changes # in the / etc / my.cnf, ~/ .my.cnf or other MySQL configuration files. # If you change base dir, you must also change datadir. These may get # overwritten by settings in the MySQL configuration files. basedir = datadir = # Default value, in seconds, afterwhich the script should timeout waiting # for server start. # Value here is overriden by value in my.cnf. # 0 means don ' t wait at all # Negative numbers mean to wait indefinitely service_startup_timeout=900 # Lock directory for RedHat / SuSE. lockdir= ' / var / lock / subsys ' lock_file_path="$lockdir/mysql" # The following variables are only set for letting mysql.server find things. # Set some defaults mysqld_pid_file_path= if test -z "$basedir" then basedir=/usr/local/mysql bindir=/usr/local/mysql/bin if test -z "$datadir" then datadir=/usr/local/mysql/data fi sbindir=/usr/local/mysql/bin libexecdir=/usr/local/mysql/bin else bindir="$basedir/bin" if test -z "$datadir" then datadir="$basedir/data" fi sbindir="$basedir/sbin" libexecdir="$basedir/libexec" fi # datadir_set is used to determine if datadir was set (and so should be # *not* set inside of the --basedir= handler.) datadir_set= # # Use LSB init script functions for printing messages, if possible # lsb_functions="/lib/lsb/init-functions" if test -f $lsb_functions ; then . $lsb_functions else log_success_msg() { echo " SUCCESS! $@" } log_failure_msg() { echo " ERROR! $@" } fi PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin" export PATH mode=$1 # start or stop [ $# -ge 1 ] && shift other_args="$*" # uncommon, but needed when called from an RPM upgrade action # Expected: "--skip-networking --skip-grant-tables" # They are not checked here, intentionally, as it is the resposibility # of the "spec" file author to give correct arguments only. case `echo "testing\c"`,`echo -n testing` in *c*,-n*) echo_n= echo_c= ;; *c*,*) echo_n=-n echo_c= ;; *) echo_n= echo_c= ' \c ' ;; esac parse_server_arguments() { for arg do case "$arg" in --basedir=*) basedir=`echo "$arg" | sed -e ' s /^ [ ^= ] *=// ' ` bindir="$basedir/bin" if test -z "$datadir_set"; then datadir="$basedir/data" fi sbindir="$basedir/sbin" libexecdir="$basedir/libexec" ;; --datadir=*) datadir=`echo "$arg" | sed -e ' s /^ [ ^= ] *=// ' ` datadir_set=1 ;; --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e ' s /^ [ ^= ] *=// ' ` ;; --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e ' s /^ [ ^= ] *=// ' ` ;; esac done } wait_for_pid () { verb="$1" # created | removed pid="$2" # process ID of the program operating on the pid-file pid_file_path="$3" # path to the PID file. i=0 avoid_race_condition="by checking again" while test $i -ne $service_startup_timeout ; do case "$verb" in ' created ' ) # wait for a PID-file to pop into existence. test -s "$pid_file_path" && i= '' && break ;; ' removed ' ) # wait for this PID-file to disappear test ! -s "$pid_file_path" && i= '' && break ;; *) echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path" exit 1 ;; esac # if server isn ' t running, then pid - file will never be updated if test - n "$pid"; then if kill - 0 "$pid" 2 >/ dev / null ; then : # the server still runs else # The server may have exited between the last pid - file check and now. if test - n "$avoid_race_condition"; then avoid_race_condition = "" continue # Check again. fi # there ' s nothing that will affect the file. log_failure_msg "The server quit without updating PID file ($pid_file_path)." return 1 # not waiting any more. fi fi echo $echo_n ".$echo_c" i=`expr $i + 1` sleep 1 done if test -z "$i" ; then log_success_msg return 0 else log_failure_msg return 1 fi } # Get arguments from the my.cnf file, # the only group, which is read from now on is [mysqld] if test -x "$bindir/my_print_defaults"; then print_defaults="$bindir/my_print_defaults" else # Try to find basedir in /etc/my.cnf conf="{MYCNF-DIR}" print_defaults= if test -r $conf then subpat= ' ^ [ ^= ] * basedir [ ^= ] *= \(. * \)$ ' dirs=`sed -e "/$subpat/!d" -e ' s // \ 1 / ' $conf` for d in $dirs do d=`echo $d | sed -e ' s / [ ] // g ' ` if test -x "$d/bin/my_print_defaults" then print_defaults="$d/bin/my_print_defaults" break fi done fi # Hope it ' s in the PATH ... but I doubt it test - z "$print_defaults" && print_defaults = "my_print_defaults" fi # # Read defaults file from ' basedir ' . If there is no defaults file there # check if it ' s in the old (depricated) place (datadir) and read it from there # extra_args="" if test -r "$basedir/my.cnf" then extra_args="-e $basedir/my.cnf" fi parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server` # # Set pid file if not given # if test -z "$mysqld_pid_file_path" then mysqld_pid_file_path=$datadir/`hostname`.pid else case "$mysqld_pid_file_path" in /* ) ;; * ) mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;; esac fi case "$mode" in ' start ' ) # Start daemon # Safeguard (relative paths, core dumps..) cd $basedir echo $echo_n "Starting MySQL" if test -x $bindir/mysqld_safe then # Give extra arguments to mysqld with the my.cnf file. This script # may be overwritten at next upgrade. #$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null & #this is mysql original script for start {BIN-DIR}/mysqld_safe --defaults-file="{MYCNF-DIR}" >/dev/null 2>&1 & #wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$? #this is mysql original script for start wait_for_pid created "$!" "{PID-DIR}"; return_value=$? # Make lock for RedHat / SuSE if test -w "$lockdir" then touch "$lock_file_path" fi exit $return_value else log_failure_msg "Couldn ' t find MySQL server ({BIN - DIR} / mysqld_safe)" fi ;; ' stop ' ) # Stop daemon. We use a signal here to avoid having to know the # root password. mysqld_pid_file_path = {PID - DIR} if test - s "$mysqld_pid_file_path" then # signal mysqld_safe that it needs to stop touch "$mysqld_pid_file_path. shutdown " mysqld_pid = `cat "$mysqld_pid_file_path"` if ( kill - 0 $mysqld_pid 2 >/ dev / null ) then echo $echo_n "Shutting down MySQL" kill $mysqld_pid # mysqld should remove the pid file when it exits, so wait for it. wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value = $? else log_failure_msg "MySQL server process #$mysqld_pid is not running!" rm "$mysqld_pid_file_path" fi # Delete lock for RedHat / SuSE if test - f "$lock_file_path" then rm - f "$lock_file_path" fi exit $return_value else log_failure_msg "MySQL server PID file could not be found!" fi ;; ' restart ' ) # Stop the service and regardless of whether it was # running or not , start it again. if $ 0 stop $other_args; then $ 0 start $other_args else log_failure_msg "Failed to stop running server, so refusing to try to start." exit 1 fi ;; ' reload ' | ' force-reload ' ) if test - s "$mysqld_pid_file_path" ; then read mysqld_pid < "$mysqld_pid_file_path" kill - HUP $mysqld_pid && log_success_msg "Reloading service MySQL" touch "$mysqld_pid_file_path" else log_failure_msg "MySQL PID file could not be found!" exit 1 fi ;; ' status ' ) # First, check to see if pid file exists mysqld_pid_file_path = {PID - DIR} if test - s "$mysqld_pid_file_path" ; then read mysqld_pid < "$mysqld_pid_file_path" if kill - 0 $mysqld_pid 2 >/ dev / null ; then log_success_msg "MySQL running ($mysqld_pid)" exit 0 else log_failure_msg "MySQL is not running, but PID file exists " exit 1 fi else # Try to find appropriate mysqld process mysqld_pid = `pidof $libexecdir / mysqld` # test if multiple pids exist pid_count = `echo $mysqld_pid | wc - w` if test $pid_count - gt 1 ; then log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)" exit 5 elif test - z $mysqld_pid ; then if test - f "$lock_file_path" ; then log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists " exit 2 fi log_failure_msg "MySQL is not running" exit 3 else log_failure_msg "MySQL is running but PID file could not be found" exit 4 fi fi ;; * ) # usage basename = `basename "$ 0 "` echo "Usage: $basename {start | stop | restart | reload | force - reload | status} [ MySQL server options ] " exit 1 ;; esac exit 0