MySQL数据库数据归档回收工具使用场景分享-爱可生( 二 )


pt-heartbeat 提供了一种更为准确的观测手法 , 简要逻辑如下:

  • 1. 在 Master 上循环插入:insert into database.heartbeat (master_now) values(NOW())
  • 2. database.heartbeat 的变更会跟随主从复制流向从库
  • 3. 系统当前时间 - 从库表中的时间 = 从库实际的复制延时
使用方式如下
# 向Master开启循环插入时间戳, interval为每次插入的间隔时间pt-heartbeat -D delay_checker --create-table --interval=5 --update -h 172.20.134.1,P=5722,u=repl,p=repl# 检查指定从库的复制延迟pt-heartbeat -D delay_checker--check 172.20.134.2,P=5722,u=repl,p=repl# PS: 上面这条命令会使用当前系统的时间减去 delay_checker.heartbeat表中的时间.# 如果在从库上执行,需要保证从库的系统时间与主库一致.否则会导致延迟计算错误更简单的参数配置建议 pt-variable-advisor
toolkit 中包含了一个简单的 MySQL 参数优化器 , 可以对参数配置做简单的优化建议 。
[root@172-20-134-1 /]# pt-variable-advisor h=172.20.134.1,P=5722,u=repl,p=repl# WARN delay_key_write: MyISAM index blocks are never flushed until necessary.# WARN innodb_log_buffer_size: The InnoDB log buffer size generally should not be set larger than 16MB.# NOTE innodb_max_dirty_pages_pct: The innodb_max_dirty_pages_pct is lower than the default.# NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB.# NOTE port: The server is listening on a non-default port.# NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.# WARN expire_logs_days: Binary logs are enabled, but automatic purging is not enabled.# NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.# WARN log_output: Directing log output to tables has a high performance impact.# WARN myisam_recover_options: myisam_recover_options should be set to some value such as BACKUP,FORCE to ensure that table corruption is noticed.更易用的调试工具 pt-pmp
在某些情况下 , 我们肯定会遇到某些故障无法从日志 , 以及状态命令中找到原因 , 需要深入到程序逻辑级别 。
又或者我们需要立即通过非常规手段恢复故障数据库 , 但是又想保留足够多的故障信息 。 来避免我们事后复现问题的头疼 。
pt-pmp 便是在这种场景下帮助我们的工具 。 它会使用 gdb 来打印 mysqld 的堆栈信息 , 并把调用链相同的线程堆栈合并 。
堆栈合并的功能对于 MySQL 这种多线程的应用非常有帮助 , 会节省我们大量的时间 。
# pt-pmp --binary /path/to/bin/mysqld --pid 11788Sat Dec 21 23:14:06 CST 2019#第一列为线程数量第二列为线程调用栈信息180 poll(libc.so.6),vio_io_wait(viosocket.c:797),vio_socket_io_wait(viosocket.c:88),vio_read(viosocket.c:143),net_read_raw_loop(net_serv.cc:694),net_read_packet_header(net_serv.cc:778),net_read_packet(net_serv.cc:778),my_net_read(net_serv.cc:921),Protocol_classic::read_packet(protocol_classic.cc:815),Protocol_classic::get_command(protocol_classic.cc:972),do_command(sql_parse.cc:971),handle_connection(connection_handler_per_thread.cc:313),pfs_spawn_thread(pfs.cc:2197),start_thread(libpthread.so.0),clone(libc.so.6)57 pthread_cond_wait,native_cond_wait(thr_cond.h:147),my_cond_wait(thr_cond.h:147),inline_mysql_cond_wait(thr_cond.h:147),Per_thread_connection_handler::block_until_new_connection(thr_cond.h:147),handle_connection(connection_handler_per_thread.cc:344),pfs_spawn_thread(pfs.cc:2197),start_thread(libpthread.so.0),clone(libc.so.6)30 __io_getevents_0_4(libaio.so.1),LinuxAIOHandler::collect(os0file.cc:2513),LinuxAIOHandler::poll(os0file.cc:2673),os_aio_linux_handler(os0file.cc:2729),os_aio_handler(os0file.cc:2729),fil_aio_wait(fil0fil.cc:5862),io_handler_thread(srv0start.cc:319),start_thread(libpthread.so.0),clone(libc.so.6)9 pthread_cond_wait,wait(os0event.cc:179),os_event::wait_low(os0event.cc:179),srv_worker_thread(srv0srv.cc:2527),start_thread(libpthread.so.0),clone(libc.so.6)9 pthread_cond_wait,wait(os0event.cc:179),os_event::wait_low(os0event.cc:179),buf_flush_page_cleaner_worker(buf0flu.cc:3507),start_thread(libpthread.so.0),clone(libc.so.6)3 sigwait(libpthread.so.0),signal_hand(mysqld.cc:2132),pfs_spawn_thread(pfs.cc:2197),start_thread(libpthread.so.0),clone(libc.so.6)3 sigwaitinfo(libc.so.6),timer_notify_thread_func(posix_timers.c:89),pfs_spawn_thread(pfs.cc:2197),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_wait,wait(os0event.cc:179),os_event::wait_low(os0event.cc:179),srv_purge_coordinator_suspend(srv0srv.cc:2683),srv_purge_coordinator_thread(srv0srv.cc:2683),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_wait,wait(os0event.cc:179),os_event::wait_low(os0event.cc:179),buf_resize_thread(buf0buf.cc:3027),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_wait,wait(os0event.cc:179),os_event::wait_low(os0event.cc:179),buf_dump_thread(buf0dump.cc:792),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_wait,native_cond_wait(thr_cond.h:147),my_cond_wait(thr_cond.h:147),inline_mysql_cond_wait(thr_cond.h:147),compress_gtid_table(thr_cond.h:147),pfs_spawn_thread(pfs.cc:2197),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_timedwait,os_event::timed_wait(os0event.cc:316),os_event::wait_time_low(os0event.cc:488),srv_monitor_thread(srv0srv.cc:1592),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_timedwait,os_event::timed_wait(os0event.cc:316),os_event::wait_time_low(os0event.cc:488),srv_error_monitor_thread(srv0srv.cc:1758),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_timedwait,os_event::timed_wait(os0event.cc:316),os_event::wait_time_low(os0event.cc:488),pc_sleep_if_needed(buf0flu.cc:2700),buf_flush_page_cleaner_coordinator(buf0flu.cc:2700),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_timedwait,os_event::timed_wait(os0event.cc:316),os_event::wait_time_low(os0event.cc:488),lock_wait_timeout_thread(lock0wait.cc:497),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_timedwait,os_event::timed_wait(os0event.cc:316),os_event::wait_time_low(os0event.cc:488),ib_wqueue_timedwait(ut0wqueue.cc:168),fts_optimize_thread(fts0opt.cc:2910),start_thread(libpthread.so.0),clone(libc.so.6)3 pthread_cond_timedwait,os_event::timed_wait(os0event.cc:316),os_event::wait_time_low(os0event.cc:488),dict_stats_thread(dict0stats_bg.cc:435),start_thread(libpthread.so.0),clone(libc.so.6)3 poll(libc.so.6),Mysqld_socket_listener::listen_for_connection_event(socket_connection.cc:859),connection_event_loop(connection_acceptor.h:73),mysqld_main(connection_acceptor.h:73),__libc_start_main(libc.so.6),_start3 nanosleep(libpthread.so.0),os_thread_sleep(os0thread.cc:287),srv_master_sleep(srv0srv.cc:2337),srv_master_thread(srv0srv.cc:2337),start_thread(libpthread.so.0),clone(libc.so.6)


推荐阅读