示例#1
0
def check_mysql(host, port, username, password, server_id, tags):
    try:
        conn = MySQLdb.connect(host=host,
                               user=username,
                               passwd=password,
                               port=int(port),
                               connect_timeout=3,
                               charset='utf8')
        cur = conn.cursor()
        conn.select_db('information_schema')
        #cur.execute('flush hosts;')
        ############################# CHECK MYSQL ####################################################
        mysql_variables = func.get_mysql_variables(cur)
        mysql_status = func.get_mysql_status(cur)
        time.sleep(1)
        mysql_status_2 = func.get_mysql_status(cur)
        ############################# GET VARIABLES ###################################################
        version = func.get_item(mysql_variables, 'version')
        key_buffer_size = func.get_item(mysql_variables, 'key_buffer_size')
        sort_buffer_size = func.get_item(mysql_variables, 'sort_buffer_size')
        join_buffer_size = func.get_item(mysql_variables, 'join_buffer_size')
        max_connections = func.get_item(mysql_variables, 'max_connections')
        max_connect_errors = func.get_item(mysql_variables,
                                           'max_connect_errors')
        open_files_limit = func.get_item(mysql_variables, 'open_files_limit')
        table_open_cache = func.get_item(mysql_variables, 'table_open_cache')
        max_tmp_tables = func.get_item(mysql_variables, 'max_tmp_tables')
        max_heap_table_size = func.get_item(mysql_variables,
                                            'max_heap_table_size')
        max_allowed_packet = func.get_item(mysql_variables,
                                           'max_allowed_packet')
        ############################# GET INNODB INFO ##################################################
        #innodb variables
        innodb_version = func.get_item(mysql_variables, 'innodb_version')
        innodb_buffer_pool_instances = func.get_item(
            mysql_variables, 'innodb_buffer_pool_instances')
        innodb_buffer_pool_size = func.get_item(mysql_variables,
                                                'innodb_buffer_pool_size')
        innodb_doublewrite = func.get_item(mysql_variables,
                                           'innodb_doublewrite')
        innodb_file_per_table = func.get_item(mysql_variables,
                                              'innodb_file_per_table')
        innodb_flush_log_at_trx_commit = func.get_item(
            mysql_variables, 'innodb_flush_log_at_trx_commit')
        innodb_flush_method = func.get_item(mysql_variables,
                                            'innodb_flush_method')
        innodb_force_recovery = func.get_item(mysql_variables,
                                              'innodb_force_recovery')
        innodb_io_capacity = func.get_item(mysql_variables,
                                           'innodb_io_capacity')
        innodb_read_io_threads = func.get_item(mysql_variables,
                                               'innodb_read_io_threads')
        innodb_write_io_threads = func.get_item(mysql_variables,
                                                'innodb_write_io_threads')
        #innodb status
        innodb_buffer_pool_pages_total = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_total'))
        innodb_buffer_pool_pages_data = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_data'))
        innodb_buffer_pool_pages_dirty = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_dirty'))
        innodb_buffer_pool_pages_flushed = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_flushed'))
        innodb_buffer_pool_pages_free = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_free'))
        innodb_buffer_pool_pages_misc = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_misc'))
        innodb_page_size = int(func.get_item(mysql_status, 'Innodb_page_size'))
        innodb_pages_created = int(
            func.get_item(mysql_status, 'Innodb_pages_created'))
        innodb_pages_read = int(
            func.get_item(mysql_status, 'Innodb_pages_read'))
        innodb_pages_written = int(
            func.get_item(mysql_status, 'Innodb_pages_written'))
        innodb_row_lock_current_waits = int(
            func.get_item(mysql_status, 'Innodb_row_lock_current_waits'))
        #innodb persecond info
        innodb_buffer_pool_read_requests_persecond = int(
            func.get_item(
                mysql_status_2, 'Innodb_buffer_pool_read_requests')) - int(
                    func.get_item(mysql_status,
                                  'Innodb_buffer_pool_read_requests'))
        innodb_buffer_pool_reads_persecond = int(
            func.get_item(mysql_status_2, 'Innodb_buffer_pool_reads')) - int(
                func.get_item(mysql_status, 'Innodb_buffer_pool_reads'))
        innodb_buffer_pool_write_requests_persecond = int(
            func.get_item(
                mysql_status_2, 'Innodb_buffer_pool_write_requests')) - int(
                    func.get_item(mysql_status,
                                  'Innodb_buffer_pool_write_requests'))
        innodb_buffer_pool_pages_flushed_persecond = int(
            func.get_item(
                mysql_status_2, 'Innodb_buffer_pool_pages_flushed')) - int(
                    func.get_item(mysql_status,
                                  'Innodb_buffer_pool_pages_flushed'))
        innodb_rows_deleted_persecond = int(
            func.get_item(mysql_status_2, 'Innodb_rows_deleted')) - int(
                func.get_item(mysql_status, 'Innodb_rows_deleted'))
        innodb_rows_inserted_persecond = int(
            func.get_item(mysql_status_2, 'Innodb_rows_inserted')) - int(
                func.get_item(mysql_status, 'Innodb_rows_inserted'))
        innodb_rows_read_persecond = int(
            func.get_item(mysql_status_2, 'Innodb_rows_read')) - int(
                func.get_item(mysql_status, 'Innodb_rows_read'))
        innodb_rows_updated_persecond = int(
            func.get_item(mysql_status_2, 'Innodb_rows_updated')) - int(
                func.get_item(mysql_status, 'Innodb_rows_updated'))
        ############################# GET STATUS ##################################################
        connect = 1
        uptime = func.get_item(mysql_status, 'Uptime')
        open_files = func.get_item(mysql_status, 'Open_files')
        open_tables = func.get_item(mysql_status, 'Open_tables')
        threads_connected = func.get_item(mysql_status, 'Threads_connected')
        threads_running = func.get_item(mysql_status, 'Threads_running')
        threads_created = func.get_item(mysql_status, 'Threads_created')
        threads_cached = func.get_item(mysql_status, 'Threads_cached')
        threads_waits = mysql.get_waits(conn)
        connections = func.get_item(mysql_status, 'Connections')
        aborted_clients = func.get_item(mysql_status, 'Aborted_clients')
        aborted_connects = func.get_item(mysql_status, 'Aborted_connects')
        key_blocks_not_flushed = func.get_item(mysql_status,
                                               'Key_blocks_not_flushed')
        key_blocks_unused = func.get_item(mysql_status, 'Key_blocks_unused')
        key_blocks_used = func.get_item(mysql_status, 'Key_blocks_used')
        ############################# GET STATUS PERSECOND ##################################################
        connections_persecond = int(
            func.get_item(mysql_status_2, 'Connections')) - int(
                func.get_item(mysql_status, 'Connections'))
        bytes_received_persecond = (
            int(func.get_item(mysql_status_2, 'Bytes_received')) -
            int(func.get_item(mysql_status, 'Bytes_received'))) / 1024
        bytes_sent_persecond = (
            int(func.get_item(mysql_status_2, 'Bytes_sent')) -
            int(func.get_item(mysql_status, 'Bytes_sent'))) / 1024
        com_select_persecond = int(func.get_item(
            mysql_status_2, 'Com_select')) - int(
                func.get_item(mysql_status, 'Com_select'))
        com_insert_persecond = int(func.get_item(
            mysql_status_2, 'Com_insert')) - int(
                func.get_item(mysql_status, 'Com_insert'))
        com_update_persecond = int(func.get_item(
            mysql_status_2, 'Com_update')) - int(
                func.get_item(mysql_status, 'Com_update'))
        com_delete_persecond = int(func.get_item(
            mysql_status_2, 'Com_delete')) - int(
                func.get_item(mysql_status, 'Com_delete'))
        com_commit_persecond = int(func.get_item(
            mysql_status_2, 'Com_commit')) - int(
                func.get_item(mysql_status, 'Com_commit'))
        com_rollback_persecond = int(
            func.get_item(mysql_status_2, 'Com_rollback')) - int(
                func.get_item(mysql_status, 'Com_rollback'))
        questions_persecond = int(func.get_item(
            mysql_status_2, 'Questions')) - int(
                func.get_item(mysql_status, 'Questions'))
        queries_persecond = int(func.get_item(
            mysql_status_2, 'Queries')) - int(
                func.get_item(mysql_status, 'Queries'))
        transaction_persecond = (
            int(func.get_item(mysql_status_2, 'Com_commit')) +
            int(func.get_item(mysql_status_2, 'Com_rollback'))) - (
                int(func.get_item(mysql_status, 'Com_commit')) +
                int(func.get_item(mysql_status, 'Com_rollback')))
        created_tmp_disk_tables_persecond = int(
            func.get_item(mysql_status_2, 'Created_tmp_disk_tables')) - int(
                func.get_item(mysql_status, 'Created_tmp_disk_tables'))
        created_tmp_files_persecond = int(
            func.get_item(mysql_status_2, 'Created_tmp_files')) - int(
                func.get_item(mysql_status, 'Created_tmp_files'))
        created_tmp_tables_persecond = int(
            func.get_item(mysql_status_2, 'Created_tmp_tables')) - int(
                func.get_item(mysql_status, 'Created_tmp_tables'))
        table_locks_immediate_persecond = int(
            func.get_item(mysql_status_2, 'Table_locks_immediate')) - int(
                func.get_item(mysql_status, 'Table_locks_immediate'))
        table_locks_waited_persecond = int(
            func.get_item(mysql_status_2, 'Table_locks_waited')) - int(
                func.get_item(mysql_status, 'Table_locks_waited'))
        key_read_requests_persecond = int(
            func.get_item(mysql_status_2, 'Key_read_requests')) - int(
                func.get_item(mysql_status, 'Key_read_requests'))
        key_reads_persecond = int(func.get_item(
            mysql_status_2, 'Key_reads')) - int(
                func.get_item(mysql_status, 'Key_reads'))
        key_write_requests_persecond = int(
            func.get_item(mysql_status_2, 'Key_write_requests')) - int(
                func.get_item(mysql_status, 'Key_write_requests'))
        key_writes_persecond = int(func.get_item(
            mysql_status_2, 'Key_writes')) - int(
                func.get_item(mysql_status, 'Key_writes'))
        ############################# GET MYSQL HITRATE ##################################################
        if (string.atof(func.get_item(mysql_status, 'Qcache_hits')) +
                string.atof(func.get_item(mysql_status, 'Com_select'))) <> 0:
            query_cache_hitrate = string.atof(
                func.get_item(mysql_status, 'Qcache_hits')) / (
                    string.atof(func.get_item(mysql_status, 'Qcache_hits')) +
                    string.atof(func.get_item(mysql_status, 'Com_select')))
            query_cache_hitrate = "%9.2f" % query_cache_hitrate
        else:
            query_cache_hitrate = 0

        if string.atof(func.get_item(mysql_status, 'Connections')) <> 0:
            thread_cache_hitrate = 1 - string.atof(
                func.get_item(mysql_status, 'Threads_created')) / string.atof(
                    func.get_item(mysql_status, 'Connections'))
            thread_cache_hitrate = "%9.2f" % thread_cache_hitrate
        else:
            thread_cache_hitrate = 0

        if string.atof(func.get_item(mysql_status, 'Key_read_requests')) <> 0:
            key_buffer_read_rate = 1 - string.atof(
                func.get_item(mysql_status, 'Key_reads')) / string.atof(
                    func.get_item(mysql_status, 'Key_read_requests'))
            key_buffer_read_rate = "%9.2f" % key_buffer_read_rate
        else:
            key_buffer_read_rate = 0

        if string.atof(func.get_item(mysql_status, 'Key_write_requests')) <> 0:
            key_buffer_write_rate = 1 - string.atof(
                func.get_item(mysql_status, 'Key_writes')) / string.atof(
                    func.get_item(mysql_status, 'Key_write_requests'))
            key_buffer_write_rate = "%9.2f" % key_buffer_write_rate
        else:
            key_buffer_write_rate = 0

        if (string.atof(func.get_item(mysql_status, 'Key_blocks_used')) +
                string.atof(func.get_item(mysql_status,
                                          'Key_blocks_unused'))) <> 0:
            key_blocks_used_rate = string.atof(
                func.get_item(mysql_status, 'Key_blocks_used')
            ) / (string.atof(func.get_item(mysql_status, 'Key_blocks_used')) +
                 string.atof(func.get_item(mysql_status, 'Key_blocks_unused')))
            key_blocks_used_rate = "%9.2f" % key_blocks_used_rate
        else:
            key_blocks_used_rate = 0

        if (string.atof(func.get_item(
                mysql_status, 'Created_tmp_disk_tables')) + string.atof(
                    func.get_item(mysql_status, 'Created_tmp_tables'))) <> 0:
            created_tmp_disk_tables_rate = string.atof(
                func.get_item(mysql_status, 'Created_tmp_disk_tables')) / (
                    string.atof(
                        func.get_item(mysql_status, 'Created_tmp_disk_tables'))
                    + string.atof(
                        func.get_item(mysql_status, 'Created_tmp_tables')))
            created_tmp_disk_tables_rate = "%9.2f" % created_tmp_disk_tables_rate
        else:
            created_tmp_disk_tables_rate = 0

        if string.atof(max_connections) <> 0:
            connections_usage_rate = string.atof(
                threads_connected) / string.atof(max_connections)
            connections_usage_rate = "%9.2f" % connections_usage_rate
        else:
            connections_usage_rate = 0

        if string.atof(open_files_limit) <> 0:
            open_files_usage_rate = string.atof(open_files) / string.atof(
                open_files_limit)
            open_files_usage_rate = "%9.2f" % open_files_usage_rate
        else:
            open_files_usage_rate = 0

        if string.atof(table_open_cache) <> 0:
            open_tables_usage_rate = string.atof(open_tables) / string.atof(
                table_open_cache)
            open_tables_usage_rate = "%9.2f" % open_tables_usage_rate
        else:
            open_tables_usage_rate = 0

        #repl
        slave_status = cur.execute('show slave status;')
        if slave_status <> 0:
            role = 'slave'
            role_new = 's'
        else:
            role = 'master'
            role_new = 'm'

        ############################# INSERT INTO SERVER ##################################################
        sql = "insert into mysql_status(server_id,host,port,tags,connect,role,uptime,version,max_connections,max_connect_errors,open_files_limit,table_open_cache,max_tmp_tables,max_heap_table_size,max_allowed_packet,open_files,open_tables,threads_connected,threads_running,threads_waits,threads_created,threads_cached,connections,aborted_clients,aborted_connects,connections_persecond,bytes_received_persecond,bytes_sent_persecond,com_select_persecond,com_insert_persecond,com_update_persecond,com_delete_persecond,com_commit_persecond,com_rollback_persecond,questions_persecond,queries_persecond,transaction_persecond,created_tmp_tables_persecond,created_tmp_disk_tables_persecond,created_tmp_files_persecond,table_locks_immediate_persecond,table_locks_waited_persecond,key_buffer_size,sort_buffer_size,join_buffer_size,key_blocks_not_flushed,key_blocks_unused,key_blocks_used,key_read_requests_persecond,key_reads_persecond,key_write_requests_persecond,key_writes_persecond,innodb_version,innodb_buffer_pool_instances,innodb_buffer_pool_size,innodb_doublewrite,innodb_file_per_table,innodb_flush_log_at_trx_commit,innodb_flush_method,innodb_force_recovery,innodb_io_capacity,innodb_read_io_threads,innodb_write_io_threads,innodb_buffer_pool_pages_total,innodb_buffer_pool_pages_data,innodb_buffer_pool_pages_dirty,innodb_buffer_pool_pages_flushed,innodb_buffer_pool_pages_free,innodb_buffer_pool_pages_misc,innodb_page_size,innodb_pages_created,innodb_pages_read,innodb_pages_written,innodb_row_lock_current_waits,innodb_buffer_pool_pages_flushed_persecond,innodb_buffer_pool_read_requests_persecond,innodb_buffer_pool_reads_persecond,innodb_buffer_pool_write_requests_persecond,innodb_rows_read_persecond,innodb_rows_inserted_persecond,innodb_rows_updated_persecond,innodb_rows_deleted_persecond,query_cache_hitrate,thread_cache_hitrate,key_buffer_read_rate,key_buffer_write_rate,key_blocks_used_rate,created_tmp_disk_tables_rate,connections_usage_rate,open_files_usage_rate,open_tables_usage_rate) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);"
        param = (
            server_id, host, port, tags, connect, role, uptime, version,
            max_connections, max_connect_errors, open_files_limit,
            table_open_cache, max_tmp_tables, max_heap_table_size,
            max_allowed_packet, open_files, open_tables, threads_connected,
            threads_running, threads_waits, threads_created, threads_cached,
            connections, aborted_clients, aborted_connects,
            connections_persecond, bytes_received_persecond,
            bytes_sent_persecond, com_select_persecond, com_insert_persecond,
            com_update_persecond, com_delete_persecond, com_commit_persecond,
            com_rollback_persecond, questions_persecond, queries_persecond,
            transaction_persecond, created_tmp_tables_persecond,
            created_tmp_disk_tables_persecond, created_tmp_files_persecond,
            table_locks_immediate_persecond, table_locks_waited_persecond,
            key_buffer_size, sort_buffer_size, join_buffer_size,
            key_blocks_not_flushed, key_blocks_unused, key_blocks_used,
            key_read_requests_persecond, key_reads_persecond,
            key_write_requests_persecond, key_writes_persecond, innodb_version,
            innodb_buffer_pool_instances, innodb_buffer_pool_size,
            innodb_doublewrite, innodb_file_per_table,
            innodb_flush_log_at_trx_commit, innodb_flush_method,
            innodb_force_recovery, innodb_io_capacity, innodb_read_io_threads,
            innodb_write_io_threads, innodb_buffer_pool_pages_total,
            innodb_buffer_pool_pages_data, innodb_buffer_pool_pages_dirty,
            innodb_buffer_pool_pages_flushed, innodb_buffer_pool_pages_free,
            innodb_buffer_pool_pages_misc, innodb_page_size,
            innodb_pages_created, innodb_pages_read, innodb_pages_written,
            innodb_row_lock_current_waits,
            innodb_buffer_pool_pages_flushed_persecond,
            innodb_buffer_pool_read_requests_persecond,
            innodb_buffer_pool_reads_persecond,
            innodb_buffer_pool_write_requests_persecond,
            innodb_rows_read_persecond, innodb_rows_inserted_persecond,
            innodb_rows_updated_persecond, innodb_rows_deleted_persecond,
            query_cache_hitrate, thread_cache_hitrate, key_buffer_read_rate,
            key_buffer_write_rate, key_blocks_used_rate,
            created_tmp_disk_tables_rate, connections_usage_rate,
            open_files_usage_rate, open_tables_usage_rate)
        func.mysql_exec(sql, param)
        func.update_db_status_init(role_new, version, host, port, tags)

        #check mysql process
        processlist = cur.execute(
            "select * from information_schema.processlist where DB !='information_schema' and command !='Sleep';"
        )
        if processlist:
            for line in cur.fetchall():
                sql = "insert into mysql_processlist(server_id,host,port,tags,pid,p_user,p_host,p_db,command,time,status,info) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
                param = (server_id, host, port, tags, line[0], line[1],
                         line[2], line[3], line[4], line[5], line[6], line[7])
                func.mysql_exec(sql, param)

        #check mysql connected
        connected = cur.execute(
            "select SUBSTRING_INDEX(host,':',1) as connect_server, user connect_user,db connect_db, count(SUBSTRING_INDEX(host,':',1)) as connect_count  from information_schema.processlist where db is not null and db!='information_schema' and db !='performance_schema' group by connect_server ;"
        )
        if connected:
            for line in cur.fetchall():
                sql = "insert into mysql_connected(server_id,host,port,tags,connect_server,connect_user,connect_db,connect_count) values(%s,%s,%s,%s,%s,%s,%s,%s);"
                param = (server_id, host, port, tags, line[0], line[1],
                         line[2], line[3])
                func.mysql_exec(sql, param)

        #check mysql replication
        master_thread = cur.execute(
            "select * from information_schema.processlist where COMMAND = 'Binlog Dump' or COMMAND = 'Binlog Dump GTID';"
        )
        slave_status = cur.execute('show slave status;')
        datalist = []
        if master_thread >= 1:
            datalist.append(int(1))
            if slave_status <> 0:
                datalist.append(int(1))
            else:
                datalist.append(int(0))
        else:
            datalist.append(int(0))
            if slave_status <> 0:
                datalist.append(int(1))
            else:
                datalist.append(int(0))

        if slave_status <> 0:
            gtid_mode = cur.execute(
                "select * from information_schema.global_variables where variable_name='gtid_mode';"
            )
            result = cur.fetchone()
            if result:
                gtid_mode = result[1]
            else:
                gtid_mode = 'OFF'
            datalist.append(gtid_mode)
            read_only = cur.execute(
                "select * from information_schema.global_variables where variable_name='read_only';"
            )
            result = cur.fetchone()
            datalist.append(result[1])
            slave_info = cur.execute('show slave status;')
            result = cur.fetchone()
            master_server = result[1]
            master_port = result[3]
            slave_io_run = result[10]
            slave_sql_run = result[11]
            delay = result[32]
            current_binlog_file = result[9]
            current_binlog_pos = result[21]
            master_binlog_file = result[5]
            master_binlog_pos = result[6]

            datalist.append(master_server)
            datalist.append(master_port)
            datalist.append(slave_io_run)
            datalist.append(slave_sql_run)
            datalist.append(delay)
            datalist.append(current_binlog_file)
            datalist.append(current_binlog_pos)
            datalist.append(master_binlog_file)
            datalist.append(master_binlog_pos)
            datalist.append(0)

        elif master_thread >= 1:
            gtid_mode = cur.execute(
                "select * from information_schema.global_variables where variable_name='gtid_mode';"
            )
            result = cur.fetchone()
            if result:
                gtid_mode = result[1]
            else:
                gtid_mode = 'OFF'
            datalist.append(gtid_mode)
            read_only = cur.execute(
                "select * from information_schema.global_variables where variable_name='read_only';"
            )
            result = cur.fetchone()
            datalist.append(result[1])
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            master = cur.execute('show master status;')
            master_result = cur.fetchone()
            datalist.append(master_result[0])
            datalist.append(master_result[1])
            binlog_file = cur.execute('show master logs;')
            binlogs = 0
            if binlog_file:
                for row in cur.fetchall():
                    binlogs = binlogs + row[1]
                datalist.append(binlogs)
        else:
            datalist = []

        result = datalist
        if result:
            sql = "insert into mysql_replication(server_id,tags,host,port,is_master,is_slave,gtid_mode,read_only,master_server,master_port,slave_io_run,slave_sql_run,delay,current_binlog_file,current_binlog_pos,master_binlog_file,master_binlog_pos,master_binlog_space) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
            param = (server_id, tags, host, port, result[0], result[1],
                     result[2], result[3], result[4], result[5], result[6],
                     result[7], result[8], result[9], result[10], result[11],
                     result[12], result[13])
            func.mysql_exec(sql, param)

        cur.close()
        exit

    except MySQLdb.Error, e:
        logger_msg = "check mysql %s:%s failure: %d %s" % (
            host, port, e.args[0], e.args[1])
        logger.warning(logger_msg)
        logger_msg = "check mysql %s:%s failure: sleep 3 seconds and check again." % (
            host, port)
        logger.warning(logger_msg)
        time.sleep(3)
        try:
            conn = MySQLdb.connect(host=host,
                                   user=username,
                                   passwd=password,
                                   port=int(port),
                                   connect_timeout=3,
                                   charset='utf8')
            cur = conn.cursor()
            conn.select_db('information_schema')
        except MySQLdb.Error, e:
            logger_msg = "check mysql second %s:%s failure: %d %s" % (
                host, port, e.args[0], e.args[1])
            logger.warning(logger_msg)
            connect = 0
            sql = "insert into mysql_status(server_id,host,port,tags,connect) values(%s,%s,%s,%s,%s)"
            param = (server_id, host, port, tags, connect)
            func.mysql_exec(sql, param)
