python脚本-mysql for 817

系统 1341 0

更新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
            
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论