示例#2
0
            % (server_id), '')
        func.mysql_exec(
            'delete from mysql_bigtable where server_id = %s;' % (server_id),
            '')

        logger.info(
            "Generate mysql instance information for server: %s port: %s begin:"
            % (host, port))

        cur = conn.cursor()
        conn.select_db('information_schema')
        #cur.execute('flush hosts;')

        ############################# CHECK MYSQL ####################################################
        mysql_variables = func.get_mysql_variables(cur)
        mysql_status = func.get_mysql_status(cur)
        time.sleep(1)
        mysql_status_2 = func.get_mysql_status(cur)

        ############################# GET VARIABLES ###################################################
        version = func.get_item(mysql_variables, 'version')
        key_buffer_size = func.get_item(mysql_variables, 'key_buffer_size')
        sort_buffer_size = func.get_item(mysql_variables, 'sort_buffer_size')
        join_buffer_size = func.get_item(mysql_variables, 'join_buffer_size')
        max_connections = func.get_item(mysql_variables, 'max_connections')
        max_connect_errors = func.get_item(mysql_variables,
                                           'max_connect_errors')
        open_files_limit = func.get_item(mysql_variables, 'open_files_limit')
        table_open_cache = func.get_item(mysql_variables, 'table_open_cache')
        max_tmp_tables = func.get_item(mysql_variables, 'max_tmp_tables')
        max_heap_table_size = func.get_item(mysql_variables,
示例#3
0
def check_mysql(host,port,username,password,server_id,tags):
    try:
        conn=MySQLdb.connect(host=host,user=username,passwd=password,port=int(port),connect_timeout=3,charset='utf8')
        cur=conn.cursor()
        conn.select_db('information_schema')
        #cur.execute('flush hosts;')
        ############################# CHECK MYSQL ####################################################
        mysql_variables = func.get_mysql_variables(cur)
        mysql_status = func.get_mysql_status(cur)       
        time.sleep(1)
        mysql_status_2 = func.get_mysql_status(cur)
        ############################# GET VARIABLES ###################################################
        version = func.get_item(mysql_variables,'version')
        key_buffer_size = func.get_item(mysql_variables,'key_buffer_size')
        sort_buffer_size = func.get_item(mysql_variables,'sort_buffer_size')
        join_buffer_size = func.get_item(mysql_variables,'join_buffer_size')
        max_connections = func.get_item(mysql_variables,'max_connections')
        max_connect_errors = func.get_item(mysql_variables,'max_connect_errors')
        open_files_limit = func.get_item(mysql_variables,'open_files_limit')
        table_open_cache = func.get_item(mysql_variables,'table_open_cache')
        max_tmp_tables = func.get_item(mysql_variables,'max_tmp_tables')
        max_heap_table_size = func.get_item(mysql_variables,'max_heap_table_size')
        max_allowed_packet = func.get_item(mysql_variables,'max_allowed_packet')
        ############################# GET INNODB INFO ##################################################
        #innodb variables
        innodb_version = func.get_item(mysql_variables,'innodb_version')
        innodb_buffer_pool_instances = func.get_item(mysql_variables,'innodb_buffer_pool_instances')
        innodb_buffer_pool_size = func.get_item(mysql_variables,'innodb_buffer_pool_size')
        innodb_doublewrite = func.get_item(mysql_variables,'innodb_doublewrite')
        innodb_file_per_table = func.get_item(mysql_variables,'innodb_file_per_table')
        innodb_flush_log_at_trx_commit = func.get_item(mysql_variables,'innodb_flush_log_at_trx_commit')
        innodb_flush_method = func.get_item(mysql_variables,'innodb_flush_method')
        innodb_force_recovery = func.get_item(mysql_variables,'innodb_force_recovery')
        innodb_io_capacity = func.get_item(mysql_variables,'innodb_io_capacity')
        innodb_read_io_threads = func.get_item(mysql_variables,'innodb_read_io_threads')
        innodb_write_io_threads = func.get_item(mysql_variables,'innodb_write_io_threads')
        #innodb status
        innodb_buffer_pool_pages_total = int(func.get_item(mysql_status,'Innodb_buffer_pool_pages_total'))
        innodb_buffer_pool_pages_data = int(func.get_item(mysql_status,'Innodb_buffer_pool_pages_data'))
        innodb_buffer_pool_pages_dirty = int(func.get_item(mysql_status,'Innodb_buffer_pool_pages_dirty'))
        innodb_buffer_pool_pages_flushed = int(func.get_item(mysql_status,'Innodb_buffer_pool_pages_flushed'))
        innodb_buffer_pool_pages_free = int(func.get_item(mysql_status,'Innodb_buffer_pool_pages_free'))
        innodb_buffer_pool_pages_misc = int(func.get_item(mysql_status,'Innodb_buffer_pool_pages_misc'))
        innodb_page_size = int(func.get_item(mysql_status,'Innodb_page_size'))
        innodb_pages_created = int(func.get_item(mysql_status,'Innodb_pages_created'))
        innodb_pages_read = int(func.get_item(mysql_status,'Innodb_pages_read'))
        innodb_pages_written = int(func.get_item(mysql_status,'Innodb_pages_written'))
        innodb_row_lock_current_waits = int(func.get_item(mysql_status,'Innodb_row_lock_current_waits'))
        #innodb persecond info
        innodb_buffer_pool_read_requests_persecond = int(func.get_item(mysql_status_2,'Innodb_buffer_pool_read_requests')) - int(func.get_item(mysql_status,'Innodb_buffer_pool_read_requests'))
        innodb_buffer_pool_reads_persecond = int(func.get_item(mysql_status_2,'Innodb_buffer_pool_reads')) - int(func.get_item(mysql_status,'Innodb_buffer_pool_reads'))
        innodb_buffer_pool_write_requests_persecond = int(func.get_item(mysql_status_2,'Innodb_buffer_pool_write_requests')) - int(func.get_item(mysql_status,'Innodb_buffer_pool_write_requests'))
        innodb_buffer_pool_pages_flushed_persecond = int(func.get_item(mysql_status_2,'Innodb_buffer_pool_pages_flushed')) - int(func.get_item(mysql_status,'Innodb_buffer_pool_pages_flushed'))
        innodb_rows_deleted_persecond = int(func.get_item(mysql_status_2,'Innodb_rows_deleted')) - int(func.get_item(mysql_status,'Innodb_rows_deleted'))
        innodb_rows_inserted_persecond = int(func.get_item(mysql_status_2,'Innodb_rows_inserted')) - int(func.get_item(mysql_status,'Innodb_rows_inserted'))
        innodb_rows_read_persecond = int(func.get_item(mysql_status_2,'Innodb_rows_read')) - int(func.get_item(mysql_status,'Innodb_rows_read'))
        innodb_rows_updated_persecond = int(func.get_item(mysql_status_2,'Innodb_rows_updated')) - int(func.get_item(mysql_status,'Innodb_rows_updated'))
        ############################# GET STATUS ##################################################
        connect = 1
        uptime = func.get_item(mysql_status,'Uptime')
        open_files = func.get_item(mysql_status,'Open_files')
        open_tables = func.get_item(mysql_status,'Open_tables')
        threads_connected = func.get_item(mysql_status,'Threads_connected')
        threads_running = func.get_item(mysql_status,'Threads_running')
        threads_created = func.get_item(mysql_status,'Threads_created')
        threads_cached = func.get_item(mysql_status,'Threads_cached')
        threads_waits = mysql.get_waits(conn)
        connections = func.get_item(mysql_status,'Connections')
        aborted_clients = func.get_item(mysql_status,'Aborted_clients')
        aborted_connects = func.get_item(mysql_status,'Aborted_connects')
        key_blocks_not_flushed = func.get_item(mysql_status,'Key_blocks_not_flushed')
        key_blocks_unused = func.get_item(mysql_status,'Key_blocks_unused')
        key_blocks_used = func.get_item(mysql_status,'Key_blocks_used')
        ############################# GET STATUS PERSECOND ##################################################
        connections_persecond = int(func.get_item(mysql_status_2,'Connections')) - int(func.get_item(mysql_status,'Connections'))
        bytes_received_persecond = (int(func.get_item(mysql_status_2,'Bytes_received')) - int(func.get_item(mysql_status,'Bytes_received')))/1024
        bytes_sent_persecond = (int(func.get_item(mysql_status_2,'Bytes_sent')) - int(func.get_item(mysql_status,'Bytes_sent')))/1024
        com_select_persecond = int(func.get_item(mysql_status_2,'Com_select')) - int(func.get_item(mysql_status,'Com_select'))
        com_insert_persecond = int(func.get_item(mysql_status_2,'Com_insert')) - int(func.get_item(mysql_status,'Com_insert'))
        com_update_persecond = int(func.get_item(mysql_status_2,'Com_update')) - int(func.get_item(mysql_status,'Com_update'))
        com_delete_persecond = int(func.get_item(mysql_status_2,'Com_delete')) - int(func.get_item(mysql_status,'Com_delete'))
        com_commit_persecond = int(func.get_item(mysql_status_2,'Com_commit')) - int(func.get_item(mysql_status,'Com_commit'))
        com_rollback_persecond = int(func.get_item(mysql_status_2,'Com_rollback')) - int(func.get_item(mysql_status,'Com_rollback'))
        questions_persecond = int(func.get_item(mysql_status_2,'Questions')) - int(func.get_item(mysql_status,'Questions'))
        queries_persecond = int(func.get_item(mysql_status_2,'Queries')) - int(func.get_item(mysql_status,'Queries'))
        transaction_persecond = (int(func.get_item(mysql_status_2,'Com_commit')) + int(func.get_item(mysql_status_2,'Com_rollback'))) - (int(func.get_item(mysql_status,'Com_commit')) + int(func.get_item(mysql_status,'Com_rollback')))
        created_tmp_disk_tables_persecond = int(func.get_item(mysql_status_2,'Created_tmp_disk_tables')) - int(func.get_item(mysql_status,'Created_tmp_disk_tables'))
        created_tmp_files_persecond = int(func.get_item(mysql_status_2,'Created_tmp_files')) - int(func.get_item(mysql_status,'Created_tmp_files'))
        created_tmp_tables_persecond = int(func.get_item(mysql_status_2,'Created_tmp_tables')) - int(func.get_item(mysql_status,'Created_tmp_tables'))
        table_locks_immediate_persecond = int(func.get_item(mysql_status_2,'Table_locks_immediate')) - int(func.get_item(mysql_status,'Table_locks_immediate'))
        table_locks_waited_persecond = int(func.get_item(mysql_status_2,'Table_locks_waited')) - int(func.get_item(mysql_status,'Table_locks_waited'))
        key_read_requests_persecond = int(func.get_item(mysql_status_2,'Key_read_requests')) - int(func.get_item(mysql_status,'Key_read_requests'))
        key_reads_persecond = int(func.get_item(mysql_status_2,'Key_reads')) - int(func.get_item(mysql_status,'Key_reads'))
        key_write_requests_persecond = int(func.get_item(mysql_status_2,'Key_write_requests')) - int(func.get_item(mysql_status,'Key_write_requests'))
        key_writes_persecond = int(func.get_item(mysql_status_2,'Key_writes')) - int(func.get_item(mysql_status,'Key_writes'))
        ############################# GET MYSQL HITRATE ##################################################
        if (string.atof(func.get_item(mysql_status,'Qcache_hits')) + string.atof(func.get_item(mysql_status,'Com_select'))) <> 0:
            query_cache_hitrate = string.atof(func.get_item(mysql_status,'Qcache_hits')) / (string.atof(func.get_item(mysql_status,'Qcache_hits')) + string.atof(func.get_item(mysql_status,'Com_select')))
            query_cache_hitrate =  "%9.2f" %query_cache_hitrate
        else:
            query_cache_hitrate = 0

        if string.atof(func.get_item(mysql_status,'Connections')) <> 0:
            thread_cache_hitrate = 1 - string.atof(func.get_item(mysql_status,'Threads_created')) / string.atof(func.get_item(mysql_status,'Connections'))
            thread_cache_hitrate =  "%9.2f" %thread_cache_hitrate
        else:
            thread_cache_hitrate = 0

        if string.atof(func.get_item(mysql_status,'Key_read_requests')) <> 0:
            key_buffer_read_rate = 1 - string.atof(func.get_item(mysql_status,'Key_reads')) / string.atof(func.get_item(mysql_status,'Key_read_requests'))
            key_buffer_read_rate =  "%9.2f" %key_buffer_read_rate
        else:
            key_buffer_read_rate = 0

        if string.atof(func.get_item(mysql_status,'Key_write_requests')) <> 0:
            key_buffer_write_rate = 1 - string.atof(func.get_item(mysql_status,'Key_writes')) / string.atof(func.get_item(mysql_status,'Key_write_requests'))
            key_buffer_write_rate =  "%9.2f" %key_buffer_write_rate
        else:
            key_buffer_write_rate = 0
        
        if (string.atof(func.get_item(mysql_status,'Key_blocks_used'))+string.atof(func.get_item(mysql_status,'Key_blocks_unused'))) <> 0:
            key_blocks_used_rate = string.atof(func.get_item(mysql_status,'Key_blocks_used')) / (string.atof(func.get_item(mysql_status,'Key_blocks_used'))+string.atof(func.get_item(mysql_status,'Key_blocks_unused')))
            key_blocks_used_rate =  "%9.2f" %key_blocks_used_rate
        else:
            key_blocks_used_rate = 0

        if (string.atof(func.get_item(mysql_status,'Created_tmp_disk_tables'))+string.atof(func.get_item(mysql_status,'Created_tmp_tables'))) <> 0:
            created_tmp_disk_tables_rate = string.atof(func.get_item(mysql_status,'Created_tmp_disk_tables')) / (string.atof(func.get_item(mysql_status,'Created_tmp_disk_tables'))+string.atof(func.get_item(mysql_status,'Created_tmp_tables')))
            created_tmp_disk_tables_rate =  "%9.2f" %created_tmp_disk_tables_rate
        else:
            created_tmp_disk_tables_rate = 0

        if string.atof(max_connections) <> 0:
            connections_usage_rate = string.atof(threads_connected)/string.atof(max_connections)
            connections_usage_rate =  "%9.2f" %connections_usage_rate
        else:
            connections_usage_rate = 0

        if string.atof(open_files_limit) <> 0:            
            open_files_usage_rate = string.atof(open_files)/string.atof(open_files_limit)
            open_files_usage_rate =  "%9.2f" %open_files_usage_rate
        else:
            open_files_usage_rate = 0

        if string.atof(table_open_cache) <> 0:            
            open_tables_usage_rate = string.atof(open_tables)/string.atof(table_open_cache)
            open_tables_usage_rate =  "%9.2f" %open_tables_usage_rate
        else:
            open_tables_usage_rate = 0
  
        #repl
        slave_status=cur.execute('show slave status;')
        if slave_status <> 0:
            role='slave'
            role_new='s'
        else:
            role='master'
            role_new='m'

        ############################# INSERT INTO SERVER ##################################################
        sql = "insert into mysql_status(server_id,host,port,tags,connect,role,uptime,version,max_connections,max_connect_errors,open_files_limit,table_open_cache,max_tmp_tables,max_heap_table_size,max_allowed_packet,open_files,open_tables,threads_connected,threads_running,threads_waits,threads_created,threads_cached,connections,aborted_clients,aborted_connects,connections_persecond,bytes_received_persecond,bytes_sent_persecond,com_select_persecond,com_insert_persecond,com_update_persecond,com_delete_persecond,com_commit_persecond,com_rollback_persecond,questions_persecond,queries_persecond,transaction_persecond,created_tmp_tables_persecond,created_tmp_disk_tables_persecond,created_tmp_files_persecond,table_locks_immediate_persecond,table_locks_waited_persecond,key_buffer_size,sort_buffer_size,join_buffer_size,key_blocks_not_flushed,key_blocks_unused,key_blocks_used,key_read_requests_persecond,key_reads_persecond,key_write_requests_persecond,key_writes_persecond,innodb_version,innodb_buffer_pool_instances,innodb_buffer_pool_size,innodb_doublewrite,innodb_file_per_table,innodb_flush_log_at_trx_commit,innodb_flush_method,innodb_force_recovery,innodb_io_capacity,innodb_read_io_threads,innodb_write_io_threads,innodb_buffer_pool_pages_total,innodb_buffer_pool_pages_data,innodb_buffer_pool_pages_dirty,innodb_buffer_pool_pages_flushed,innodb_buffer_pool_pages_free,innodb_buffer_pool_pages_misc,innodb_page_size,innodb_pages_created,innodb_pages_read,innodb_pages_written,innodb_row_lock_current_waits,innodb_buffer_pool_pages_flushed_persecond,innodb_buffer_pool_read_requests_persecond,innodb_buffer_pool_reads_persecond,innodb_buffer_pool_write_requests_persecond,innodb_rows_read_persecond,innodb_rows_inserted_persecond,innodb_rows_updated_persecond,innodb_rows_deleted_persecond,query_cache_hitrate,thread_cache_hitrate,key_buffer_read_rate,key_buffer_write_rate,key_blocks_used_rate,created_tmp_disk_tables_rate,connections_usage_rate,open_files_usage_rate,open_tables_usage_rate) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);"
        param = (server_id,host,port,tags,connect,role,uptime,version,max_connections,max_connect_errors,open_files_limit,table_open_cache,max_tmp_tables,max_heap_table_size,max_allowed_packet,open_files,open_tables,threads_connected,threads_running,threads_waits,threads_created,threads_cached,connections,aborted_clients,aborted_connects,connections_persecond,bytes_received_persecond,bytes_sent_persecond,com_select_persecond,com_insert_persecond,com_update_persecond,com_delete_persecond,com_commit_persecond,com_rollback_persecond,questions_persecond,queries_persecond,transaction_persecond,created_tmp_tables_persecond,created_tmp_disk_tables_persecond,created_tmp_files_persecond,table_locks_immediate_persecond,table_locks_waited_persecond,key_buffer_size,sort_buffer_size,join_buffer_size,key_blocks_not_flushed,key_blocks_unused,key_blocks_used,key_read_requests_persecond,key_reads_persecond,key_write_requests_persecond,key_writes_persecond,innodb_version,innodb_buffer_pool_instances,innodb_buffer_pool_size,innodb_doublewrite,innodb_file_per_table,innodb_flush_log_at_trx_commit,innodb_flush_method,innodb_force_recovery,innodb_io_capacity,innodb_read_io_threads,innodb_write_io_threads,innodb_buffer_pool_pages_total,innodb_buffer_pool_pages_data,innodb_buffer_pool_pages_dirty,innodb_buffer_pool_pages_flushed,innodb_buffer_pool_pages_free,innodb_buffer_pool_pages_misc,innodb_page_size,innodb_pages_created,innodb_pages_read,innodb_pages_written,innodb_row_lock_current_waits,innodb_buffer_pool_pages_flushed_persecond,innodb_buffer_pool_read_requests_persecond,innodb_buffer_pool_reads_persecond,innodb_buffer_pool_write_requests_persecond,innodb_rows_read_persecond,innodb_rows_inserted_persecond,innodb_rows_updated_persecond,innodb_rows_deleted_persecond,query_cache_hitrate,thread_cache_hitrate,key_buffer_read_rate,key_buffer_write_rate,key_blocks_used_rate,created_tmp_disk_tables_rate,connections_usage_rate,open_files_usage_rate,open_tables_usage_rate)
        func.mysql_exec(sql,param)
        func.update_db_status_init(role_new,version,host,port,tags)

        #check mysql process
        processlist=cur.execute("select * from information_schema.processlist where DB !='information_schema' and command !='Sleep';")
        if processlist:
            for line in cur.fetchall():
                sql="insert into mysql_processlist(server_id,host,port,tags,pid,p_user,p_host,p_db,command,time,status,info) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
                param=(server_id,host,port,tags,line[0],line[1],line[2],line[3],line[4],line[5],line[6],line[7])
                func.mysql_exec(sql,param)

        #check mysql connected
        connected=cur.execute("select SUBSTRING_INDEX(host,':',1) as connect_server, user connect_user,db connect_db, count(SUBSTRING_INDEX(host,':',1)) as connect_count  from information_schema.processlist where db is not null and db!='information_schema' and db !='performance_schema' group by connect_server ;");
        if connected:
            for line in cur.fetchall():
                sql="insert into mysql_connected(server_id,host,port,tags,connect_server,connect_user,connect_db,connect_count) values(%s,%s,%s,%s,%s,%s,%s,%s);"
                param =(server_id,host,port,tags,line[0],line[1],line[2],line[3])
                func.mysql_exec(sql,param)

        #check mysql replication
        master_thread=cur.execute("select * from information_schema.processlist where COMMAND = 'Binlog Dump' or COMMAND = 'Binlog Dump GTID';")
        slave_status=cur.execute('show slave status;')
        datalist=[]
        if master_thread >= 1:
            datalist.append(int(1))
            if slave_status <> 0:
                datalist.append(int(1))
            else:
                datalist.append(int(0))
        else:
            datalist.append(int(0))
            if slave_status <> 0:
                datalist.append(int(1))
            else:
                datalist.append(int(0))


        if slave_status <> 0:
            gtid_mode=cur.execute("select * from information_schema.global_variables where variable_name='gtid_mode';")
            result=cur.fetchone()
            if result:
                gtid_mode=result[1]
            else:
                gtid_mode='OFF'
            datalist.append(gtid_mode)
            read_only=cur.execute("select * from information_schema.global_variables where variable_name='read_only';")
            result=cur.fetchone()
            datalist.append(result[1])
            slave_info=cur.execute('show slave status;')
            result=cur.fetchone()
            master_server=result[1]
            master_port=result[3]
            slave_io_run=result[10]
            slave_sql_run=result[11]
            delay=result[32]
            current_binlog_file=result[9]
            current_binlog_pos=result[21]
            master_binlog_file=result[5]
            master_binlog_pos=result[6]

            datalist.append(master_server)
            datalist.append(master_port)
            datalist.append(slave_io_run)
            datalist.append(slave_sql_run)
            datalist.append(delay)
            datalist.append(current_binlog_file)
            datalist.append(current_binlog_pos)
            datalist.append(master_binlog_file)
            datalist.append(master_binlog_pos)
            datalist.append(0)

        elif master_thread >= 1:
            gtid_mode=cur.execute("select * from information_schema.global_variables where variable_name='gtid_mode';")
            result=cur.fetchone()
            if result:
                gtid_mode=result[1]
            else:
                gtid_mode='OFF'
            datalist.append(gtid_mode)
            read_only=cur.execute("select * from information_schema.global_variables where variable_name='read_only';")
            result=cur.fetchone()
            datalist.append(result[1])
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            datalist.append('---')
            master=cur.execute('show master status;')
            master_result=cur.fetchone()
            datalist.append(master_result[0])
            datalist.append(master_result[1])
            binlog_file=cur.execute('show master logs;')
            binlogs=0
            if binlog_file:
                for row in cur.fetchall():
                    binlogs = binlogs + row[1]
                datalist.append(binlogs)
        else:
            datalist=[]

        result=datalist
        if result:
            sql="insert into mysql_replication(server_id,tags,host,port,is_master,is_slave,gtid_mode,read_only,master_server,master_port,slave_io_run,slave_sql_run,delay,current_binlog_file,current_binlog_pos,master_binlog_file,master_binlog_pos,master_binlog_space) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
            param=(server_id,tags,host,port,result[0],result[1],result[2],result[3],result[4],result[5],result[6],result[7],result[8],result[9],result[10],result[11],result[12],result[13])
            func.mysql_exec(sql,param)

        cur.close()
        exit

    except MySQLdb.Error,e:
        logger_msg="check mysql %s:%s failure: %d %s" %(host,port,e.args[0],e.args[1])
        logger.warning(logger_msg)
        logger_msg="check mysql %s:%s failure: sleep 3 seconds and check again." %(host,port)
        logger.warning(logger_msg)
        time.sleep(3)
        try:
            conn=MySQLdb.connect(host=host,user=username,passwd=password,port=int(port),connect_timeout=3,charset='utf8')
            cur=conn.cursor()
            conn.select_db('information_schema')
        except MySQLdb.Error,e:
            logger_msg="check mysql second %s:%s failure: %d %s" %(host,port,e.args[0],e.args[1])
            logger.warning(logger_msg)
            connect = 0
            sql="insert into mysql_status(server_id,host,port,tags,connect) values(%s,%s,%s,%s,%s)"
            param=(server_id,host,port,tags,connect)
            func.mysql_exec(sql,param)
示例#4
0
def check_mysql(host, port, username, password, server_id, tags):
    logger_msg = "[BBQ]begin check mysql %s:%s " % (host, port)
    logger.info(logger_msg)
    try:
        conn = MySQLdb.connect(host=host,
                               user=username,
                               passwd=password,
                               port=int(port),
                               connect_timeout=3,
                               charset='utf8')
        cur = conn.cursor()
        conn.select_db('information_schema')
        #cur.execute('flush hosts;')
        saveMysqlStatus = {}
        saveMysqlStatus['host'] = host
        saveMysqlStatus['port'] = port
        saveMysqlStatus['server_id'] = server_id
        saveMysqlStatus['tags'] = tags
        saveMysqlStatus['connect'] = 1
        ############################# CHECK MYSQL ####################################################
        mysql_variables = func.get_mysql_variables(cur)
        mysql_status = func.get_mysql_status(cur)
        logger_msg = "[BBQ]get mysql %s:%s status1 " % (host, port)
        logger.info(logger_msg)
        time.sleep(1)
        mysql_status_2 = func.get_mysql_status(cur)
        logger_msg = "[BBQ]get mysql %s:%s status2 " % (host, port)
        logger.info(logger_msg)
        ############################# GET VARIABLES ###################################################
        version = func.get_item(mysql_variables, 'version')
        saveMysqlStatus['version'] = version
        saveMysqlStatus['innodb_stats_on_metadata'] = func.get_item(
            mysql_variables, 'innodb_stats_on_metadata')
        saveMysqlStatus['sync_binlog'] = func.get_item(mysql_variables,
                                                       'sync_binlog')
        saveMysqlStatus['key_buffer_size'] = func.get_item(
            mysql_variables, 'key_buffer_size')
        saveMysqlStatus['sort_buffer_size'] = func.get_item(
            mysql_variables, 'sort_buffer_size')
        saveMysqlStatus['join_buffer_size'] = func.get_item(
            mysql_variables, 'join_buffer_size')
        saveMysqlStatus['max_connections'] = func.get_item(
            mysql_variables, 'max_connections')
        saveMysqlStatus['max_connect_errors'] = func.get_item(
            mysql_variables, 'max_connect_errors')
        saveMysqlStatus['open_files_limit'] = func.get_item(
            mysql_variables, 'open_files_limit')
        saveMysqlStatus['table_open_cache'] = func.get_item(
            mysql_variables, 'table_open_cache')
        saveMysqlStatus['max_tmp_tables'] = func.get_item(
            mysql_variables, 'max_tmp_tables')
        saveMysqlStatus['max_heap_table_size'] = func.get_item(
            mysql_variables, 'max_heap_table_size')
        saveMysqlStatus['max_allowed_packet'] = func.get_item(
            mysql_variables, 'max_allowed_packet')

        ############################# GET INNODB INFO ##################################################
        #innodb variables
        saveMysqlStatus['innodb_version'] = func.get_item(
            mysql_variables, 'innodb_version')
        saveMysqlStatus['innodb_buffer_pool_instances'] = func.get_item(
            mysql_variables, 'innodb_buffer_pool_instances')
        saveMysqlStatus['innodb_buffer_pool_size'] = func.get_item(
            mysql_variables, 'innodb_buffer_pool_size')
        saveMysqlStatus['innodb_doublewrite'] = func.get_item(
            mysql_variables, 'innodb_doublewrite')
        saveMysqlStatus['innodb_file_per_table'] = func.get_item(
            mysql_variables, 'innodb_file_per_table')
        saveMysqlStatus['innodb_flush_log_at_trx_commit'] = func.get_item(
            mysql_variables, 'innodb_flush_log_at_trx_commit')
        saveMysqlStatus['innodb_flush_method'] = func.get_item(
            mysql_variables, 'innodb_flush_method')
        saveMysqlStatus['innodb_force_recovery'] = func.get_item(
            mysql_variables, 'innodb_force_recovery')
        saveMysqlStatus['innodb_io_capacity'] = func.get_item(
            mysql_variables, 'innodb_io_capacity')
        saveMysqlStatus['innodb_read_io_threads'] = func.get_item(
            mysql_variables, 'innodb_read_io_threads')
        saveMysqlStatus['innodb_write_io_threads'] = func.get_item(
            mysql_variables, 'innodb_write_io_threads')
        #innodb status
        saveMysqlStatus['innodb_buffer_pool_pages_total'] = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_total'))
        saveMysqlStatus['innodb_buffer_pool_pages_data'] = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_data'))
        saveMysqlStatus['innodb_buffer_pool_pages_dirty'] = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_dirty'))
        saveMysqlStatus['innodb_buffer_pool_pages_flushed'] = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_flushed'))
        saveMysqlStatus['innodb_buffer_pool_pages_free'] = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_free'))
        saveMysqlStatus['innodb_buffer_pool_pages_misc'] = int(
            func.get_item(mysql_status, 'Innodb_buffer_pool_pages_misc'))
        saveMysqlStatus['innodb_page_size'] = int(
            func.get_item(mysql_status, 'Innodb_page_size'))
        saveMysqlStatus['innodb_pages_created'] = int(
            func.get_item(mysql_status, 'Innodb_pages_created'))
        saveMysqlStatus['innodb_pages_read'] = int(
            func.get_item(mysql_status, 'Innodb_pages_read'))
        saveMysqlStatus['innodb_pages_written'] = int(
            func.get_item(mysql_status, 'Innodb_pages_written'))
        saveMysqlStatus['innodb_row_lock_current_waits'] = int(
            func.get_item(mysql_status, 'Innodb_row_lock_current_waits'))
        #innodb persecond info
        saveMysqlStatus['innodb_buffer_pool_read_requests_persecond'] = int(
            func.get_item(
                mysql_status_2, 'Innodb_buffer_pool_read_requests')) - int(
                    func.get_item(mysql_status,
                                  'Innodb_buffer_pool_read_requests'))
        saveMysqlStatus['innodb_buffer_pool_reads_persecond'] = int(
            func.get_item(mysql_status_2, 'Innodb_buffer_pool_reads')) - int(
                func.get_item(mysql_status, 'Innodb_buffer_pool_reads'))
        saveMysqlStatus['innodb_buffer_pool_write_requests_persecond'] = int(
            func.get_item(
                mysql_status_2, 'Innodb_buffer_pool_write_requests')) - int(
                    func.get_item(mysql_status,
                                  'Innodb_buffer_pool_write_requests'))
        saveMysqlStatus['innodb_buffer_pool_pages_flushed_persecond'] = int(
            func.get_item(
                mysql_status_2, 'Innodb_buffer_pool_pages_flushed')) - int(
                    func.get_item(mysql_status,
                                  'Innodb_buffer_pool_pages_flushed'))
        saveMysqlStatus['innodb_rows_deleted_persecond'] = int(
            func.get_item(mysql_status_2, 'Innodb_rows_deleted')) - int(
                func.get_item(mysql_status, 'Innodb_rows_deleted'))
        saveMysqlStatus['innodb_rows_inserted_persecond'] = int(
            func.get_item(mysql_status_2, 'Innodb_rows_inserted')) - int(
                func.get_item(mysql_status, 'Innodb_rows_inserted'))
        saveMysqlStatus['innodb_rows_read_persecond'] = int(
            func.get_item(mysql_status_2, 'Innodb_rows_read')) - int(
                func.get_item(mysql_status, 'Innodb_rows_read'))
        saveMysqlStatus['innodb_rows_updated_persecond'] = int(
            func.get_item(mysql_status_2, 'Innodb_rows_updated')) - int(
                func.get_item(mysql_status, 'Innodb_rows_updated'))
        ############################# GET STATUS ##################################################
        saveMysqlStatus['uptime'] = func.get_item(mysql_status, 'Uptime')
        saveMysqlStatus['open_files'] = func.get_item(mysql_status,
                                                      'Open_files')
        saveMysqlStatus['open_tables'] = func.get_item(mysql_status,
                                                       'Open_tables')
        saveMysqlStatus['threads_connected'] = func.get_item(
            mysql_status, 'Threads_connected')
        saveMysqlStatus['threads_running'] = func.get_item(
            mysql_status, 'Threads_running')
        #saveMysqlStatus['threads_created'] = func.get_item(mysql_status,'Threads_created')
        saveMysqlStatus['threads_created'] = int(
            func.get_item(mysql_status_2, 'Threads_created')) - int(
                func.get_item(mysql_status, 'Threads_created'))
        saveMysqlStatus['threads_cached'] = func.get_item(
            mysql_status, 'Threads_cached')
        saveMysqlStatus['threads_waits'] = mysql.get_waits(conn)
        saveMysqlStatus['connections'] = func.get_item(mysql_status,
                                                       'Connections')
        saveMysqlStatus['aborted_clients'] = func.get_item(
            mysql_status, 'Aborted_clients')
        saveMysqlStatus['aborted_connects'] = func.get_item(
            mysql_status, 'Aborted_connects')
        saveMysqlStatus['key_blocks_not_flushed'] = func.get_item(
            mysql_status, 'Key_blocks_not_flushed')
        saveMysqlStatus['key_blocks_unused'] = func.get_item(
            mysql_status, 'Key_blocks_unused')
        saveMysqlStatus['key_blocks_used'] = func.get_item(
            mysql_status, 'Key_blocks_used')
        ############################# GET STATUS PERSECOND ##################################################
        saveMysqlStatus['connections_persecond'] = int(
            func.get_item(mysql_status_2, 'Connections')) - int(
                func.get_item(mysql_status, 'Connections'))
        saveMysqlStatus['bytes_received_persecond'] = (
            int(func.get_item(mysql_status_2, 'Bytes_received')) -
            int(func.get_item(mysql_status, 'Bytes_received'))) / 1024
        saveMysqlStatus['bytes_sent_persecond'] = (
            int(func.get_item(mysql_status_2, 'Bytes_sent')) -
            int(func.get_item(mysql_status, 'Bytes_sent'))) / 1024
        saveMysqlStatus['com_select_persecond'] = int(
            func.get_item(mysql_status_2, 'Com_select')) - int(
                func.get_item(mysql_status, 'Com_select'))
        saveMysqlStatus['com_insert_persecond'] = int(
            func.get_item(mysql_status_2, 'Com_insert')) - int(
                func.get_item(mysql_status, 'Com_insert'))
        saveMysqlStatus['com_update_persecond'] = int(
            func.get_item(mysql_status_2, 'Com_update')) - int(
                func.get_item(mysql_status, 'Com_update'))
        saveMysqlStatus['com_delete_persecond'] = int(
            func.get_item(mysql_status_2, 'Com_delete')) - int(
                func.get_item(mysql_status, 'Com_delete'))
        saveMysqlStatus['com_commit_persecond'] = int(
            func.get_item(mysql_status_2, 'Com_commit')) - int(
                func.get_item(mysql_status, 'Com_commit'))
        saveMysqlStatus['com_rollback_persecond'] = int(
            func.get_item(mysql_status_2, 'Com_rollback')) - int(
                func.get_item(mysql_status, 'Com_rollback'))
        saveMysqlStatus['questions_persecond'] = int(
            func.get_item(mysql_status_2, 'Questions')) - int(
                func.get_item(mysql_status, 'Questions'))
        saveMysqlStatus['queries_persecond'] = int(
            func.get_item(mysql_status_2, 'Queries')) - int(
                func.get_item(mysql_status, 'Queries'))
        saveMysqlStatus['transaction_persecond'] = (
            int(func.get_item(mysql_status_2, 'Com_commit')) +
            int(func.get_item(mysql_status_2, 'Com_rollback'))) - (
                int(func.get_item(mysql_status, 'Com_commit')) +
                int(func.get_item(mysql_status, 'Com_rollback')))
        saveMysqlStatus['created_tmp_disk_tables_persecond'] = int(
            func.get_item(mysql_status_2, 'Created_tmp_disk_tables')) - int(
                func.get_item(mysql_status, 'Created_tmp_disk_tables'))
        saveMysqlStatus['created_tmp_files_persecond'] = int(
            func.get_item(mysql_status_2, 'Created_tmp_files')) - int(
                func.get_item(mysql_status, 'Created_tmp_files'))
        saveMysqlStatus['created_tmp_tables_persecond'] = int(
            func.get_item(mysql_status_2, 'Created_tmp_tables')) - int(
                func.get_item(mysql_status, 'Created_tmp_tables'))
        saveMysqlStatus['table_locks_immediate_persecond'] = int(
            func.get_item(mysql_status_2, 'Table_locks_immediate')) - int(
                func.get_item(mysql_status, 'Table_locks_immediate'))
        saveMysqlStatus['table_locks_waited_persecond'] = int(
            func.get_item(mysql_status_2, 'Table_locks_waited')) - int(
                func.get_item(mysql_status, 'Table_locks_waited'))
        saveMysqlStatus['key_read_requests_persecond'] = int(
            func.get_item(mysql_status_2, 'Key_read_requests')) - int(
                func.get_item(mysql_status, 'Key_read_requests'))
        saveMysqlStatus['key_reads_persecond'] = int(
            func.get_item(mysql_status_2, 'Key_reads')) - int(
                func.get_item(mysql_status, 'Key_reads'))
        saveMysqlStatus['key_write_requests_persecond'] = int(
            func.get_item(mysql_status_2, 'Key_write_requests')) - int(
                func.get_item(mysql_status, 'Key_write_requests'))
        saveMysqlStatus['key_writes_persecond'] = int(
            func.get_item(mysql_status_2, 'Key_writes')) - int(
                func.get_item(mysql_status, 'Key_writes'))
        ############################# GET MYSQL HITRATE ##################################################
        if (string.atof(func.get_item(mysql_status, 'Qcache_hits')) +
                string.atof(func.get_item(mysql_status, 'Com_select'))) <> 0:
            query_cache_hitrate = string.atof(
                func.get_item(mysql_status, 'Qcache_hits')) / (
                    string.atof(func.get_item(mysql_status, 'Qcache_hits')) +
                    string.atof(func.get_item(mysql_status, 'Com_select')))
            query_cache_hitrate = "%9.2f" % query_cache_hitrate
        else:
            query_cache_hitrate = 0
        saveMysqlStatus['query_cache_hitrate'] = query_cache_hitrate

        if string.atof(func.get_item(mysql_status, 'Connections')) <> 0:
            thread_cache_hitrate = 1 - string.atof(
                func.get_item(mysql_status, 'Threads_created')) / string.atof(
                    func.get_item(mysql_status, 'Connections'))
            thread_cache_hitrate = "%9.2f" % thread_cache_hitrate
        else:
            thread_cache_hitrate = 0
        saveMysqlStatus['thread_cache_hitrate'] = thread_cache_hitrate

        if string.atof(func.get_item(mysql_status, 'Key_read_requests')) <> 0:
            key_buffer_read_rate = 1 - string.atof(
                func.get_item(mysql_status, 'Key_reads')) / string.atof(
                    func.get_item(mysql_status, 'Key_read_requests'))
            key_buffer_read_rate = "%9.2f" % key_buffer_read_rate
        else:
            key_buffer_read_rate = 0
        saveMysqlStatus['key_buffer_read_rate'] = key_buffer_read_rate

        if string.atof(func.get_item(mysql_status, 'Key_write_requests')) <> 0:
            key_buffer_write_rate = 1 - string.atof(
                func.get_item(mysql_status, 'Key_writes')) / string.atof(
                    func.get_item(mysql_status, 'Key_write_requests'))
            key_buffer_write_rate = "%9.2f" % key_buffer_write_rate
        else:
            key_buffer_write_rate = 0
        saveMysqlStatus['key_buffer_write_rate'] = key_buffer_write_rate

        if (string.atof(func.get_item(mysql_status, 'Key_blocks_used')) +
                string.atof(func.get_item(mysql_status,
                                          'Key_blocks_unused'))) <> 0:
            key_blocks_used_rate = string.atof(
                func.get_item(mysql_status, 'Key_blocks_used')
            ) / (string.atof(func.get_item(mysql_status, 'Key_blocks_used')) +
                 string.atof(func.get_item(mysql_status, 'Key_blocks_unused')))
            key_blocks_used_rate = "%9.2f" % key_blocks_used_rate
        else:
            key_blocks_used_rate = 0
        saveMysqlStatus['key_blocks_used_rate'] = key_blocks_used_rate

        if (string.atof(func.get_item(
                mysql_status, 'Created_tmp_disk_tables')) + string.atof(
                    func.get_item(mysql_status, 'Created_tmp_tables'))) <> 0:
            created_tmp_disk_tables_rate = string.atof(
                func.get_item(mysql_status, 'Created_tmp_disk_tables')) / (
                    string.atof(
                        func.get_item(mysql_status, 'Created_tmp_disk_tables'))
                    + string.atof(
                        func.get_item(mysql_status, 'Created_tmp_tables')))
            created_tmp_disk_tables_rate = "%9.2f" % created_tmp_disk_tables_rate
        else:
            created_tmp_disk_tables_rate = 0
        saveMysqlStatus[
            'created_tmp_disk_tables_rate'] = created_tmp_disk_tables_rate

        max_connections = saveMysqlStatus.get('max_connections')
        threads_connected = saveMysqlStatus.get('threads_connected')
        if string.atof(max_connections) <> 0:
            connections_usage_rate = string.atof(
                threads_connected) / string.atof(max_connections)
            connections_usage_rate = "%9.2f" % connections_usage_rate
        else:
            connections_usage_rate = 0
        saveMysqlStatus['connections_usage_rate'] = connections_usage_rate

        open_files_limit = saveMysqlStatus.get('open_files_limit')
        open_files = saveMysqlStatus.get('open_files')
        if string.atof(open_files_limit) <> 0:
            open_files_usage_rate = string.atof(open_files) / string.atof(
                open_files_limit)
            open_files_usage_rate = "%9.2f" % open_files_usage_rate
        else:
            open_files_usage_rate = 0
        saveMysqlStatus['open_files_usage_rate'] = open_files_usage_rate

        table_open_cache = saveMysqlStatus.get('table_open_cache')
        open_tables = saveMysqlStatus.get('open_tables')
        if string.atof(table_open_cache) <> 0:
            open_tables_usage_rate = string.atof(open_tables) / string.atof(
                table_open_cache)
            open_tables_usage_rate = "%9.2f" % open_tables_usage_rate
        else:
            open_tables_usage_rate = 0
        saveMysqlStatus['open_tables_usage_rate'] = open_tables_usage_rate

        #repl
        read_only = func.get_item(mysql_variables, 'read_only')
        slave_hosts = cur.execute('show slave hosts;')
        slave_status = cur.execute('show slave status;')
        if (slave_status == 0) or (slave_status <> 0 and slave_hosts > 0 and
                                   (not cmp(read_only, "OFF"))):
            role = 'master'
            role_new = 'm'
        else:
            role = 'slave'
            role_new = 's'
        saveMysqlStatus['role'] = role

        ############################# disk size          ##################################################
        disk_size_m = 0
        saveMysqlStatus['disk_size_m'] = disk_size_m

        ############################# INSERT INTO SERVER ##################################################
        updSqls = []
        updSqls.append(
            "replace into mysql_status_history SELECT *,LEFT(REPLACE(REPLACE(REPLACE(create_time,'-',''),' ',''),':',''),12) from mysql_status where host='%s' and port=%s"
            % (host, port))
        updSqls.append("delete from mysql_status where host='%s' and port=%s" %
                       (host, port))
        cols = []
        vals = []
        for key, val in saveMysqlStatus.iteritems():
            cols.append(key)
            vals.append(str(val))
        insSql = "insert into mysql_status(%s) VALUES ('%s')" % (
            ",".join(cols), "','".join(vals))
        updSqls.append(insSql)
        #logger.info(updSqls)
        func.mysql_exec_many(updSqls)
        logger_msg = "[BBQ]save mysql %s:%s status " % (host, port)
        logger.info(logger_msg)
        func.update_db_status_init(server_id, role_new, version, host, port,
                                   tags)

        # save other
        func.other_save("mysql_status", saveMysqlStatus)

        #check mysql process
        processlist = cur.execute(
            'select * from information_schema.processlist where DB !="information_schema" and command !="Sleep";'
        )
        if processlist:
            for line in cur.fetchall():
                sql = "insert into mysql_processlist(server_id,host,port,tags,pid,p_user,p_host,p_db,command,time,status,info) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
                param = (server_id, host, port, tags, line[0], line[1],
                         line[2], line[3], line[4], line[5], line[6], line[7])
                func.mysql_exec(sql, param)

        #check mysql connected
        connected = cur.execute(
            "select SUBSTRING_INDEX(host,':',1) as connect_server, user connect_user,db connect_db, count(SUBSTRING_INDEX(host,':',1)) as connect_count  from information_schema.processlist where db is not null and db!='information_schema' and db !='performance_schema' group by connect_server, connect_user, connect_db ;"
        )
        if connected:
            for line in cur.fetchall():
                sql = "insert into mysql_connected(server_id,host,port,tags,connect_server,connect_user,connect_db,connect_count) values(%s,%s,%s,%s,%s,%s,%s,%s);"
                param = (server_id, host, port, tags, line[0], line[1],
                         line[2], line[3])
                func.mysql_exec(sql, param)

        #check mysql replication
        master_thread = cur.execute(
            "select * from information_schema.processlist where COMMAND = 'Binlog Dump' or COMMAND = 'Binlog Dump GTID';"
        )
        slave_status = cur.execute('show slave status;')
        datalist = []
        if master_thread >= 1:
            datalist.append(int(1))
            if not cmp("slave", role):
                datalist.append(int(1))
            else:
                datalist.append(int(0))
        else:
            datalist.append(int(0))
            if not cmp("slave", role):
                datalist.append(int(1))
            else:
                datalist.append(int(0))

        gtid_mode = cur.execute(
            "select * from information_schema.global_variables where variable_name='gtid_mode';"
        )
        result = cur.fetchone()
        if result:
            gtid_mode = result[1]
        else:
            gtid_mode = 'OFF'
        datalist.append(gtid_mode)

        read_only = cur.execute(
            "show variables where variable_name like 'read_only';")
        result = cur.fetchone()
        datalist.append(result[1])

        master_binlog_file = '---'
        master_binlog_pos = '---'
        master_binlog_space = 0
        slave_info = cur.execute('show slave status;')
        if slave_info == 0:
            for i in range(0, 7):
                datalist.append('-1')
        else:
            result = cur.fetchone()
            master_server = result[1]
            master_port = result[3]
            master_binlog_file = result[5]
            master_binlog_pos = result[6]
            current_binlog_file = result[9]
            slave_io_run = result[10]
            slave_sql_run = result[11]
            current_binlog_pos = result[21]
            delay = result[32]
            # delay use hearbeat
            masterHosts = func.mysql_query(
                "select host from db_servers_mysql where host='%s' or replicate_ip='%s' limit 1"
                % (master_server, master_server))
            if masterHosts != 0:
                masterHost = masterHosts[0][0]
                connMaster = MySQLdb.connect(host=masterHost,
                                             user=username,
                                             passwd=password,
                                             port=int(master_port),
                                             connect_timeout=3,
                                             charset='utf8')
                curMaster = connMaster.cursor()
                connMaster.select_db('information_schema')
                master_variables = func.get_mysql_variables(curMaster)
                master_server_id = master_variables.get("server_id")
                connMaster.close()
                # query delay by master_server_id
                qHb = "select UNIX_TIMESTAMP()-UNIX_TIMESTAMP(STR_TO_DATE(substring_index(ts,'.',1),'%%Y-%%m-%%dT%%H:%%i:%%s')) as d from dhdba.heartbeat where server_id='%s';" % (
                    master_server_id)
                cur.execute(qHb)
                lines = cur.fetchone()
                if lines:
                    delay = int(lines[0])
                    if delay < 0:
                        delay = 0
            datalist.append(master_server)
            datalist.append(master_port)
            datalist.append(slave_io_run)
            datalist.append(slave_sql_run)
            datalist.append(delay)
            datalist.append(current_binlog_file)
            datalist.append(current_binlog_pos)
        master = cur.execute('show master status;')
        if master != 0:
            master_result = cur.fetchone()
            master_binlog_file = master_result[0]
            master_binlog_pos = master_result[1]
        binlog_file = cur.execute('show master logs;')
        if binlog_file:
            for row in cur.fetchall():
                master_binlog_space = master_binlog_space + int(row[1])

        datalist.append(master_binlog_file)
        datalist.append(master_binlog_pos)
        datalist.append(master_binlog_space)

        result = datalist
        if result:
            func.mysql_exec(
                "replace into mysql_replication_history SELECT *,LEFT(REPLACE(REPLACE(REPLACE(create_time,'-',''),' ',''),':',''),12) from mysql_replication where host='%s' and port=%s"
                % (host, port), '')
            func.mysql_exec(
                "delete from mysql_replication where host='%s' and port=%s" %
                (host, port), '')
            sql = "insert into mysql_replication(server_id,tags,host,port,is_master,is_slave,gtid_mode,read_only,master_server,master_port,slave_io_run,slave_sql_run,delay,current_binlog_file,current_binlog_pos,master_binlog_file,master_binlog_pos,master_binlog_space) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
            param = (server_id, tags, host, port, result[0], result[1],
                     result[2], result[3], result[4], result[5], result[6],
                     result[7], result[8], result[9], result[10], result[11],
                     result[12], result[13])
            func.mysql_exec(sql, param)

        cur.close()
    except MySQLdb.Error, e:
        logger_msg = "check mysql %s:%s failure: %d %s" % (
            host, port, e.args[0], e.args[1])
        logger.warning(logger_msg)
        logger_msg = "check mysql %s:%s failure: sleep 3 seconds and check again." % (
            host, port)
        logger.warning(logger_msg)
        time.sleep(3)
        try:
            conn = MySQLdb.connect(host=host,
                                   user=username,
                                   passwd=password,
                                   port=int(port),
                                   connect_timeout=3,
                                   charset='utf8')
            cur = conn.cursor()
            conn.select_db('information_schema')
        except MySQLdb.Error, e:
            logger_msg = "check mysql second %s:%s failure: %d %s" % (
                host, port, e.args[0], e.args[1])
            logger.warning(logger_msg)
            connect = 0
            sql = "replace into mysql_status(server_id,host,port,tags,connect) values(%s,%s,%s,%s,%s)"
            param = (server_id, host, port, tags, connect)
            func.mysql_exec(sql, param)