From 9a79e6379d6e975077273444b25918a1b699e468 Mon Sep 17 00:00:00 2001 From: "agent.develop" Date: Tue, 22 Sep 2026 13:56:48 +0800 Subject: [PATCH] =?UTF-8?q?deliver:=20=E4=BA=A4=E4=BB=98=E6=94=B6=E5=8F=A3?= =?UTF-8?q?=EF=BC=88=E5=BC=95=E6=93=8E=E4=BB=A3=E4=B8=BA=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .rtx5tmp/before.sql | 237 ++++ .rtx5tmp/d/aria_log_control | Bin 52 -> 0 bytes .rtx5tmp/d/mysql/innodb_index_stats.ibd | Bin 65536 -> 0 bytes .rtx5tmp/{d => db}/aria_log.00000001 | Bin 417792 -> 417792 bytes .rtx5tmp/db/aria_log_control | Bin 0 -> 52 bytes .rtx5tmp/{d/mysql => db/exp}/db.opt | 0 .../db/exp/pbl_runtime_event#P#p202609.ibd | Bin 0 -> 196608 bytes .../db/exp/pbl_runtime_event#P#p202610.ibd | Bin 0 -> 196608 bytes .../db/exp/pbl_runtime_event#P#p202611.ibd | Bin 0 -> 196608 bytes .../db/exp/pbl_runtime_event#P#p202612.ibd | Bin 0 -> 196608 bytes .../db/exp/pbl_runtime_event#P#p202701.ibd | Bin 0 -> 196608 bytes .../db/exp/pbl_runtime_event#P#p202702.ibd | Bin 0 -> 196608 bytes .rtx5tmp/db/exp/pbl_runtime_event#P#pmax.ibd | Bin 0 -> 196608 bytes .rtx5tmp/db/exp/pbl_runtime_event.frm | Bin 0 -> 9786 bytes .rtx5tmp/db/exp/pbl_runtime_event.par | Bin 0 -> 108 bytes .rtx5tmp/{d => db}/ib_buffer_pool | 0 .rtx5tmp/{d => db}/ib_logfile0 | Bin 100663296 -> 100663296 bytes .rtx5tmp/{d => db}/ibdata1 | Bin 12582912 -> 12582912 bytes .rtx5tmp/{d => db}/ibtmp1 | Bin .rtx5tmp/{d => db}/multi-master.info | 0 .rtx5tmp/{d => db}/mysql/column_stats.MAD | Bin .rtx5tmp/{d => db}/mysql/column_stats.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/column_stats.frm | Bin 2603 -> 2603 bytes .rtx5tmp/{d => db}/mysql/columns_priv.MAD | Bin .rtx5tmp/{d => db}/mysql/columns_priv.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/columns_priv.frm | Bin 2840 -> 2840 bytes .rtx5tmp/{d => db}/mysql/db.MAD | Bin .rtx5tmp/{d => db}/mysql/db.MAI | Bin 24576 -> 24576 bytes .rtx5tmp/{d => db}/mysql/db.frm | Bin 3446 -> 3446 bytes .rtx5tmp/db/mysql/db.opt | 2 + .rtx5tmp/{d => db}/mysql/event.MAD | Bin .rtx5tmp/{d => db}/mysql/event.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/event.frm | Bin 4486 -> 4486 bytes .rtx5tmp/{d => db}/mysql/func.MAD | Bin .rtx5tmp/{d => db}/mysql/func.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/func.frm | Bin 1583 -> 1583 bytes .rtx5tmp/{d => db}/mysql/general_log.CSM | Bin .rtx5tmp/{d => db}/mysql/general_log.CSV | 0 .rtx5tmp/{d => db}/mysql/general_log.frm | Bin 804 -> 804 bytes .rtx5tmp/{d => db}/mysql/global_priv.MAD | Bin .rtx5tmp/{d => db}/mysql/global_priv.MAI | Bin 16384 -> 16384 bytes .rtx5tmp/{d => db}/mysql/global_priv.frm | Bin 2183 -> 2183 bytes .rtx5tmp/{d => db}/mysql/gtid_slave_pos.frm | Bin 1027 -> 1027 bytes .rtx5tmp/{d => db}/mysql/gtid_slave_pos.ibd | Bin 65536 -> 65536 bytes .rtx5tmp/{d => db}/mysql/help_category.MAD | Bin .rtx5tmp/{d => db}/mysql/help_category.MAI | Bin 24576 -> 24576 bytes .rtx5tmp/{d => db}/mysql/help_category.frm | Bin 1708 -> 1708 bytes .rtx5tmp/{d => db}/mysql/help_keyword.MAD | Bin .rtx5tmp/{d => db}/mysql/help_keyword.MAI | Bin 24576 -> 24576 bytes .rtx5tmp/{d => db}/mysql/help_keyword.frm | Bin 1640 -> 1640 bytes .rtx5tmp/{d => db}/mysql/help_relation.MAD | Bin .rtx5tmp/{d => db}/mysql/help_relation.MAI | Bin 24576 -> 24576 bytes .rtx5tmp/{d => db}/mysql/help_relation.frm | Bin 1461 -> 1461 bytes .rtx5tmp/{d => db}/mysql/help_topic.MAD | Bin .rtx5tmp/{d => db}/mysql/help_topic.MAI | Bin 40960 -> 40960 bytes .rtx5tmp/{d => db}/mysql/help_topic.frm | Bin 1778 -> 1778 bytes .rtx5tmp/{d => db}/mysql/index_stats.MAD | Bin .rtx5tmp/{d => db}/mysql/index_stats.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/index_stats.frm | Bin 1630 -> 1630 bytes .../{d => db}/mysql/innodb_index_stats.frm | Bin 5407 -> 5407 bytes .rtx5tmp/db/mysql/innodb_index_stats.ibd | Bin 0 -> 163840 bytes .../{d => db}/mysql/innodb_table_stats.frm | Bin 1912 -> 1912 bytes .../{d => db}/mysql/innodb_table_stats.ibd | Bin 65536 -> 65536 bytes .rtx5tmp/{d => db}/mysql/plugin.MAD | Bin .rtx5tmp/{d => db}/mysql/plugin.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/plugin.frm | Bin 1519 -> 1519 bytes .rtx5tmp/{d => db}/mysql/proc.MAD | Bin 475136 -> 475136 bytes .rtx5tmp/{d => db}/mysql/proc.MAI | Bin 16384 -> 16384 bytes .rtx5tmp/{d => db}/mysql/proc.frm | Bin 4283 -> 4283 bytes .rtx5tmp/{d => db}/mysql/procs_priv.MAD | Bin .rtx5tmp/{d => db}/mysql/procs_priv.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/procs_priv.frm | Bin 4356 -> 4356 bytes .rtx5tmp/{d => db}/mysql/proxies_priv.MAD | Bin 16384 -> 16384 bytes .rtx5tmp/{d => db}/mysql/proxies_priv.MAI | Bin 24576 -> 24576 bytes .rtx5tmp/{d => db}/mysql/proxies_priv.frm | Bin 5029 -> 5029 bytes .rtx5tmp/{d => db}/mysql/roles_mapping.MAD | Bin .rtx5tmp/{d => db}/mysql/roles_mapping.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/roles_mapping.frm | Bin 2535 -> 2535 bytes .rtx5tmp/{d => db}/mysql/servers.MAD | Bin .rtx5tmp/{d => db}/mysql/servers.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/servers.frm | Bin 10279 -> 10279 bytes .rtx5tmp/{d => db}/mysql/slow_log.CSM | Bin .rtx5tmp/{d => db}/mysql/slow_log.CSV | 0 .rtx5tmp/{d => db}/mysql/slow_log.frm | Bin 2386 -> 2386 bytes .rtx5tmp/{d => db}/mysql/table_stats.MAD | Bin .rtx5tmp/{d => db}/mysql/table_stats.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/table_stats.frm | Bin 1375 -> 1375 bytes .rtx5tmp/{d => db}/mysql/tables_priv.MAD | Bin .rtx5tmp/{d => db}/mysql/tables_priv.MAI | Bin 24576 -> 24576 bytes .rtx5tmp/{d => db}/mysql/tables_priv.frm | Bin 4441 -> 4441 bytes .rtx5tmp/{d => db}/mysql/time_zone.MAD | Bin .rtx5tmp/{d => db}/mysql/time_zone.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/time_zone.frm | Bin 974 -> 974 bytes .../{d => db}/mysql/time_zone_leap_second.MAD | Bin .../{d => db}/mysql/time_zone_leap_second.MAI | Bin 8192 -> 8192 bytes .../{d => db}/mysql/time_zone_leap_second.frm | Bin 972 -> 972 bytes .rtx5tmp/{d => db}/mysql/time_zone_name.MAD | Bin .rtx5tmp/{d => db}/mysql/time_zone_name.MAI | Bin 8192 -> 8192 bytes .rtx5tmp/{d => db}/mysql/time_zone_name.frm | Bin 1147 -> 1147 bytes .../{d => db}/mysql/time_zone_transition.MAD | Bin .../{d => db}/mysql/time_zone_transition.MAI | Bin 8192 -> 8192 bytes .../{d => db}/mysql/time_zone_transition.frm | Bin 1014 -> 1014 bytes .../mysql/time_zone_transition_type.MAD | Bin .../mysql/time_zone_transition_type.MAI | Bin 8192 -> 8192 bytes .../mysql/time_zone_transition_type.frm | Bin 1080 -> 1080 bytes .../{d => db}/mysql/transaction_registry.frm | Bin 2624 -> 2624 bytes .../{d => db}/mysql/transaction_registry.ibd | Bin 114688 -> 114688 bytes .rtx5tmp/{d => db}/mysql/user.frm | 2 +- .rtx5tmp/{d => db}/mysql_upgrade_info | 0 .rtx5tmp/{d => db}/performance_schema/db.opt | 0 .rtx5tmp/{d => db}/sys/db.opt | 0 .rtx5tmp/{d => db}/sys/host_summary.frm | 2 +- .../{d => db}/sys/host_summary_by_file_io.frm | 2 +- .../sys/host_summary_by_file_io_type.frm | 2 +- .../{d => db}/sys/host_summary_by_stages.frm | 2 +- .../sys/host_summary_by_statement_latency.frm | 2 +- .../sys/host_summary_by_statement_type.frm | 2 +- .../sys/innodb_buffer_stats_by_schema.frm | 2 +- .../sys/innodb_buffer_stats_by_table.frm | 2 +- .rtx5tmp/{d => db}/sys/innodb_lock_waits.frm | 2 +- .../{d => db}/sys/io_by_thread_by_latency.frm | 2 +- .../sys/io_global_by_file_by_bytes.frm | 2 +- .../sys/io_global_by_file_by_latency.frm | 2 +- .../sys/io_global_by_wait_by_bytes.frm | 2 +- .../sys/io_global_by_wait_by_latency.frm | 2 +- .rtx5tmp/{d => db}/sys/latest_file_io.frm | 2 +- .../sys/memory_by_host_by_current_bytes.frm | 2 +- .../sys/memory_by_thread_by_current_bytes.frm | 2 +- .../sys/memory_by_user_by_current_bytes.frm | 2 +- .../sys/memory_global_by_current_bytes.frm | 2 +- .../{d => db}/sys/memory_global_total.frm | 2 +- .rtx5tmp/{d => db}/sys/metrics.frm | 2 +- .rtx5tmp/{d => db}/sys/processlist.frm | 2 +- .../sys/ps_check_lost_instrumentation.frm | 2 +- .../sys/schema_auto_increment_columns.frm | 2 +- .../{d => db}/sys/schema_index_statistics.frm | 2 +- .../{d => db}/sys/schema_object_overview.frm | 2 +- .../sys/schema_redundant_indexes.frm | 2 +- .../{d => db}/sys/schema_table_lock_waits.frm | 2 +- .../{d => db}/sys/schema_table_statistics.frm | 2 +- .../schema_table_statistics_with_buffer.frm | 2 +- .../schema_tables_with_full_table_scans.frm | 2 +- .../{d => db}/sys/schema_unused_indexes.frm | 2 +- .rtx5tmp/{d => db}/sys/session.frm | 2 +- .rtx5tmp/{d => db}/sys/session_ssl_status.frm | 2 +- .rtx5tmp/{d => db}/sys/statement_analysis.frm | 2 +- .../statements_with_errors_or_warnings.frm | 2 +- .../sys/statements_with_full_table_scans.frm | 2 +- ...ments_with_runtimes_in_95th_percentile.frm | 2 +- .../{d => db}/sys/statements_with_sorting.frm | 2 +- .../sys/statements_with_temp_tables.frm | 2 +- .rtx5tmp/{d => db}/sys/sys_config.MAD | Bin 16384 -> 16384 bytes .rtx5tmp/{d => db}/sys/sys_config.MAI | Bin 16384 -> 16384 bytes .rtx5tmp/{d => db}/sys/sys_config.frm | Bin 2160 -> 2160 bytes .rtx5tmp/{d => db}/sys/user_summary.frm | 2 +- .../{d => db}/sys/user_summary_by_file_io.frm | 2 +- .../sys/user_summary_by_file_io_type.frm | 2 +- .../{d => db}/sys/user_summary_by_stages.frm | 2 +- .../sys/user_summary_by_statement_latency.frm | 2 +- .../sys/user_summary_by_statement_type.frm | 2 +- .rtx5tmp/{d => db}/sys/version.frm | 2 +- .../wait_classes_global_by_avg_latency.frm | 2 +- .../sys/wait_classes_global_by_latency.frm | 2 +- .../sys/waits_by_host_by_latency.frm | 2 +- .../sys/waits_by_user_by_latency.frm | 2 +- .../{d => db}/sys/waits_global_by_latency.frm | 2 +- .rtx5tmp/{d => db}/sys/x@0024host_summary.frm | 2 +- .../sys/x@0024host_summary_by_file_io.frm | 2 +- .../x@0024host_summary_by_file_io_type.frm | 2 +- .../sys/x@0024host_summary_by_stages.frm | 2 +- ...@0024host_summary_by_statement_latency.frm | 2 +- .../x@0024host_summary_by_statement_type.frm | 2 +- .../x@0024innodb_buffer_stats_by_schema.frm | 2 +- .../x@0024innodb_buffer_stats_by_table.frm | 2 +- .../{d => db}/sys/x@0024innodb_lock_waits.frm | 2 +- .../sys/x@0024io_by_thread_by_latency.frm | 2 +- .../sys/x@0024io_global_by_file_by_bytes.frm | 2 +- .../x@0024io_global_by_file_by_latency.frm | 2 +- .../sys/x@0024io_global_by_wait_by_bytes.frm | 2 +- .../x@0024io_global_by_wait_by_latency.frm | 2 +- .../{d => db}/sys/x@0024latest_file_io.frm | 2 +- .../x@0024memory_by_host_by_current_bytes.frm | 2 +- ...@0024memory_by_thread_by_current_bytes.frm | 2 +- .../x@0024memory_by_user_by_current_bytes.frm | 2 +- .../x@0024memory_global_by_current_bytes.frm | 2 +- .../sys/x@0024memory_global_total.frm | 2 +- .rtx5tmp/{d => db}/sys/x@0024processlist.frm | 2 +- ...024ps_digest_95th_percentile_by_avg_us.frm | 2 +- ...0024ps_digest_avg_latency_distribution.frm | 2 +- .../x@0024ps_schema_table_statistics_io.frm | 2 +- .../sys/x@0024schema_flattened_keys.frm | 2 +- .../sys/x@0024schema_index_statistics.frm | 2 +- .../sys/x@0024schema_table_lock_waits.frm | 2 +- .../sys/x@0024schema_table_statistics.frm | 2 +- ...024schema_table_statistics_with_buffer.frm | 2 +- ...024schema_tables_with_full_table_scans.frm | 2 +- .rtx5tmp/{d => db}/sys/x@0024session.frm | 2 +- .../sys/x@0024statement_analysis.frm | 2 +- ...0024statements_with_errors_or_warnings.frm | 2 +- ...x@0024statements_with_full_table_scans.frm | 2 +- ...ments_with_runtimes_in_95th_percentile.frm | 2 +- .../sys/x@0024statements_with_sorting.frm | 2 +- .../sys/x@0024statements_with_temp_tables.frm | 2 +- .rtx5tmp/{d => db}/sys/x@0024user_summary.frm | 2 +- .../sys/x@0024user_summary_by_file_io.frm | 2 +- .../x@0024user_summary_by_file_io_type.frm | 2 +- .../sys/x@0024user_summary_by_stages.frm | 2 +- ...@0024user_summary_by_statement_latency.frm | 2 +- .../x@0024user_summary_by_statement_type.frm | 2 +- ...0024wait_classes_global_by_avg_latency.frm | 2 +- .../x@0024wait_classes_global_by_latency.frm | 2 +- .../sys/x@0024waits_by_host_by_latency.frm | 2 +- .../sys/x@0024waits_by_user_by_latency.frm | 2 +- .../sys/x@0024waits_global_by_latency.frm | 2 +- .rtx5tmp/{d => db}/test/db.opt | 0 .rtx5tmp/ddl_before.py | 1026 +++++++++++++++++ .rtx5tmp/full.sql | 237 ++++ .rtx5tmp/load.err | 20 + .rtx5tmp/my.pid | 2 +- .rtx5tmp/patch_rtx0005.py | 165 +++ .rtx5tmp/server.err | 120 +- .rtx5tmp/t1.err | 14 + .rtx5tmp/t1.out | 0 .rtx5tmp/t1.sql | 10 + .rtx5tmp/t2.err | 13 + .rtx5tmp/t2.out | 0 .rtx5tmp/t2.sql | 10 + .rtx5tmp/t3.err | 16 + .rtx5tmp/t3.out | 0 .rtx5tmp/t3.sql | 11 + .rtx5tmp/t4.err | 0 .rtx5tmp/t4.out | 0 .rtx5tmp/t4.sql | 10 + .rtx5tmp/t5.err | 0 .rtx5tmp/t5.out | 0 .rtx5tmp/t5.sql | 10 + .rtx5tmp/t6.err | 0 .rtx5tmp/t6.out | 0 .rtx5tmp/t6.sql | 10 + .rtx5tmp/t7.err | 9 + .rtx5tmp/t7.out | 0 .rtx5tmp/t7.sql | 7 + 242 files changed, 2008 insertions(+), 123 deletions(-) create mode 100644 .rtx5tmp/before.sql delete mode 100644 .rtx5tmp/d/aria_log_control delete mode 100644 .rtx5tmp/d/mysql/innodb_index_stats.ibd rename .rtx5tmp/{d => db}/aria_log.00000001 (95%) create mode 100644 .rtx5tmp/db/aria_log_control rename .rtx5tmp/{d/mysql => db/exp}/db.opt (100%) create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event#P#p202609.ibd create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event#P#p202610.ibd create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event#P#p202611.ibd create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event#P#p202612.ibd create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event#P#p202701.ibd create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event#P#p202702.ibd create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event#P#pmax.ibd create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event.frm create mode 100644 .rtx5tmp/db/exp/pbl_runtime_event.par rename .rtx5tmp/{d => db}/ib_buffer_pool (100%) rename .rtx5tmp/{d => db}/ib_logfile0 (99%) rename .rtx5tmp/{d => db}/ibdata1 (99%) rename .rtx5tmp/{d => db}/ibtmp1 (100%) rename .rtx5tmp/{d => db}/multi-master.info (100%) rename .rtx5tmp/{d => db}/mysql/column_stats.MAD (100%) rename .rtx5tmp/{d => db}/mysql/column_stats.MAI (96%) rename .rtx5tmp/{d => db}/mysql/column_stats.frm (97%) rename .rtx5tmp/{d => db}/mysql/columns_priv.MAD (100%) rename .rtx5tmp/{d => db}/mysql/columns_priv.MAI (97%) rename .rtx5tmp/{d => db}/mysql/columns_priv.frm (94%) rename .rtx5tmp/{d => db}/mysql/db.MAD (100%) rename .rtx5tmp/{d => db}/mysql/db.MAI (99%) rename .rtx5tmp/{d => db}/mysql/db.frm (94%) create mode 100644 .rtx5tmp/db/mysql/db.opt rename .rtx5tmp/{d => db}/mysql/event.MAD (100%) rename .rtx5tmp/{d => db}/mysql/event.MAI (96%) rename .rtx5tmp/{d => db}/mysql/event.frm (97%) rename .rtx5tmp/{d => db}/mysql/func.MAD (100%) rename .rtx5tmp/{d => db}/mysql/func.MAI (98%) rename .rtx5tmp/{d => db}/mysql/func.frm (93%) rename .rtx5tmp/{d => db}/mysql/general_log.CSM (100%) rename .rtx5tmp/{d => db}/mysql/general_log.CSV (100%) rename .rtx5tmp/{d => db}/mysql/general_log.frm (78%) rename .rtx5tmp/{d => db}/mysql/global_priv.MAD (100%) rename .rtx5tmp/{d => db}/mysql/global_priv.MAI (98%) rename .rtx5tmp/{d => db}/mysql/global_priv.frm (96%) rename .rtx5tmp/{d => db}/mysql/gtid_slave_pos.frm (90%) rename .rtx5tmp/{d => db}/mysql/gtid_slave_pos.ibd (99%) rename .rtx5tmp/{d => db}/mysql/help_category.MAD (100%) rename .rtx5tmp/{d => db}/mysql/help_category.MAI (99%) rename .rtx5tmp/{d => db}/mysql/help_category.frm (90%) rename .rtx5tmp/{d => db}/mysql/help_keyword.MAD (100%) rename .rtx5tmp/{d => db}/mysql/help_keyword.MAI (98%) rename .rtx5tmp/{d => db}/mysql/help_keyword.frm (88%) rename .rtx5tmp/{d => db}/mysql/help_relation.MAD (100%) rename .rtx5tmp/{d => db}/mysql/help_relation.MAI (99%) rename .rtx5tmp/{d => db}/mysql/help_relation.frm (88%) rename .rtx5tmp/{d => db}/mysql/help_topic.MAD (100%) rename .rtx5tmp/{d => db}/mysql/help_topic.MAI (99%) rename .rtx5tmp/{d => db}/mysql/help_topic.frm (91%) rename .rtx5tmp/{d => db}/mysql/index_stats.MAD (100%) rename .rtx5tmp/{d => db}/mysql/index_stats.MAI (97%) rename .rtx5tmp/{d => db}/mysql/index_stats.frm (94%) rename .rtx5tmp/{d => db}/mysql/innodb_index_stats.frm (98%) create mode 100644 .rtx5tmp/db/mysql/innodb_index_stats.ibd rename .rtx5tmp/{d => db}/mysql/innodb_table_stats.frm (93%) rename .rtx5tmp/{d => db}/mysql/innodb_table_stats.ibd (99%) rename .rtx5tmp/{d => db}/mysql/plugin.MAD (100%) rename .rtx5tmp/{d => db}/mysql/plugin.MAI (98%) rename .rtx5tmp/{d => db}/mysql/plugin.frm (89%) rename .rtx5tmp/{d => db}/mysql/proc.MAD (99%) rename .rtx5tmp/{d => db}/mysql/proc.MAI (95%) rename .rtx5tmp/{d => db}/mysql/proc.frm (97%) rename .rtx5tmp/{d => db}/mysql/procs_priv.MAD (100%) rename .rtx5tmp/{d => db}/mysql/procs_priv.MAI (96%) rename .rtx5tmp/{d => db}/mysql/procs_priv.frm (98%) rename .rtx5tmp/{d => db}/mysql/proxies_priv.MAD (98%) rename .rtx5tmp/{d => db}/mysql/proxies_priv.MAI (99%) rename .rtx5tmp/{d => db}/mysql/proxies_priv.frm (96%) rename .rtx5tmp/{d => db}/mysql/roles_mapping.MAD (100%) rename .rtx5tmp/{d => db}/mysql/roles_mapping.MAI (97%) rename .rtx5tmp/{d => db}/mysql/roles_mapping.frm (93%) rename .rtx5tmp/{d => db}/mysql/servers.MAD (100%) rename .rtx5tmp/{d => db}/mysql/servers.MAI (97%) rename .rtx5tmp/{d => db}/mysql/servers.frm (99%) rename .rtx5tmp/{d => db}/mysql/slow_log.CSM (100%) rename .rtx5tmp/{d => db}/mysql/slow_log.CSV (100%) rename .rtx5tmp/{d => db}/mysql/slow_log.frm (94%) rename .rtx5tmp/{d => db}/mysql/table_stats.MAD (100%) rename .rtx5tmp/{d => db}/mysql/table_stats.MAI (97%) rename .rtx5tmp/{d => db}/mysql/table_stats.frm (93%) rename .rtx5tmp/{d => db}/mysql/tables_priv.MAD (100%) rename .rtx5tmp/{d => db}/mysql/tables_priv.MAI (99%) rename .rtx5tmp/{d => db}/mysql/tables_priv.frm (97%) rename .rtx5tmp/{d => db}/mysql/time_zone.MAD (100%) rename .rtx5tmp/{d => db}/mysql/time_zone.MAI (98%) rename .rtx5tmp/{d => db}/mysql/time_zone.frm (90%) rename .rtx5tmp/{d => db}/mysql/time_zone_leap_second.MAD (100%) rename .rtx5tmp/{d => db}/mysql/time_zone_leap_second.MAI (97%) rename .rtx5tmp/{d => db}/mysql/time_zone_leap_second.frm (86%) rename .rtx5tmp/{d => db}/mysql/time_zone_name.MAD (100%) rename .rtx5tmp/{d => db}/mysql/time_zone_name.MAI (98%) rename .rtx5tmp/{d => db}/mysql/time_zone_name.frm (89%) rename .rtx5tmp/{d => db}/mysql/time_zone_transition.MAD (100%) rename .rtx5tmp/{d => db}/mysql/time_zone_transition.MAI (97%) rename .rtx5tmp/{d => db}/mysql/time_zone_transition.frm (84%) rename .rtx5tmp/{d => db}/mysql/time_zone_transition_type.MAD (100%) rename .rtx5tmp/{d => db}/mysql/time_zone_transition_type.MAI (97%) rename .rtx5tmp/{d => db}/mysql/time_zone_transition_type.frm (89%) rename .rtx5tmp/{d => db}/mysql/transaction_registry.frm (97%) rename .rtx5tmp/{d => db}/mysql/transaction_registry.ibd (99%) rename .rtx5tmp/{d => db}/mysql/user.frm (99%) rename .rtx5tmp/{d => db}/mysql_upgrade_info (100%) rename .rtx5tmp/{d => db}/performance_schema/db.opt (100%) rename .rtx5tmp/{d => db}/sys/db.opt (100%) rename .rtx5tmp/{d => db}/sys/host_summary.frm (99%) rename .rtx5tmp/{d => db}/sys/host_summary_by_file_io.frm (98%) rename .rtx5tmp/{d => db}/sys/host_summary_by_file_io_type.frm (99%) rename .rtx5tmp/{d => db}/sys/host_summary_by_stages.frm (98%) rename .rtx5tmp/{d => db}/sys/host_summary_by_statement_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/host_summary_by_statement_type.frm (99%) rename .rtx5tmp/{d => db}/sys/innodb_buffer_stats_by_schema.frm (98%) rename .rtx5tmp/{d => db}/sys/innodb_buffer_stats_by_table.frm (99%) rename .rtx5tmp/{d => db}/sys/innodb_lock_waits.frm (99%) rename .rtx5tmp/{d => db}/sys/io_by_thread_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/io_global_by_file_by_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/io_global_by_file_by_latency.frm (98%) rename .rtx5tmp/{d => db}/sys/io_global_by_wait_by_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/io_global_by_wait_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/latest_file_io.frm (99%) rename .rtx5tmp/{d => db}/sys/memory_by_host_by_current_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/memory_by_thread_by_current_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/memory_by_user_by_current_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/memory_global_by_current_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/memory_global_total.frm (96%) rename .rtx5tmp/{d => db}/sys/metrics.frm (99%) rename .rtx5tmp/{d => db}/sys/processlist.frm (99%) rename .rtx5tmp/{d => db}/sys/ps_check_lost_instrumentation.frm (97%) rename .rtx5tmp/{d => db}/sys/schema_auto_increment_columns.frm (99%) rename .rtx5tmp/{d => db}/sys/schema_index_statistics.frm (99%) rename .rtx5tmp/{d => db}/sys/schema_object_overview.frm (99%) rename .rtx5tmp/{d => db}/sys/schema_redundant_indexes.frm (99%) rename .rtx5tmp/{d => db}/sys/schema_table_lock_waits.frm (99%) rename .rtx5tmp/{d => db}/sys/schema_table_statistics.frm (99%) rename .rtx5tmp/{d => db}/sys/schema_table_statistics_with_buffer.frm (99%) rename .rtx5tmp/{d => db}/sys/schema_tables_with_full_table_scans.frm (98%) rename .rtx5tmp/{d => db}/sys/schema_unused_indexes.frm (98%) rename .rtx5tmp/{d => db}/sys/session.frm (99%) rename .rtx5tmp/{d => db}/sys/session_ssl_status.frm (98%) rename .rtx5tmp/{d => db}/sys/statement_analysis.frm (99%) rename .rtx5tmp/{d => db}/sys/statements_with_errors_or_warnings.frm (99%) rename .rtx5tmp/{d => db}/sys/statements_with_full_table_scans.frm (99%) rename .rtx5tmp/{d => db}/sys/statements_with_runtimes_in_95th_percentile.frm (99%) rename .rtx5tmp/{d => db}/sys/statements_with_sorting.frm (99%) rename .rtx5tmp/{d => db}/sys/statements_with_temp_tables.frm (99%) rename .rtx5tmp/{d => db}/sys/sys_config.MAD (98%) rename .rtx5tmp/{d => db}/sys/sys_config.MAI (99%) rename .rtx5tmp/{d => db}/sys/sys_config.frm (93%) rename .rtx5tmp/{d => db}/sys/user_summary.frm (99%) rename .rtx5tmp/{d => db}/sys/user_summary_by_file_io.frm (98%) rename .rtx5tmp/{d => db}/sys/user_summary_by_file_io_type.frm (98%) rename .rtx5tmp/{d => db}/sys/user_summary_by_stages.frm (98%) rename .rtx5tmp/{d => db}/sys/user_summary_by_statement_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/user_summary_by_statement_type.frm (99%) rename .rtx5tmp/{d => db}/sys/version.frm (94%) rename .rtx5tmp/{d => db}/sys/wait_classes_global_by_avg_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/wait_classes_global_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/waits_by_host_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/waits_by_user_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/waits_global_by_latency.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024host_summary.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024host_summary_by_file_io.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024host_summary_by_file_io_type.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024host_summary_by_stages.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024host_summary_by_statement_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024host_summary_by_statement_type.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024innodb_buffer_stats_by_schema.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024innodb_buffer_stats_by_table.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024innodb_lock_waits.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024io_by_thread_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024io_global_by_file_by_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024io_global_by_file_by_latency.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024io_global_by_wait_by_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024io_global_by_wait_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024latest_file_io.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024memory_by_host_by_current_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024memory_by_thread_by_current_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024memory_by_user_by_current_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024memory_global_by_current_bytes.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024memory_global_total.frm (96%) rename .rtx5tmp/{d => db}/sys/x@0024processlist.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024ps_digest_95th_percentile_by_avg_us.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024ps_digest_avg_latency_distribution.frm (97%) rename .rtx5tmp/{d => db}/sys/x@0024ps_schema_table_statistics_io.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024schema_flattened_keys.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024schema_index_statistics.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024schema_table_lock_waits.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024schema_table_statistics.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024schema_table_statistics_with_buffer.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024schema_tables_with_full_table_scans.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024session.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024statement_analysis.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024statements_with_errors_or_warnings.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024statements_with_full_table_scans.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024statements_with_runtimes_in_95th_percentile.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024statements_with_sorting.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024statements_with_temp_tables.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024user_summary.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024user_summary_by_file_io.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024user_summary_by_file_io_type.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024user_summary_by_stages.frm (98%) rename .rtx5tmp/{d => db}/sys/x@0024user_summary_by_statement_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024user_summary_by_statement_type.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024wait_classes_global_by_avg_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024wait_classes_global_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024waits_by_host_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024waits_by_user_by_latency.frm (99%) rename .rtx5tmp/{d => db}/sys/x@0024waits_global_by_latency.frm (98%) rename .rtx5tmp/{d => db}/test/db.opt (100%) create mode 100644 .rtx5tmp/ddl_before.py create mode 100644 .rtx5tmp/full.sql create mode 100644 .rtx5tmp/load.err create mode 100644 .rtx5tmp/patch_rtx0005.py create mode 100644 .rtx5tmp/t1.err create mode 100644 .rtx5tmp/t1.out create mode 100644 .rtx5tmp/t1.sql create mode 100644 .rtx5tmp/t2.err create mode 100644 .rtx5tmp/t2.out create mode 100644 .rtx5tmp/t2.sql create mode 100644 .rtx5tmp/t3.err create mode 100644 .rtx5tmp/t3.out create mode 100644 .rtx5tmp/t3.sql create mode 100644 .rtx5tmp/t4.err create mode 100644 .rtx5tmp/t4.out create mode 100644 .rtx5tmp/t4.sql create mode 100644 .rtx5tmp/t5.err create mode 100644 .rtx5tmp/t5.out create mode 100644 .rtx5tmp/t5.sql create mode 100644 .rtx5tmp/t6.err create mode 100644 .rtx5tmp/t6.out create mode 100644 .rtx5tmp/t6.sql create mode 100644 .rtx5tmp/t7.err create mode 100644 .rtx5tmp/t7.out create mode 100644 .rtx5tmp/t7.sql diff --git a/.rtx5tmp/before.sql b/.rtx5tmp/before.sql new file mode 100644 index 0000000..1c7cd0b --- /dev/null +++ b/.rtx5tmp/before.sql @@ -0,0 +1,237 @@ +-- =========================================================================== +-- pbl_runtime_event 表 DDL + 按月 RANGE 分区 + append-only 约束(M11b-1) +-- 由 scripts/pbl_runtime_event_ddl.py 生成,改表结构只改生成器再 --emit。 +-- 目标引擎 mariadb(projects/pbls/env/test.json: db.engine=mariadb)。 +-- 执行:mysql --protocol=tcp -u -p < 本文件 +-- 说明:触发器含多语句体,须用 mysql CLI(DELIMITER)执行; +-- 应用侧 ensure_tables() 只执行 A 段单语句 CREATE TABLE。 +-- 开发说明:projects/pbls/docs/02-develop/dev-notes-m11b1-pbl_runtime_event.md +-- =========================================================================== + +-- ---------------------------------------------------------------- A. 建表(分区) +CREATE TABLE IF NOT EXISTS `pbl_runtime_event` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增ID(逻辑主键;物理主键=(id,created_at))', + `tenant_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '租户ID(多租户强制打头)', + `event_uid` VARCHAR(64) NOT NULL COMMENT '事件UID(uuid,应用层生成)', + `event_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事件编码', + `idem_key` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '幂等键(同键重复投递只落一条)', + `world_id` BIGINT NOT NULL DEFAULT 0 COMMENT '世界ID(引用 world 基表,只读)', + `scene_id` BIGINT NOT NULL DEFAULT 0 COMMENT '场景/会话ID(引用 scense 基表,只读)', + `session_id` BIGINT NOT NULL DEFAULT 0 COMMENT '游戏会话ID(M11a 语义,与 scene_id 同域)', + `entity_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '实体ID(引用 entity 基表,只读)', + `actor_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '触发者(服务端会话解析,客户端禁填)', + `event_type` VARCHAR(64) NOT NULL COMMENT '事件类型', + `payload` TEXT NULL COMMENT '事件负载JSON(任务书字段)', + `payload_json` LONGTEXT NULL COMMENT '事件负载JSON(M11a 写路径列名,与 payload 同义留宽)', + `causation_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '因果链:引发本事件的事件UID', + `seq` BIGINT NOT NULL DEFAULT 0 COMMENT '会话内单调序号(轮询游标,应用层生成)', + `seq_no` BIGINT NOT NULL DEFAULT 0 COMMENT '会话内单调序号(M11a 写路径列名)', + `source` VARCHAR(32) NOT NULL DEFAULT 'runtime' COMMENT '来源:runtime/agent/script/client_intent', + `state` VARCHAR(16) NOT NULL DEFAULT 'applied' COMMENT 'applied/rejected/rolled_back', + `state_version` BIGINT NOT NULL DEFAULT 0 COMMENT '本事件推进到的服务端权威版本', + `tx_group` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事务组(同组同事务)', + `broadcast` TINYINT NOT NULL DEFAULT 1 COMMENT '是否参与广播 0/1', + `created_by` BIGINT NOT NULL DEFAULT 0 COMMENT '创建人', + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(分区键,禁TIMESTAMP)', + `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间戳(append-only:永不 UPDATE)', + `occurred_at` DATETIME NULL COMMENT '兼容列(M11a 旧分区键,新写入可空)', + PRIMARY KEY (`id`, `created_at`), + UNIQUE KEY `uk_event_uid` (`tenant_id`, `event_uid`, `created_at`), + UNIQUE KEY `uk_tenant_idem` (`tenant_id`, `idem_key`, `created_at`), + KEY `ix_scene_created` (`scene_id`, `created_at`), + KEY `ix_tenant_session_seq` (`tenant_id`, `session_id`, `seq`), + KEY `ix_tenant_session_seqno` (`tenant_id`, `session_id`, `seq_no`), + KEY `ix_tenant_world_type` (`tenant_id`, `world_id`, `event_type`), + KEY `ix_tx_group` (`tx_group`), + KEY `ix_created_at` (`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci + COMMENT='运行时事件流(append-only,按月RANGE分区,保留14个月)' +PARTITION BY RANGE COLUMNS(`created_at`) ( + PARTITION `p202609` VALUES LESS THAN (DATE '2026-10-01'), + PARTITION `p202610` VALUES LESS THAN (DATE '2026-11-01'), + PARTITION `p202611` VALUES LESS THAN (DATE '2026-12-01'), + PARTITION `p202612` VALUES LESS THAN (DATE '2027-01-01'), + PARTITION `p202701` VALUES LESS THAN (DATE '2027-02-01'), + PARTITION `p202702` VALUES LESS THAN (DATE '2027-03-01'), + PARTITION `pmax` VALUES LESS THAN (MAXVALUE) +); + +DELIMITER $$ + +-- ---------------------------------------------------------------- B. append-only +-- append-only 断言过程:非白名单操作一律 SIGNAL 拒绝 +DROP PROCEDURE IF EXISTS `pbl_assert_append_only`$$ + +CREATE PROCEDURE `pbl_assert_append_only`( + IN p_table VARCHAR(64), IN p_priv VARCHAR(16), IN p_detail VARCHAR(255)) + READS SQL DATA +BEGIN + IF p_table <> 'pbl_runtime_event' THEN + RETURN; -- 只守护事件表,其他表不受影响 + END IF; + IF IFNULL(@pbl_guard_ctx, '') = 'append_only_admin' THEN + RETURN; -- break-glass:一次性历史数据回填 + END IF; + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED', + MYSQL_ERRNO = 45001; +END$$ + +-- BEFORE UPDATE 护栏:把违规语句原文带进错误消息,便于定位调用方 +DROP TRIGGER IF EXISTS `trg_pbl_runtime_event_append_only_upd`$$ + +CREATE TRIGGER `trg_pbl_runtime_event_append_only_upd` + BEFORE UPDATE ON `pbl_runtime_event` FOR EACH ROW +BEGIN + DECLARE v_sql TEXT; + DECLARE v_msg VARCHAR(255); + SET v_sql = ''; + BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_sql = ''; + SELECT INFO INTO v_sql FROM information_schema.processlist + WHERE ID = CONNECTION_ID(); + END; + IF IFNULL(@pbl_guard_ctx, '') = 'append_only_admin' THEN + SET v_msg = CONCAT('break-glass update on ', 'pbl_runtime_event'); + ELSE + SET v_msg = CONCAT('UPDATE denied: ', LEFT(IFNULL(v_sql, 'n/a'), 120)); + END IF; + CALL pbl_assert_append_only('pbl_runtime_event', 'update', v_msg); + IF IFNULL(@pbl_guard_ctx, '') <> 'append_only_admin' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED_UPDATE', + MYSQL_ERRNO = 45002; + END IF; +END$$ + +-- BEFORE DELETE 护栏 +DROP TRIGGER IF EXISTS `trg_pbl_runtime_event_append_only_del`$$ + +CREATE TRIGGER `trg_pbl_runtime_event_append_only_del` + BEFORE DELETE ON `pbl_runtime_event` FOR EACH ROW +BEGIN + DECLARE v_sql TEXT; + DECLARE v_msg VARCHAR(255); + SET v_sql = ''; + BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_sql = ''; + SELECT INFO INTO v_sql FROM information_schema.processlist + WHERE ID = CONNECTION_ID(); + END; + IF IFNULL(@pbl_guard_ctx, '') = 'append_only_admin' THEN + SET v_msg = CONCAT('break-glass delete on ', 'pbl_runtime_event'); + ELSE + SET v_msg = CONCAT('DELETE denied: ', LEFT(IFNULL(v_sql, 'n/a'), 120)); + END IF; + CALL pbl_assert_append_only('pbl_runtime_event', 'delete', v_msg); + IF IFNULL(@pbl_guard_ctx, '') <> 'append_only_admin' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED_DELETE', + MYSQL_ERRNO = 45003; + END IF; +END$$ + +-- 权限层加固(可选,需 DBA 账号执行;app 账号只保留增/查) +-- GRANT INSERT, SELECT, UPDATE, DELETE ON `pbls`.`pbl_runtime_event` TO NULL; -- 占位,勿执行 +-- REVOKE UPDATE, DELETE ON `pbls`.`pbl_runtime_event` FROM 'pbls'@'%'; + +-- ---------------------------------------------------------------- C. 分区维护 +-- 1) 幂等补建未来月分区:pmax 存在时用 REORGANIZE PARTITION 拆出新月份(不丢数据) +DROP PROCEDURE IF EXISTS `pbl_runtime_event_ensure_partitions`$$ + +CREATE PROCEDURE `pbl_runtime_event_ensure_partitions`(IN p_months_ahead INT) + MODIFIES SQL DATA +BEGIN + DECLARE v_done INT DEFAULT 0; + DECLARE v_name VARCHAR(16); + DECLARE v_upper DATE; + DECLARE v_exists INT DEFAULT 0; + DECLARE v_sql TEXT; + DECLARE cur CURSOR FOR + WITH RECURSIVE ms(month_start) AS ( + SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01') + UNION ALL + SELECT DATE_ADD(month_start, INTERVAL 1 MONTH) FROM ms + WHERE month_start < DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), + INTERVAL p_months_ahead MONTH) + ) + SELECT CONCAT('p', DATE_FORMAT(month_start, '%Y%m')), + DATE_ADD(month_start, INTERVAL 1 MONTH) + FROM ms; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1; + OPEN cur; + read_loop: LOOP + FETCH cur INTO v_name, v_upper; + IF v_done = 1 THEN + LEAVE read_loop; + END IF; + SELECT COUNT(*) INTO v_exists FROM information_schema.PARTITIONS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pbl_runtime_event' + AND PARTITION_NAME = v_name; + IF v_exists = 0 THEN + SET @pbl_part_sql = CONCAT( + 'ALTER TABLE `pbl_runtime_event` REORGANIZE PARTITION `pmax` INTO (', + 'PARTITION `', v_name, '` VALUES LESS THAN (DATE ''', v_upper, '''), ', + 'PARTITION `pmax` VALUES LESS THAN (MAXVALUE))'); + PREPARE pbl_part_st FROM @pbl_part_sql; + EXECUTE pbl_part_st; + DEALLOCATE PREPARE pbl_part_st; + END IF; + END LOOP; + CLOSE cur; +END$$ + +-- 2) 到期归档:整月 DROP PARTITION(append-only 表唯一合规的清理手段) +DROP PROCEDURE IF EXISTS `pbl_runtime_event_prune_partitions`$$ + +CREATE PROCEDURE `pbl_runtime_event_prune_partitions`(IN p_keep_months INT) + MODIFIES SQL DATA +BEGIN + DECLARE v_done INT DEFAULT 0; + DECLARE v_name VARCHAR(64); + DECLARE v_cutoff DATE; + DECLARE cur CURSOR FOR + SELECT PARTITION_NAME FROM information_schema.PARTITIONS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pbl_runtime_event' + AND PARTITION_NAME IS NOT NULL + AND PARTITION_NAME <> 'pmax' + AND PARTITION_NAME < CONCAT('p', DATE_FORMAT(v_cutoff, '%Y%m')); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1; + SET v_cutoff = DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL -p_keep_months MONTH); + OPEN cur; + prune_loop: LOOP + FETCH cur INTO v_name; + IF v_done = 1 THEN + LEAVE prune_loop; + END IF; + SET @pbl_drop_sql = CONCAT('ALTER TABLE `pbl_runtime_event` DROP PARTITION `', v_name, '`'); + PREPARE pbl_drop_st FROM @pbl_drop_sql; + EXECUTE pbl_drop_st; + DEALLOCATE PREPARE pbl_drop_st; + END LOOP; + CLOSE cur; +END$$ + +-- 3) 每月自动补分区(需 event_scheduler=ON;否则用 cron,见开发说明) +-- SET GLOBAL event_scheduler = ON; +DROP EVENT IF EXISTS `ev_pbl_runtime_event_partition_maintain`$$ + +CREATE EVENT IF NOT EXISTS `ev_pbl_runtime_event_partition_maintain` + ON SCHEDULE EVERY 1 MONTH + STARTS TIMESTAMP(DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01 03:00:00')) + ON COMPLETION PRESERVE + ENABLE + COMMENT '每月预建未来 6 个月分区' +DO CALL pbl_runtime_event_ensure_partitions(6)$$ + +DELIMITER ; + +-- ---------------------------------------------------------------- D. 一次性改造 +-- 一次性改造(仅当 pbl_runtime_event 已存在且未分区时手工执行;先备份): +-- 1) CREATE TABLE pbl_runtime_event_new ... (本文件 A 段 DDL,改名 _new) +-- 2) SET @pbl_guard_ctx = 'append_only_admin'; -- break-glass,仅回填期间 +-- INSERT INTO pbl_runtime_event_new (...) SELECT ... FROM pbl_runtime_event; +-- SET @pbl_guard_ctx = NULL; +-- 3) RENAME TABLE pbl_runtime_event TO pbl_runtime_event_m11a_bak, +-- pbl_runtime_event_new TO pbl_runtime_event; +-- 4) 重放 append-only 触发器段(B 段),核对 EXPLAIN 分区裁剪后删备份表。 +-- 本脚本不自动执行改造:DROP/RENAME 生产表必须人工确认(见开发说明「回滚」段)。 +SELECT 'm11b-1 migrate: 人工执行,见注释' AS note; diff --git a/.rtx5tmp/d/aria_log_control b/.rtx5tmp/d/aria_log_control deleted file mode 100644 index 5eae6c3e884e31df16b60b2b0b798c06d56182e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52 zcmezOkB9O6<^}h+xe9*VE&WSD!HhXYjzNrpL19ABl6m5-W@{K37+3??7=RSRQy>Nc E02E9P?EnA( diff --git a/.rtx5tmp/d/mysql/innodb_index_stats.ibd b/.rtx5tmp/d/mysql/innodb_index_stats.ibd deleted file mode 100644 index 88384050b51e883fadf9d80d850fee25e6e6b866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 delta 8009 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 diff --git a/.rtx5tmp/db/aria_log_control b/.rtx5tmp/db/aria_log_control new file mode 100644 index 0000000000000000000000000000000000000000..5e7802c4ca65dc10011d9581d4216984469257cb GIT binary patch literal 52 zcmezOkB4z`;hE5Fo`N4&nEp~wFk?=UV-RCtQ1D3Sc`n{+wuX^`fi-}Q0Z1`C1!5oo E0O30gng9R* literal 0 HcmV?d00001 diff --git a/.rtx5tmp/d/mysql/db.opt b/.rtx5tmp/db/exp/db.opt similarity index 100% rename from .rtx5tmp/d/mysql/db.opt rename to .rtx5tmp/db/exp/db.opt diff --git a/.rtx5tmp/db/exp/pbl_runtime_event#P#p202609.ibd b/.rtx5tmp/db/exp/pbl_runtime_event#P#p202609.ibd new file mode 100644 index 0000000000000000000000000000000000000000..95ea767e1b380ad990d013a27149937bfc1f2195 GIT binary patch literal 196608 zcmeIuF#!Mo0K%a4Pwi<5h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ w0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFks*V0{|@m0RR91 literal 0 HcmV?d00001 diff --git a/.rtx5tmp/db/exp/pbl_runtime_event#P#p202610.ibd b/.rtx5tmp/db/exp/pbl_runtime_event#P#p202610.ibd new file mode 100644 index 0000000000000000000000000000000000000000..95ea767e1b380ad990d013a27149937bfc1f2195 GIT binary patch literal 196608 zcmeIuF#!Mo0K%a4Pwi<5h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ w0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFks*V0{|@m0RR91 literal 0 HcmV?d00001 diff --git a/.rtx5tmp/db/exp/pbl_runtime_event#P#p202611.ibd b/.rtx5tmp/db/exp/pbl_runtime_event#P#p202611.ibd new file mode 100644 index 0000000000000000000000000000000000000000..95ea767e1b380ad990d013a27149937bfc1f2195 GIT binary patch literal 196608 zcmeIuF#!Mo0K%a4Pwi<5h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ w0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFks*V0{|@m0RR91 literal 0 HcmV?d00001 diff --git a/.rtx5tmp/db/exp/pbl_runtime_event#P#p202612.ibd b/.rtx5tmp/db/exp/pbl_runtime_event#P#p202612.ibd new file mode 100644 index 0000000000000000000000000000000000000000..95ea767e1b380ad990d013a27149937bfc1f2195 GIT binary patch literal 196608 zcmeIuF#!Mo0K%a4Pwi<5h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ w0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFks*V0{|@m0RR91 literal 0 HcmV?d00001 diff --git a/.rtx5tmp/db/exp/pbl_runtime_event#P#p202701.ibd b/.rtx5tmp/db/exp/pbl_runtime_event#P#p202701.ibd new file mode 100644 index 0000000000000000000000000000000000000000..95ea767e1b380ad990d013a27149937bfc1f2195 GIT binary patch literal 196608 zcmeIuF#!Mo0K%a4Pwi<5h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ w0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFks*V0{|@m0RR91 literal 0 HcmV?d00001 diff --git a/.rtx5tmp/db/exp/pbl_runtime_event#P#p202702.ibd b/.rtx5tmp/db/exp/pbl_runtime_event#P#p202702.ibd new file mode 100644 index 0000000000000000000000000000000000000000..95ea767e1b380ad990d013a27149937bfc1f2195 GIT binary patch literal 196608 zcmeIuF#!Mo0K%a4Pwi<5h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ w0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFks*V0{|@m0RR91 literal 0 HcmV?d00001 diff --git a/.rtx5tmp/db/exp/pbl_runtime_event#P#pmax.ibd b/.rtx5tmp/db/exp/pbl_runtime_event#P#pmax.ibd new file mode 100644 index 0000000000000000000000000000000000000000..95ea767e1b380ad990d013a27149937bfc1f2195 GIT binary patch literal 196608 zcmeIuF#!Mo0K%a4Pwi<5h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ w0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFks*V0{|@m0RR91 literal 0 HcmV?d00001 diff --git a/.rtx5tmp/db/exp/pbl_runtime_event.frm b/.rtx5tmp/db/exp/pbl_runtime_event.frm new file mode 100644 index 0000000000000000000000000000000000000000..65c99af27abd3a5f66afb9a9b69ba8df47a57510 GIT binary patch literal 9786 zcmeHN+f!3V7~h~sjP2lsTHEQgr!%#aXqY76Xr<%SD2z=pZQJh;tN-M<{TrN`O*XgNQ+^~LCa23EA0o8*9fbO!|2861H4;3JA}xAXdZ<*v6i-MCF(&K)??{|6JcE9lL%dKwD z3j22+Uz5`=wt59>Y_XsAc>-S2P9xiSF$LkNMP)!`KxIH>KxIH>KxIH>KxIH>KxIH> zKxIH>;LS6j{*V6V&p?epWk6*>Wk6*>Wk6-%budui3%EsBv+z2wUJ0Xs_j;RLg7cLo ztCLnTK$2XvNaUG&K=KcHd7tPKA#3$LWbC+VYfYW4&UT`TJ93Jvu~r?c;JBkFj@MUK z)#@8^X{iQ-PM>pa@RpcM_L~nja9>-G*H_eX$17@Uxwy?I*;c2+=$}H5i$JX632DL<~rCZzHV%V>dHApqc~% zYGwwOc_#+CtQJKI(AIVs`@8sK;-N+J1!xyB{8jt~F(A!P>GMy679pwufRXfWixAED zQ^Q^|Lqfl5NuAxxVRVw__le;HVu!tK2F9RhwR=c~G)w_NJl-e$jp()x0qHQJ-ASq< zG^xu>p zB&WvY;8U1_CvUJeUWnn~oZNK{Pd+xVKk0fH4}c28h-3Z9{%QQ^e6k;=h0?>xh3m=j zHavemInxCT>T#$Cs^yElc(PZ%G_WjP#eMgc&|)Gg$s-enMD%)cpoc8EFaT&AWuC)h zF=b-fNIWBP10IgaLlIMA;f4|!$+?oV@e9xS%F(DC?8~}VS}Z)LL}n86UB*Q8GM70| z4#L7?V+I@^O)Or^VY0J*4pW)Bi~Fu9Qion1?!}iTk`E$m0cGm8JQ_0M@GYPXtjW7= zc;Z2Zh(~ce+RZpq9*-%Di(l2AsM06maezq7-^DY7a`;Kwd4&TF8FvmTPb2tQI}Q%w zP%n)=eWOU|upM}5;_#vY-yD}mhnKHCD+2-{N_qGpTQYg0J$qg(THM)zdk2)+3pmz? z`=08R#jp~&MF<Apa1-Avmh@aME~wNxnM6nN1cPyouwnL<}x6X~0+0^5A1V`}TpGX@o$j74N7b%0bH4 RXW;;G#~s`kN#2VY{sma>3a$VE literal 0 HcmV?d00001 diff --git a/.rtx5tmp/db/exp/pbl_runtime_event.par b/.rtx5tmp/db/exp/pbl_runtime_event.par new file mode 100644 index 0000000000000000000000000000000000000000..7b1cf9e61ad3310afbe301c7785d39f4e5e544da GIT binary patch literal 108 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 Lr**l*>2dQvMV@@< diff --git a/.rtx5tmp/d/ibdata1 b/.rtx5tmp/db/ibdata1 similarity index 99% rename from .rtx5tmp/d/ibdata1 rename to .rtx5tmp/db/ibdata1 index 7c7e29a32bcc4a95505bdb8247c463ecc8a5d195..9ad7de0e79363af1be02703f0274eb803c67a821 100644 GIT binary patch delta 6502 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 delta 21 dcmbOsHbZQJ6W96c*Z*#F75uncdZW)7E&y+83RwUE diff --git a/.rtx5tmp/d/mysql/db.MAD b/.rtx5tmp/db/mysql/db.MAD similarity index 100% rename from .rtx5tmp/d/mysql/db.MAD rename to .rtx5tmp/db/mysql/db.MAD diff --git a/.rtx5tmp/d/mysql/db.MAI b/.rtx5tmp/db/mysql/db.MAI similarity index 99% rename from .rtx5tmp/d/mysql/db.MAI rename to .rtx5tmp/db/mysql/db.MAI index debd0e3248d55356b5abf7a07c7d7a70d6dad655..a3ef47aeeecd3d24865e57cec79fdcabab858e8b 100644 GIT binary patch delta 70 zcmZoTz}Rqral&3DaXSVGU+m0xV*ac^QSc&Tn3Df19h|$KBGK JH5sqR0RUUm6Jh`W diff --git a/.rtx5tmp/d/mysql/db.frm b/.rtx5tmp/db/mysql/db.frm similarity index 94% rename from .rtx5tmp/d/mysql/db.frm rename to .rtx5tmp/db/mysql/db.frm index 6d74275a4d59e0b3cbf72c80f0c31adce24683a8..753c17efc10cb6b4ec0dcf6dd4f8a038ecf254c1 100644 GIT binary patch delta 21 dcmew+^-XGm6W8SCg^b%g1wXDZ-RPsm3jk=n2*&^b delta 21 dcmew+^-XGm6W94;Y`3?$3Vz%zz0pUD7XWcm33>nk diff --git a/.rtx5tmp/db/mysql/db.opt b/.rtx5tmp/db/mysql/db.opt new file mode 100644 index 0000000..ccbf699 --- /dev/null +++ b/.rtx5tmp/db/mysql/db.opt @@ -0,0 +1,2 @@ +default-character-set=utf8mb4 +default-collation=utf8mb4_general_ci diff --git a/.rtx5tmp/d/mysql/event.MAD b/.rtx5tmp/db/mysql/event.MAD similarity index 100% rename from .rtx5tmp/d/mysql/event.MAD rename to .rtx5tmp/db/mysql/event.MAD diff --git a/.rtx5tmp/d/mysql/event.MAI b/.rtx5tmp/db/mysql/event.MAI similarity index 96% rename from .rtx5tmp/d/mysql/event.MAI rename to .rtx5tmp/db/mysql/event.MAI index ccc82c7bd5cbaef1dad3a252eafcc34304904071..265c5242ea68487980de2235acf43740c775b21c 100644 GIT binary patch delta 60 zcmZp0XmFUYRY=^P0Rk97RMsYO`^gKL^~64ag(nxD3Ek!?_;H2lF9iiN=9GzvQkzv7 HZ_5Dy$JY@9 delta 60 zcmZp0XmFUYRY>3+0|YRFsH{x_?SgSe9m&xCIC6#Tft^p}Ey8FR|SM5)b^ HjL+o&&_xkL delta 60 zcmZp0XmFUYRY>3+0|YRFsH{x_?KxlV1wXDZ-RN_J2>@2f2vGn4 delta 21 dcmZ3&wuEhh6W94SfxX*Y1wZbV-sp3K2>@jC33LDe diff --git a/.rtx5tmp/d/mysql/global_priv.MAD b/.rtx5tmp/db/mysql/global_priv.MAD similarity index 100% rename from .rtx5tmp/d/mysql/global_priv.MAD rename to .rtx5tmp/db/mysql/global_priv.MAD diff --git a/.rtx5tmp/d/mysql/global_priv.MAI b/.rtx5tmp/db/mysql/global_priv.MAI similarity index 98% rename from .rtx5tmp/d/mysql/global_priv.MAI rename to .rtx5tmp/db/mysql/global_priv.MAI index 9b93617fc5e7a15b7ad9b40dc2ad6a20361e08b2..caaa429e90a605ff837351f9b8c3de2e37cabdc8 100644 GIT binary patch delta 53 zcmZo@U~Fh$oUm0$+>QYP7(rClCULvTj7)k0AM8Qg$%SV^w|NSFTw%JImGQS707cOb A82|tP delta 53 zcmZo@U~Fh$oUm0$;2i@5FoLM8O#<&GGcxH3e6R;`&u?CEf19h|$KBGKSs8!Z0RVp% B5Ig_? diff --git a/.rtx5tmp/d/mysql/global_priv.frm b/.rtx5tmp/db/mysql/global_priv.frm similarity index 96% rename from .rtx5tmp/d/mysql/global_priv.frm rename to .rtx5tmp/db/mysql/global_priv.frm index 1621fd23f31c3bd57a121e71195383b577865a6f..2b0ae819d9556de5d18e26f65638d11e41f30d26 100644 GIT binary patch delta 21 dcmZn{Y!{s1#5K9q@zFL4e>J!|W`IXbPA9K;zNHcL1F`3^r4a=%S#07`F`XaLDi-MFxF P(g8640EnNU#6A@Op$Hp? diff --git a/.rtx5tmp/d/mysql/help_category.MAD b/.rtx5tmp/db/mysql/help_category.MAD similarity index 100% rename from .rtx5tmp/d/mysql/help_category.MAD rename to .rtx5tmp/db/mysql/help_category.MAD diff --git a/.rtx5tmp/d/mysql/help_category.MAI b/.rtx5tmp/db/mysql/help_category.MAI similarity index 99% rename from .rtx5tmp/d/mysql/help_category.MAI rename to .rtx5tmp/db/mysql/help_category.MAI index f81076ec3542c15926a3d9a63875ebf8994f227e..3cb2e37173fb961eb1047f9804028864905e6b97 100644 GIT binary patch delta 49 zcmZoTz}Rqral&39aeD>`U$>8 diff --git a/.rtx5tmp/d/mysql/help_keyword.MAD b/.rtx5tmp/db/mysql/help_keyword.MAD similarity index 100% rename from .rtx5tmp/d/mysql/help_keyword.MAD rename to .rtx5tmp/db/mysql/help_keyword.MAD diff --git a/.rtx5tmp/d/mysql/help_keyword.MAI b/.rtx5tmp/db/mysql/help_keyword.MAI similarity index 98% rename from .rtx5tmp/d/mysql/help_keyword.MAI rename to .rtx5tmp/db/mysql/help_keyword.MAI index 38ea876d6ea2e282a585abdac493a83132e111da..98cbb4b38ecdd35443b7a4f718c12d891ca60df3 100644 GIT binary patch delta 49 zcmZoTz}Rqral&39aeD>`U`U50$e1HiSI7oG{-<|+7bh3RHl#>a60 D#94#&5-3Vz%zz0oI=6#!^$2~Ge2 diff --git a/.rtx5tmp/d/mysql/help_topic.MAD b/.rtx5tmp/db/mysql/help_topic.MAD similarity index 100% rename from .rtx5tmp/d/mysql/help_topic.MAD rename to .rtx5tmp/db/mysql/help_topic.MAD diff --git a/.rtx5tmp/d/mysql/help_topic.MAI b/.rtx5tmp/db/mysql/help_topic.MAI similarity index 99% rename from .rtx5tmp/d/mysql/help_topic.MAI rename to .rtx5tmp/db/mysql/help_topic.MAI index abfc7113344a12b57ce0b5b5cc58239a34695826..d4af731c85237f896d972b02d85f51e00794c2bc 100644 GIT binary patch delta 49 zcmZoTz|?SnX~JG1aeD>`U3+0|YRFsH{x_?c;-3<3qKZuj?lW@%!%i zA~^v91PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72#iQzIXn+xr?s^*_iaQc5S9P|0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pkf1SWj`K1av literal 0 HcmV?d00001 diff --git a/.rtx5tmp/d/mysql/innodb_table_stats.frm b/.rtx5tmp/db/mysql/innodb_table_stats.frm similarity index 93% rename from .rtx5tmp/d/mysql/innodb_table_stats.frm rename to .rtx5tmp/db/mysql/innodb_table_stats.frm index 4a6d3231e83087d56c604211851b14b6679fed32..40448c564a06ea0ab7687b52097c5514317abc95 100644 GIT binary patch delta 21 dcmeyt_k(YO6W8Rm6IO5Y6#Tftbfb?BI{FbIMB%^ZqEP&o24B5?70gVk{K8l)+jG^{{sNG2p{4A delta 86 zcmZo@U}SgSe9m&xCIC6#Tft^p}Ey8FR|SM5)b^ HjL+o&$>k9f delta 60 zcmZp0XmFUYRY>3+0|YRFsH{x_?W=9e_qUY)-S8#>~RZx>9kHg9J>eoWnhN7QM|pVv`aOVhL}!VDbXlcHA)i zA!Xt~W5H%kE-XI`6Sk_zg$Zw7Te%R%o*YuW1Exf%<`pwbjpv!8lNu1VG{p15Y-#T8 zf!iWF^F7eB5EpaJ`NYhkFZ5%|qy-3l3s%De;QX>)pcxRgNn2)dE2+LuImyVtARo%c zz{vKWmz6={LjwaNBQql-C{Q5*dms}YP`xKMv%}orc3~}>iO>fDMkYo^CMKZLV<61P z%*@O#B*e$S!BE1$0LBaq3L!uyLuy4qi3t!*-q5QMXcC{EnwMIXm=m9zS(Kk&;$UcG zu4e#*hMs;31qz;iAvsAoRtiq8?w)>J3P9lL1{AijQ!rEr@o`09Z1TcBQL_qlYc5wm7m5tAff~Yq&zB8ApMfy4FHH+dOhLXhA?!;u585gi zPA=?|pMEcxO?dhrQ8p2)3UwU?-^k!VpLo}xAU}TvTLlwS0|P^AaG(Hv2n-moPYD^6 zM65v!VjqAh0BfAGGOz>v=>f&aJ~m4$F-x1gu~*&_x0k`OnweLkVQ8p{=2}p^PF`?L zl+j>v;tWYipznY_!>fkTaQnj;Mq%cS2LBmlPDt`I21=AOeiDmkG!fXxR?V@KorfWx zWA}@YrIQ{Ya>9e(@a!-D%n_cd)80)JWLY#R#(xW=!~$sY-Y&O*(V7RwiC@FGof*cF z*}(XKpJm6hu-DTLFv1MqE_ZJAkD40IM$C{=g%w>Tpio3D!Ds7Ry!Zg{M70QvU#CO1{y{>K3*o G><$3@u&t~B delta 815 zcmZo@kZov?-5{aBCh#t6lfb*patg^zFm}6=D4e}WWiJ~{JXQM#D~z3N_?!dA4zS{7 zgt8|mTmNMfcn>u4{pK{AY0ND4@rxf#a*%*2m2}@w_r6q0M0M#1)2d-o3v#Xx6-cieNv1J3`}1b z7#NxV|Knhg_|U+>$jHpd2ntk4z#hni2UPEg&FnBYxLsJww!L5%YX|E_gHmPz6M=nf z)f_w7c^L9JrdBMSHt7Mv1rL71gI)faBiyvKchdw}Jj3+dw=ha9fEv49ZULh;4~!GP zhH*PHj3cvw@c}=}^v)Z}(+)7g4Bswyfbk$u3D{5DpB`qs0gMU==kPg3OF@>G>-X@s zJz#8mz|{7DdD;UOphk$a+yj;xV8B2)3!bq=1KkDTFurH`Ex_{R^i#trtT5$UX2x)ZE*;w;RjQjyahAgO-#67=x!ToKnf**HFZx&?y eB*z!w#|9Dx1J+-gEfkK(Pu{?+&Z2yx{U`tf85qU@ diff --git a/.rtx5tmp/d/mysql/proc.frm b/.rtx5tmp/db/mysql/proc.frm similarity index 97% rename from .rtx5tmp/d/mysql/proc.frm rename to .rtx5tmp/db/mysql/proc.frm index a5c4160b165c0135897b04e68b212e0f5c8d0af1..ca039fef94fd09189f83eac075c21dd044f03728 100644 GIT binary patch delta 21 dcmdn3xLa|86W8RWvD>$K3VvK+y3r?J003ur2|EA) delta 21 dcmdn3xLa|86W93{k56xN75uncdZSOi004Ct3P}I} diff --git a/.rtx5tmp/d/mysql/procs_priv.MAD b/.rtx5tmp/db/mysql/procs_priv.MAD similarity index 100% rename from .rtx5tmp/d/mysql/procs_priv.MAD rename to .rtx5tmp/db/mysql/procs_priv.MAD diff --git a/.rtx5tmp/d/mysql/procs_priv.MAI b/.rtx5tmp/db/mysql/procs_priv.MAI similarity index 96% rename from .rtx5tmp/d/mysql/procs_priv.MAI rename to .rtx5tmp/db/mysql/procs_priv.MAI index 5938afacf27eff77514594b6ab8a959c4f80bccf..3143cbce92831e060d787a7380ab6b3c2fe44e3b 100644 GIT binary patch delta 49 ycmZp0XmFUYS4iBR0RosoRMsYO`^g`f!X~RS3UN&?JQKRjQ}E*o)6I^I`{e*IT@En- delta 49 zcmZp0XmFUYS4iL;0|YRGsH{x_?L delta 43 pcmZo@U~Fh$+#smHB=Bysu!0(hvQ_}|V!_nrdWBkfmhuh!WdJ3z4XgkF diff --git a/.rtx5tmp/d/mysql/proxies_priv.MAI b/.rtx5tmp/db/mysql/proxies_priv.MAI similarity index 99% rename from .rtx5tmp/d/mysql/proxies_priv.MAI rename to .rtx5tmp/db/mysql/proxies_priv.MAI index 2267f2817b434e8d59fcefebbceae3d4e1af07cf..1ea755b3ffb5ab636dace6a4a6ed8074e6f23661 100644 GIT binary patch delta 62 zcmZoTz}Rqral&3DaeD>`UQ<|_DcxAbOH#?x^C{8JLs diff --git a/.rtx5tmp/d/mysql/proxies_priv.frm b/.rtx5tmp/db/mysql/proxies_priv.frm similarity index 96% rename from .rtx5tmp/d/mysql/proxies_priv.frm rename to .rtx5tmp/db/mysql/proxies_priv.frm index 18f1c55e6d81994a187810aed16920c97aa746f0..ccdb327667ab281e00b7eed21e61c38aa47258e9 100644 GIT binary patch delta 21 dcmZ3gzEpjJ6W8QTKNGfj3VvK+y3r?67yxMh30eRE delta 21 dcmZ3gzEpjJ6W94~*1xv73Vz%zz0oI97yxZO39A4A diff --git a/.rtx5tmp/d/mysql/roles_mapping.MAD b/.rtx5tmp/db/mysql/roles_mapping.MAD similarity index 100% rename from .rtx5tmp/d/mysql/roles_mapping.MAD rename to .rtx5tmp/db/mysql/roles_mapping.MAD diff --git a/.rtx5tmp/d/mysql/roles_mapping.MAI b/.rtx5tmp/db/mysql/roles_mapping.MAI similarity index 97% rename from .rtx5tmp/d/mysql/roles_mapping.MAI rename to .rtx5tmp/db/mysql/roles_mapping.MAI index fd79f2199c229eca080237c70c8ff2bbdd17ca1d..5e955df6e27aa6777bdb6d11fceacaf9f1557a56 100644 GIT binary patch delta 51 ycmZp0XmFUYRY=^90Rk97RMsYOyUB)3RstXFLEOoOXF|7m3VvK+x>=C%y&M29s136K delta 51 zcmZp0XmFUYRY>3+0|YRFsH{x_?3DW=o diff --git a/.rtx5tmp/d/mysql/servers.MAD b/.rtx5tmp/db/mysql/servers.MAD similarity index 100% rename from .rtx5tmp/d/mysql/servers.MAD rename to .rtx5tmp/db/mysql/servers.MAD diff --git a/.rtx5tmp/d/mysql/servers.MAI b/.rtx5tmp/db/mysql/servers.MAI similarity index 97% rename from .rtx5tmp/d/mysql/servers.MAI rename to .rtx5tmp/db/mysql/servers.MAI index 20dc97a8a05bd9e10151bda86d082c63676dbc4f..41180e11cde2991c89e9a29b275b04c88293e0da 100644 GIT binary patch delta 60 zcmZp0XmFUYRY=^90Rk97RMsYOyUB@6N@5@ELEOoOXF|7m3VvK+`b$B3+0|YRFsH{x_? delta 21 dcmZ1;usmRb6W95RyFYAm75uncdZW*6bpUv53g`d; diff --git a/.rtx5tmp/d/mysql/slow_log.CSM b/.rtx5tmp/db/mysql/slow_log.CSM similarity index 100% rename from .rtx5tmp/d/mysql/slow_log.CSM rename to .rtx5tmp/db/mysql/slow_log.CSM diff --git a/.rtx5tmp/d/mysql/slow_log.CSV b/.rtx5tmp/db/mysql/slow_log.CSV similarity index 100% rename from .rtx5tmp/d/mysql/slow_log.CSV rename to .rtx5tmp/db/mysql/slow_log.CSV diff --git a/.rtx5tmp/d/mysql/slow_log.frm b/.rtx5tmp/db/mysql/slow_log.frm similarity index 94% rename from .rtx5tmp/d/mysql/slow_log.frm rename to .rtx5tmp/db/mysql/slow_log.frm index 4e60e20b01f77ce394edb8c77887b405567bb4a3..04046f6179fe4a19167c6e329e6e3cc122c26004 100644 GIT binary patch delta 21 dcmca4bV+D}6W8QbE$!Pp1wXDZ-RQ%{2>@sU2-g4r delta 21 dcmca4bV+D}6W95-D^<3+3Vz%zz0rq_698-Y2@L=M diff --git a/.rtx5tmp/d/mysql/table_stats.MAD b/.rtx5tmp/db/mysql/table_stats.MAD similarity index 100% rename from .rtx5tmp/d/mysql/table_stats.MAD rename to .rtx5tmp/db/mysql/table_stats.MAD diff --git a/.rtx5tmp/d/mysql/table_stats.MAI b/.rtx5tmp/db/mysql/table_stats.MAI similarity index 97% rename from .rtx5tmp/d/mysql/table_stats.MAI rename to .rtx5tmp/db/mysql/table_stats.MAI index 9462b36a4d63404766e3b5fc696f930cfb684388..61b24d23e88ce72452295e564c379362c0a8e5b5 100644 GIT binary patch delta 60 zcmZp0XmFUYRY=^P0Rk97RMsYO`^g^}^~64ag(nxD3Ek!?_;H2lF9iiN=9GzvQkzv7 HZ_5Dy(lrrL delta 60 zcmZp0XmFUYRY>3+0|YRFsH{x_?@96W8Pk>vnAO6#TftbfXWiAOLPr2~_|9 delta 21 dcmcbqbW>@96W966X$;$31wZbV-sr2+05d diff --git a/.rtx5tmp/d/mysql/time_zone.MAD b/.rtx5tmp/db/mysql/time_zone.MAD similarity index 100% rename from .rtx5tmp/d/mysql/time_zone.MAD rename to .rtx5tmp/db/mysql/time_zone.MAD diff --git a/.rtx5tmp/d/mysql/time_zone.MAI b/.rtx5tmp/db/mysql/time_zone.MAI similarity index 98% rename from .rtx5tmp/d/mysql/time_zone.MAI rename to .rtx5tmp/db/mysql/time_zone.MAI index e02c60bb5a9f383345df4a8bbe49840c83116451..b86d3e0c1dea05662f987d13d5cc7fe8dcd800d0 100644 GIT binary patch delta 60 zcmZp0XmFUYRY=^P0Rk97RMsYO`^g6xmBc=Pg(nxD3Ek!?_;H2lF9iiN=9GzvQkx|i HpUVLN$~_Sk delta 60 zcmZp0XmFUYRY>3+0|YRFsH{x_?3+0|YRFsH{x_?3+0|YRFsH{x_?3+0|YRFsH{x_?4|-?2XW7DUT}Y#tKi4o(!UfG%$QRqCQ5Bq IWxOp10REm5g8%>k diff --git a/.rtx5tmp/d/mysql/time_zone_transition.frm b/.rtx5tmp/db/mysql/time_zone_transition.frm similarity index 84% rename from .rtx5tmp/d/mysql/time_zone_transition.frm rename to .rtx5tmp/db/mysql/time_zone_transition.frm index cfa87a28d689d9062bbc142efee963056d44169e..54402c42fb3401521396b7e520a3f90aa14bdca5 100644 GIT binary patch delta 21 dcmeyy{*8Tt6W8PgLMyg;3VvK+y3uD9GXQAQ2}}S0 delta 21 dcmeyy{*8Tt6W962hYxLY75uncdZW)OW&n7&3X1>$ diff --git a/.rtx5tmp/d/mysql/time_zone_transition_type.MAD b/.rtx5tmp/db/mysql/time_zone_transition_type.MAD similarity index 100% rename from .rtx5tmp/d/mysql/time_zone_transition_type.MAD rename to .rtx5tmp/db/mysql/time_zone_transition_type.MAD diff --git a/.rtx5tmp/d/mysql/time_zone_transition_type.MAI b/.rtx5tmp/db/mysql/time_zone_transition_type.MAI similarity index 97% rename from .rtx5tmp/d/mysql/time_zone_transition_type.MAI rename to .rtx5tmp/db/mysql/time_zone_transition_type.MAI index 7980293c4833adaea2119213b50ce54f52268d9b..50b6c13070bc2b499da8c1cc4a2b7708baeb59c4 100644 GIT binary patch delta 60 zcmZp0XmFUYRY=^P0Rk97RMsYO`^kz-dSV~I!jlWngl_W`{J6sOmx6*BbIQa-sm-d4 Gx8(q~wh)2< delta 60 zcmZp0XmFUYRY>3+0|YRFsH{x_?4|-?2XW7DUT}Y#tKi4o(!UfG%$QRqCQ5Bq IWxOp100Qk2qW}N^ diff --git a/.rtx5tmp/d/mysql/time_zone_transition_type.frm b/.rtx5tmp/db/mysql/time_zone_transition_type.frm similarity index 89% rename from .rtx5tmp/d/mysql/time_zone_transition_type.frm rename to .rtx5tmp/db/mysql/time_zone_transition_type.frm index a5db110f2d1939715826e2fc0e223a8da93b1273..3f3bacff3b25ecab090879e28fb8a676ee09fe7a 100644 GIT binary patch delta 21 dcmdnNv4dlR6W8R0*SfcP3VvK+y3ywiGXQ7H3A_LR delta 21 dcmdnNv4dlR6W95t^XG4K75uncdZW)9W&muP3Jw4O diff --git a/.rtx5tmp/d/mysql/transaction_registry.frm b/.rtx5tmp/db/mysql/transaction_registry.frm similarity index 97% rename from .rtx5tmp/d/mysql/transaction_registry.frm rename to .rtx5tmp/db/mysql/transaction_registry.frm index 6f2f99576c9ca90395b9f1451de9743f88aca196..b52ae34a77348f88ce961411efe4ebd4617fdd7a 100644 GIT binary patch delta 21 dcmX>gazJE)6W8Po->kQJ3VvK+y3ywgCje=@3DE!m delta 21 dcmX>gazJE)6W94Ka#yyw3Vz%zz0v0jCje}>3I_lH diff --git a/.rtx5tmp/d/mysql/transaction_registry.ibd b/.rtx5tmp/db/mysql/transaction_registry.ibd similarity index 99% rename from .rtx5tmp/d/mysql/transaction_registry.ibd rename to .rtx5tmp/db/mysql/transaction_registry.ibd index 635cffe1d246865ae13d694bc01c0a0f2d15699c..499c27ac2bf5c467deb6cbab5892dc1af72f2567 100644 GIT binary patch delta 122 zcmZo@U~gz(pCHZ{y;0(^J!^ETkD~Y_2XV$%np2frmeNF@5yT3H(au0Z_V!$u!YIz@zEy$|sKR~Ys^yW>9Do9=wo5pGL{=4_*dsfw S0Vv|XU7`Ub;;$)C6bJwuwJ@Im diff --git a/.rtx5tmp/d/mysql/user.frm b/.rtx5tmp/db/mysql/user.frm similarity index 99% rename from .rtx5tmp/d/mysql/user.frm rename to .rtx5tmp/db/mysql/user.frm index 20c28bf..66a8924 100644 --- a/.rtx5tmp/d/mysql/user.frm +++ b/.rtx5tmp/db/mysql/user.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=1 with_check_option=0 -timestamp=0001790054638040474 +timestamp=0001790056254928692 create-version=2 source=SELECT\n Host,\n User,\n IF(JSON_VALUE(Priv, \'$.plugin\') IN (\'mysql_native_password\', \'mysql_old_password\'), IFNULL(JSON_VALUE(Priv, \'$.authentication_string\'), \'\'), \'\') AS Password,\n IF(JSON_VALUE(Priv, \'$.access\') & 1, \'Y\', \'N\') AS Select_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 2, \'Y\', \'N\') AS Insert_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 4, \'Y\', \'N\') AS Update_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 8, \'Y\', \'N\') AS Delete_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 16, \'Y\', \'N\') AS Create_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 32, \'Y\', \'N\') AS Drop_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 64, \'Y\', \'N\') AS Reload_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 128, \'Y\', \'N\') AS Shutdown_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 256, \'Y\', \'N\') AS Process_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 512, \'Y\', \'N\') AS File_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 1024, \'Y\', \'N\') AS Grant_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 2048, \'Y\', \'N\') AS References_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 4096, \'Y\', \'N\') AS Index_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 8192, \'Y\', \'N\') AS Alter_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 16384, \'Y\', \'N\') AS Show_db_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 32768, \'Y\', \'N\') AS Super_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 65536, \'Y\', \'N\') AS Create_tmp_table_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 131072, \'Y\', \'N\') AS Lock_tables_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 262144, \'Y\', \'N\') AS Execute_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 524288, \'Y\', \'N\') AS Repl_slave_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 1048576, \'Y\', \'N\') AS Repl_client_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 2097152, \'Y\', \'N\') AS Create_view_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 4194304, \'Y\', \'N\') AS Show_view_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 8388608, \'Y\', \'N\') AS Create_routine_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 16777216, \'Y\', \'N\') AS Alter_routine_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 33554432, \'Y\', \'N\') AS Create_user_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 67108864, \'Y\', \'N\') AS Event_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 134217728, \'Y\', \'N\') AS Trigger_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 268435456, \'Y\', \'N\') AS Create_tablespace_priv,\n IF(JSON_VALUE(Priv, \'$.access\') & 536870912, \'Y\', \'N\') AS Delete_history_priv,\n ELT(IFNULL(JSON_VALUE(Priv, \'$.ssl_type\'), 0) + 1, \'\', \'ANY\',\'X509\', \'SPECIFIED\') AS ssl_type,\n IFNULL(JSON_VALUE(Priv, \'$.ssl_cipher\'), \'\') AS ssl_cipher,\n IFNULL(JSON_VALUE(Priv, \'$.x509_issuer\'), \'\') AS x509_issuer,\n IFNULL(JSON_VALUE(Priv, \'$.x509_subject\'), \'\') AS x509_subject,\n CAST(IFNULL(JSON_VALUE(Priv, \'$.max_questions\'), 0) AS UNSIGNED) AS max_questions,\n CAST(IFNULL(JSON_VALUE(Priv, \'$.max_updates\'), 0) AS UNSIGNED) AS max_updates,\n CAST(IFNULL(JSON_VALUE(Priv, \'$.max_connections\'), 0) AS UNSIGNED) AS max_connections,\n CAST(IFNULL(JSON_VALUE(Priv, \'$.max_user_connections\'), 0) AS SIGNED) AS max_user_connections,\n IFNULL(JSON_VALUE(Priv, \'$.plugin\'), \'\') AS plugin,\n IFNULL(JSON_VALUE(Priv, \'$.authentication_string\'), \'\') AS authentication_string,\n IF(IFNULL(JSON_VALUE(Priv, \'$.password_last_changed\'), 1) = 0, \'Y\', \'N\') AS password_expired,\n ELT(IFNULL(JSON_VALUE(Priv, \'$.is_role\'), 0) + 1, \'N\', \'Y\') AS is_role,\n IFNULL(JSON_VALUE(Priv, \'$.default_role\'), \'\') AS default_role,\n CAST(IFNULL(JSON_VALUE(Priv, \'$.max_statement_time\'), 0.0) AS DECIMAL(12,6)) AS max_statement_time\n FROM global_priv; client_cs_name=utf8mb4 diff --git a/.rtx5tmp/d/mysql_upgrade_info b/.rtx5tmp/db/mysql_upgrade_info similarity index 100% rename from .rtx5tmp/d/mysql_upgrade_info rename to .rtx5tmp/db/mysql_upgrade_info diff --git a/.rtx5tmp/d/performance_schema/db.opt b/.rtx5tmp/db/performance_schema/db.opt similarity index 100% rename from .rtx5tmp/d/performance_schema/db.opt rename to .rtx5tmp/db/performance_schema/db.opt diff --git a/.rtx5tmp/d/sys/db.opt b/.rtx5tmp/db/sys/db.opt similarity index 100% rename from .rtx5tmp/d/sys/db.opt rename to .rtx5tmp/db/sys/db.opt diff --git a/.rtx5tmp/d/sys/host_summary.frm b/.rtx5tmp/db/sys/host_summary.frm similarity index 99% rename from .rtx5tmp/d/sys/host_summary.frm rename to .rtx5tmp/db/sys/host_summary.frm index 036d6f7..01d2a2d 100644 --- a/.rtx5tmp/d/sys/host_summary.frm +++ b/.rtx5tmp/db/sys/host_summary.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639089300 +timestamp=0001790056256025546 create-version=2 source=SELECT IF(accounts.host IS NULL, \'background\', accounts.host) AS host,\n SUM(stmt.total) AS statements,\n sys.format_time(SUM(stmt.total_latency)) AS statement_latency,\n sys.format_time(IFNULL(SUM(stmt.total_latency) / NULLIF(SUM(stmt.total), 0), 0)) AS statement_avg_latency,\n SUM(stmt.full_scans) AS table_scans,\n SUM(io.ios) AS file_ios,\n sys.format_time(SUM(io.io_latency)) AS file_io_latency,\n SUM(accounts.current_connections) AS current_connections,\n SUM(accounts.total_connections) AS total_connections,\n COUNT(DISTINCT user) AS unique_users,\n sys.format_bytes(SUM(mem.current_allocated)) AS current_memory,\n sys.format_bytes(SUM(mem.total_allocated)) AS total_memory_allocated\n FROM performance_schema.accounts\n JOIN sys.x$host_summary_by_statement_latency AS stmt ON accounts.host = stmt.host\n JOIN sys.x$host_summary_by_file_io AS io ON accounts.host = io.host\n JOIN sys.x$memory_by_host_by_current_bytes mem ON accounts.host = mem.host\n GROUP BY IF(accounts.host IS NULL, \'background\', accounts.host); client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/host_summary_by_file_io.frm b/.rtx5tmp/db/sys/host_summary_by_file_io.frm similarity index 98% rename from .rtx5tmp/d/sys/host_summary_by_file_io.frm rename to .rtx5tmp/db/sys/host_summary_by_file_io.frm index dd7a4f1..bb37ad0 100644 --- a/.rtx5tmp/d/sys/host_summary_by_file_io.frm +++ b/.rtx5tmp/db/sys/host_summary_by_file_io.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639038254 +timestamp=0001790056255975913 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n SUM(count_star) AS ios,\n sys.format_time(SUM(sum_timer_wait)) AS io_latency\n FROM performance_schema.events_waits_summary_by_host_by_event_name\n WHERE event_name LIKE \'wait/io/file/%\'\n GROUP BY IF(host IS NULL, \'background\', host)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/host_summary_by_file_io_type.frm b/.rtx5tmp/db/sys/host_summary_by_file_io_type.frm similarity index 99% rename from .rtx5tmp/d/sys/host_summary_by_file_io_type.frm rename to .rtx5tmp/db/sys/host_summary_by_file_io_type.frm index c650de2..7abf2aa 100644 --- a/.rtx5tmp/d/sys/host_summary_by_file_io_type.frm +++ b/.rtx5tmp/db/sys/host_summary_by_file_io_type.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639025138 +timestamp=0001790056255964141 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n event_name,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(max_timer_wait) AS max_latency\n FROM performance_schema.events_waits_summary_by_host_by_event_name\n WHERE event_name LIKE \'wait/io/file%\'\n AND count_star > 0\n ORDER BY IF(host IS NULL, \'background\', host), sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/host_summary_by_stages.frm b/.rtx5tmp/db/sys/host_summary_by_stages.frm similarity index 98% rename from .rtx5tmp/d/sys/host_summary_by_stages.frm rename to .rtx5tmp/db/sys/host_summary_by_stages.frm index fbfe6b1..bd19381 100644 --- a/.rtx5tmp/d/sys/host_summary_by_stages.frm +++ b/.rtx5tmp/db/sys/host_summary_by_stages.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639074042 +timestamp=0001790056256012419 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n event_name,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(avg_timer_wait) AS avg_latency\n FROM performance_schema.events_stages_summary_by_host_by_event_name\n WHERE sum_timer_wait != 0\n ORDER BY IF(host IS NULL, \'background\', host), sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/host_summary_by_statement_latency.frm b/.rtx5tmp/db/sys/host_summary_by_statement_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/host_summary_by_statement_latency.frm rename to .rtx5tmp/db/sys/host_summary_by_statement_latency.frm index 38761ef..486306f 100644 --- a/.rtx5tmp/d/sys/host_summary_by_statement_latency.frm +++ b/.rtx5tmp/db/sys/host_summary_by_statement_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639062519 +timestamp=0001790056256000255 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n SUM(count_star) AS total,\n sys.format_time(SUM(sum_timer_wait)) AS total_latency,\n sys.format_time(MAX(max_timer_wait)) AS max_latency,\n sys.format_time(SUM(sum_lock_time)) AS lock_latency,\n SUM(sum_rows_sent) AS rows_sent,\n SUM(sum_rows_examined) AS rows_examined,\n SUM(sum_rows_affected) AS rows_affected,\n SUM(sum_no_index_used) + SUM(sum_no_good_index_used) AS full_scans\n FROM performance_schema.events_statements_summary_by_host_by_event_name\n GROUP BY IF(host IS NULL, \'background\', host)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/host_summary_by_statement_type.frm b/.rtx5tmp/db/sys/host_summary_by_statement_type.frm similarity index 99% rename from .rtx5tmp/d/sys/host_summary_by_statement_type.frm rename to .rtx5tmp/db/sys/host_summary_by_statement_type.frm index 83b0d21..c807145 100644 --- a/.rtx5tmp/d/sys/host_summary_by_statement_type.frm +++ b/.rtx5tmp/db/sys/host_summary_by_statement_type.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639050878 +timestamp=0001790056255988011 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n SUBSTRING_INDEX(event_name, \'/\', -1) AS statement,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(max_timer_wait) AS max_latency,\n sys.format_time(sum_lock_time) AS lock_latency,\n sum_rows_sent AS rows_sent,\n sum_rows_examined AS rows_examined,\n sum_rows_affected AS rows_affected,\n sum_no_index_used + sum_no_good_index_used AS full_scans\n FROM performance_schema.events_statements_summary_by_host_by_event_name\n WHERE sum_timer_wait != 0\n ORDER BY IF(host IS NULL, \'background\', host), sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/innodb_buffer_stats_by_schema.frm b/.rtx5tmp/db/sys/innodb_buffer_stats_by_schema.frm similarity index 98% rename from .rtx5tmp/d/sys/innodb_buffer_stats_by_schema.frm rename to .rtx5tmp/db/sys/innodb_buffer_stats_by_schema.frm index 1290fd7..bba722d 100644 --- a/.rtx5tmp/d/sys/innodb_buffer_stats_by_schema.frm +++ b/.rtx5tmp/db/sys/innodb_buffer_stats_by_schema.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638605353 +timestamp=0001790056255498299 create-version=2 source=SELECT IF(LOCATE(\'.\', ibp.table_name) = 0, \'InnoDB System\', REPLACE(SUBSTRING_INDEX(ibp.table_name, \'.\', 1), \'`\', \'\')) AS object_schema,\n sys.format_bytes(SUM(IF(ibp.compressed_size = 0, 16384, compressed_size))) AS allocated,\n sys.format_bytes(SUM(ibp.data_size)) AS data,\n COUNT(ibp.page_number) AS pages,\n COUNT(IF(ibp.is_hashed = \'YES\', 1, NULL)) AS pages_hashed,\n COUNT(IF(ibp.is_old = \'YES\', 1, NULL)) AS pages_old,\n ROUND(SUM(ibp.number_records)/COUNT(DISTINCT ibp.index_name)) AS rows_cached\n FROM information_schema.innodb_buffer_page ibp\n WHERE table_name IS NOT NULL\n GROUP BY object_schema\n ORDER BY SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/innodb_buffer_stats_by_table.frm b/.rtx5tmp/db/sys/innodb_buffer_stats_by_table.frm similarity index 99% rename from .rtx5tmp/d/sys/innodb_buffer_stats_by_table.frm rename to .rtx5tmp/db/sys/innodb_buffer_stats_by_table.frm index 724dcdc..e78447b 100644 --- a/.rtx5tmp/d/sys/innodb_buffer_stats_by_table.frm +++ b/.rtx5tmp/db/sys/innodb_buffer_stats_by_table.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638616430 +timestamp=0001790056255510436 create-version=2 source=SELECT IF(LOCATE(\'.\', ibp.table_name) = 0, \'InnoDB System\', REPLACE(SUBSTRING_INDEX(ibp.table_name, \'.\', 1), \'`\', \'\')) AS object_schema,\n REPLACE(SUBSTRING_INDEX(ibp.table_name, \'.\', -1), \'`\', \'\') AS object_name,\n sys.format_bytes(SUM(IF(ibp.compressed_size = 0, 16384, compressed_size))) AS allocated,\n sys.format_bytes(SUM(ibp.data_size)) AS data,\n COUNT(ibp.page_number) AS pages,\n COUNT(IF(ibp.is_hashed = \'YES\', 1, NULL)) AS pages_hashed,\n COUNT(IF(ibp.is_old = \'YES\', 1, NULL)) AS pages_old,\n ROUND(SUM(ibp.number_records)/COUNT(DISTINCT ibp.index_name)) AS rows_cached\n FROM information_schema.innodb_buffer_page ibp\n WHERE table_name IS NOT NULL\n GROUP BY object_schema, object_name\n ORDER BY SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/innodb_lock_waits.frm b/.rtx5tmp/db/sys/innodb_lock_waits.frm similarity index 99% rename from .rtx5tmp/d/sys/innodb_lock_waits.frm rename to .rtx5tmp/db/sys/innodb_lock_waits.frm index b6ff5d5..7b87471 100644 --- a/.rtx5tmp/d/sys/innodb_lock_waits.frm +++ b/.rtx5tmp/db/sys/innodb_lock_waits.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638627297 +timestamp=0001790056255526470 create-version=2 source=SELECT r.trx_wait_started AS wait_started,\n TIMEDIFF(NOW(), r.trx_wait_started) AS wait_age,\n TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) AS wait_age_secs,\n rl.lock_table AS locked_table,\n rl.lock_index AS locked_index,\n rl.lock_type AS locked_type,\n r.trx_id AS waiting_trx_id,\n r.trx_started as waiting_trx_started,\n TIMEDIFF(NOW(), r.trx_started) AS waiting_trx_age,\n r.trx_rows_locked AS waiting_trx_rows_locked,\n r.trx_rows_modified AS waiting_trx_rows_modified,\n r.trx_mysql_thread_id AS waiting_pid,\n sys.format_statement(r.trx_query) AS waiting_query,\n rl.lock_id AS waiting_lock_id,\n rl.lock_mode AS waiting_lock_mode,\n b.trx_id AS blocking_trx_id,\n b.trx_mysql_thread_id AS blocking_pid,\n sys.format_statement(b.trx_query) AS blocking_query,\n bl.lock_id AS blocking_lock_id,\n bl.lock_mode AS blocking_lock_mode,\n b.trx_started AS blocking_trx_started,\n TIMEDIFF(NOW(), b.trx_started) AS blocking_trx_age,\n b.trx_rows_locked AS blocking_trx_rows_locked,\n b.trx_rows_modified AS blocking_trx_rows_modified,\n CONCAT(\'KILL QUERY \', b.trx_mysql_thread_id) AS sql_kill_blocking_query,\n CONCAT(\'KILL \', b.trx_mysql_thread_id) AS sql_kill_blocking_connection\n FROM information_schema.innodb_lock_waits w\n INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id\n INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id\n INNER JOIN information_schema.innodb_locks bl ON bl.lock_id = w.blocking_lock_id\n INNER JOIN information_schema.innodb_locks rl ON rl.lock_id = w.requested_lock_id\n ORDER BY r.trx_wait_started; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/io_by_thread_by_latency.frm b/.rtx5tmp/db/sys/io_by_thread_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/io_by_thread_by_latency.frm rename to .rtx5tmp/db/sys/io_by_thread_by_latency.frm index 3e61bc4..4bfab89 100644 --- a/.rtx5tmp/d/sys/io_by_thread_by_latency.frm +++ b/.rtx5tmp/db/sys/io_by_thread_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638680757 +timestamp=0001790056255584721 create-version=2 source=SELECT IF(processlist_id IS NULL,\n SUBSTRING_INDEX(name, \'/\', -1),\n CONCAT(processlist_user, \'@\', processlist_host)\n ) user,\n SUM(count_star) total,\n sys.format_time(SUM(sum_timer_wait)) total_latency,\n sys.format_time(MIN(min_timer_wait)) min_latency,\n sys.format_time(AVG(avg_timer_wait)) avg_latency,\n sys.format_time(MAX(max_timer_wait)) max_latency,\n thread_id,\n processlist_id\n FROM performance_schema.events_waits_summary_by_thread_by_event_name\n LEFT JOIN performance_schema.threads USING (thread_id)\n WHERE event_name LIKE \'wait/io/file/%\'\n AND sum_timer_wait > 0\n GROUP BY thread_id, processlist_id, user\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/io_global_by_file_by_bytes.frm b/.rtx5tmp/db/sys/io_global_by_file_by_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/io_global_by_file_by_bytes.frm rename to .rtx5tmp/db/sys/io_global_by_file_by_bytes.frm index 81c009b..f13750b 100644 --- a/.rtx5tmp/d/sys/io_global_by_file_by_bytes.frm +++ b/.rtx5tmp/db/sys/io_global_by_file_by_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638692606 +timestamp=0001790056255597046 create-version=2 source=SELECT sys.format_path(file_name) AS file,\n count_read,\n sys.format_bytes(sum_number_of_bytes_read) AS total_read,\n sys.format_bytes(IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0)) AS avg_read,\n count_write,\n sys.format_bytes(sum_number_of_bytes_write) AS total_written,\n sys.format_bytes(IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0.00)) AS avg_write,\n sys.format_bytes(sum_number_of_bytes_read + sum_number_of_bytes_write) AS total,\n IFNULL(ROUND(100-((sum_number_of_bytes_read/ NULLIF((sum_number_of_bytes_read+sum_number_of_bytes_write), 0))*100), 2), 0.00) AS write_pct\n FROM performance_schema.file_summary_by_instance\n ORDER BY sum_number_of_bytes_read + sum_number_of_bytes_write DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/io_global_by_file_by_latency.frm b/.rtx5tmp/db/sys/io_global_by_file_by_latency.frm similarity index 98% rename from .rtx5tmp/d/sys/io_global_by_file_by_latency.frm rename to .rtx5tmp/db/sys/io_global_by_file_by_latency.frm index ddf4be2..9c017a0 100644 --- a/.rtx5tmp/d/sys/io_global_by_file_by_latency.frm +++ b/.rtx5tmp/db/sys/io_global_by_file_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638705210 +timestamp=0001790056255608886 create-version=2 source=SELECT sys.format_path(file_name) AS file,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n count_read,\n sys.format_time(sum_timer_read) AS read_latency,\n count_write,\n sys.format_time(sum_timer_write) AS write_latency,\n count_misc,\n sys.format_time(sum_timer_misc) AS misc_latency\n FROM performance_schema.file_summary_by_instance\n ORDER BY sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/io_global_by_wait_by_bytes.frm b/.rtx5tmp/db/sys/io_global_by_wait_by_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/io_global_by_wait_by_bytes.frm rename to .rtx5tmp/db/sys/io_global_by_wait_by_bytes.frm index 3623128..a32adaf 100644 --- a/.rtx5tmp/d/sys/io_global_by_wait_by_bytes.frm +++ b/.rtx5tmp/db/sys/io_global_by_wait_by_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638716911 +timestamp=0001790056255621130 create-version=2 source=SELECT SUBSTRING_INDEX(event_name, \'/\', -2) event_name,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(min_timer_wait) AS min_latency,\n sys.format_time(avg_timer_wait) AS avg_latency,\n sys.format_time(max_timer_wait) AS max_latency,\n count_read,\n sys.format_bytes(sum_number_of_bytes_read) AS total_read,\n sys.format_bytes(IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0)) AS avg_read,\n count_write,\n sys.format_bytes(sum_number_of_bytes_write) AS total_written,\n sys.format_bytes(IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0)) AS avg_written,\n sys.format_bytes(sum_number_of_bytes_write + sum_number_of_bytes_read) AS total_requested\n FROM performance_schema.file_summary_by_event_name\n WHERE event_name LIKE \'wait/io/file/%\'\n AND count_star > 0\n ORDER BY sum_number_of_bytes_write + sum_number_of_bytes_read DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/io_global_by_wait_by_latency.frm b/.rtx5tmp/db/sys/io_global_by_wait_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/io_global_by_wait_by_latency.frm rename to .rtx5tmp/db/sys/io_global_by_wait_by_latency.frm index c93c4ea..a86bcca 100644 --- a/.rtx5tmp/d/sys/io_global_by_wait_by_latency.frm +++ b/.rtx5tmp/db/sys/io_global_by_wait_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638728553 +timestamp=0001790056255633232 create-version=2 source=SELECT SUBSTRING_INDEX(event_name, \'/\', -2) AS event_name,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(avg_timer_wait) AS avg_latency,\n sys.format_time(max_timer_wait) AS max_latency,\n sys.format_time(sum_timer_read) AS read_latency,\n sys.format_time(sum_timer_write) AS write_latency,\n sys.format_time(sum_timer_misc) AS misc_latency,\n count_read,\n sys.format_bytes(sum_number_of_bytes_read) AS total_read,\n sys.format_bytes(IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0)) AS avg_read,\n count_write,\n sys.format_bytes(sum_number_of_bytes_write) AS total_written,\n sys.format_bytes(IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0)) AS avg_written\n FROM performance_schema.file_summary_by_event_name\n WHERE event_name LIKE \'wait/io/file/%\'\n AND count_star > 0\n ORDER BY sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/latest_file_io.frm b/.rtx5tmp/db/sys/latest_file_io.frm similarity index 99% rename from .rtx5tmp/d/sys/latest_file_io.frm rename to .rtx5tmp/db/sys/latest_file_io.frm index d8aeb50..16d06db 100644 --- a/.rtx5tmp/d/sys/latest_file_io.frm +++ b/.rtx5tmp/db/sys/latest_file_io.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638668441 +timestamp=0001790056255572194 create-version=2 source=SELECT IF(id IS NULL,\n CONCAT(SUBSTRING_INDEX(name, \'/\', -1), \':\', thread_id),\n CONCAT(user, \'@\', host, \':\', id)\n ) thread,\n sys.format_path(object_name) file,\n sys.format_time(timer_wait) AS latency,\n operation,\n sys.format_bytes(number_of_bytes) AS requested\n FROM performance_schema.events_waits_history_long\n JOIN performance_schema.threads USING (thread_id)\n LEFT JOIN information_schema.processlist ON processlist_id = id\n WHERE object_name IS NOT NULL\n AND event_name LIKE \'wait/io/file/%\'\n ORDER BY timer_start; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/memory_by_host_by_current_bytes.frm b/.rtx5tmp/db/sys/memory_by_host_by_current_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/memory_by_host_by_current_bytes.frm rename to .rtx5tmp/db/sys/memory_by_host_by_current_bytes.frm index 0b09d7d..07de8ef 100644 --- a/.rtx5tmp/d/sys/memory_by_host_by_current_bytes.frm +++ b/.rtx5tmp/db/sys/memory_by_host_by_current_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638751250 +timestamp=0001790056255658273 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n SUM(current_count_used) AS current_count_used,\n sys.format_bytes(SUM(current_number_of_bytes_used)) AS current_allocated,\n sys.format_bytes(IFNULL(SUM(current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0)) AS current_avg_alloc,\n sys.format_bytes(MAX(current_number_of_bytes_used)) AS current_max_alloc,\n sys.format_bytes(SUM(sum_number_of_bytes_alloc)) AS total_allocated\n FROM performance_schema.memory_summary_by_host_by_event_name\n GROUP BY IF(host IS NULL, \'background\', host)\n ORDER BY SUM(current_number_of_bytes_used) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/memory_by_thread_by_current_bytes.frm b/.rtx5tmp/db/sys/memory_by_thread_by_current_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/memory_by_thread_by_current_bytes.frm rename to .rtx5tmp/db/sys/memory_by_thread_by_current_bytes.frm index 7e5862b..1f1a1ea 100644 --- a/.rtx5tmp/d/sys/memory_by_thread_by_current_bytes.frm +++ b/.rtx5tmp/db/sys/memory_by_thread_by_current_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638762559 +timestamp=0001790056255670115 create-version=2 source=SELECT thread_id,\n IF(t.name = \'thread/sql/one_connection\',\n CONCAT(t.processlist_user, \'@\', t.processlist_host),\n REPLACE(t.name, \'thread/\', \'\')) user,\n SUM(mt.current_count_used) AS current_count_used,\n sys.format_bytes(SUM(mt.current_number_of_bytes_used)) AS current_allocated,\n sys.format_bytes(IFNULL(SUM(mt.current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0)) AS current_avg_alloc,\n sys.format_bytes(MAX(mt.current_number_of_bytes_used)) AS current_max_alloc,\n sys.format_bytes(SUM(mt.sum_number_of_bytes_alloc)) AS total_allocated\n FROM performance_schema.memory_summary_by_thread_by_event_name AS mt\n JOIN performance_schema.threads AS t USING (thread_id)\n GROUP BY thread_id, IF(t.name = \'thread/sql/one_connection\',\n CONCAT(t.processlist_user, \'@\', t.processlist_host),\n REPLACE(t.name, \'thread/\', \'\'))\n ORDER BY SUM(current_number_of_bytes_used) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/memory_by_user_by_current_bytes.frm b/.rtx5tmp/db/sys/memory_by_user_by_current_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/memory_by_user_by_current_bytes.frm rename to .rtx5tmp/db/sys/memory_by_user_by_current_bytes.frm index c7293a9..dc18f76 100644 --- a/.rtx5tmp/d/sys/memory_by_user_by_current_bytes.frm +++ b/.rtx5tmp/db/sys/memory_by_user_by_current_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638740189 +timestamp=0001790056255645820 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n SUM(current_count_used) AS current_count_used,\n sys.format_bytes(SUM(current_number_of_bytes_used)) AS current_allocated,\n sys.format_bytes(IFNULL(SUM(current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0)) AS current_avg_alloc,\n sys.format_bytes(MAX(current_number_of_bytes_used)) AS current_max_alloc,\n sys.format_bytes(SUM(sum_number_of_bytes_alloc)) AS total_allocated\n FROM performance_schema.memory_summary_by_user_by_event_name\n GROUP BY IF(user IS NULL, \'background\', user)\n ORDER BY SUM(current_number_of_bytes_used) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/memory_global_by_current_bytes.frm b/.rtx5tmp/db/sys/memory_global_by_current_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/memory_global_by_current_bytes.frm rename to .rtx5tmp/db/sys/memory_global_by_current_bytes.frm index e648f0b..7b4f4bd 100644 --- a/.rtx5tmp/d/sys/memory_global_by_current_bytes.frm +++ b/.rtx5tmp/db/sys/memory_global_by_current_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638774056 +timestamp=0001790056255682605 create-version=2 source=SELECT event_name,\n current_count_used AS current_count,\n sys.format_bytes(current_number_of_bytes_used) AS current_alloc,\n sys.format_bytes(IFNULL(current_number_of_bytes_used / NULLIF(current_count_used, 0), 0)) AS current_avg_alloc,\n high_count_used AS high_count,\n sys.format_bytes(high_number_of_bytes_used) AS high_alloc,\n sys.format_bytes(IFNULL(high_number_of_bytes_used / NULLIF(high_count_used, 0), 0)) AS high_avg_alloc\n FROM performance_schema.memory_summary_global_by_event_name\n WHERE current_number_of_bytes_used > 0\n ORDER BY current_number_of_bytes_used DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/memory_global_total.frm b/.rtx5tmp/db/sys/memory_global_total.frm similarity index 96% rename from .rtx5tmp/d/sys/memory_global_total.frm rename to .rtx5tmp/db/sys/memory_global_total.frm index 13ab48a..87ce1ea 100644 --- a/.rtx5tmp/d/sys/memory_global_total.frm +++ b/.rtx5tmp/db/sys/memory_global_total.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638784868 +timestamp=0001790056255694156 create-version=2 source=SELECT sys.format_bytes(SUM(CURRENT_NUMBER_OF_BYTES_USED)) total_allocated\n FROM performance_schema.memory_summary_global_by_event_name; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/metrics.frm b/.rtx5tmp/db/sys/metrics.frm similarity index 99% rename from .rtx5tmp/d/sys/metrics.frm rename to .rtx5tmp/db/sys/metrics.frm index 6e5fde4..c74cfe6 100644 --- a/.rtx5tmp/d/sys/metrics.frm +++ b/.rtx5tmp/db/sys/metrics.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639174127 +timestamp=0001790056256101795 create-version=2 source=(\nSELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value, \'Global Status\' AS Type, \'YES\' AS Enabled\n FROM performance_schema.global_status\n) UNION ALL (\nSELECT NAME AS Variable_name, COUNT AS Variable_value,\n CONCAT(\'InnoDB Metrics - \', SUBSYSTEM) AS Type,\n \'YES\' AS Enabled\n FROM information_schema.INNODB_METRICS\n WHERE NAME NOT IN (\n \'lock_row_lock_time\', \'lock_row_lock_time_avg\', \'lock_row_lock_time_max\', \'lock_row_lock_waits\',\n \'buffer_pool_reads\', \'buffer_pool_read_requests\', \'buffer_pool_write_requests\', \'buffer_pool_wait_free\',\n \'buffer_pool_read_ahead\', \'buffer_pool_read_ahead_evicted\', \'buffer_pool_pages_total\', \'buffer_pool_pages_misc\',\n \'buffer_pool_pages_data\', \'buffer_pool_bytes_data\', \'buffer_pool_pages_dirty\', \'buffer_pool_bytes_dirty\',\n \'buffer_pool_pages_free\', \'buffer_pages_created\', \'buffer_pages_written\', \'buffer_pages_read\',\n \'buffer_data_reads\', \'buffer_data_written\', \'file_num_open_files\',\n \'os_log_bytes_written\', \'os_log_fsyncs\', \'os_log_pending_fsyncs\', \'os_log_pending_writes\',\n \'log_waits\', \'log_write_requests\', \'log_writes\', \'innodb_dblwr_writes\', \'innodb_dblwr_pages_written\', \'innodb_page_size\')\n) \n UNION ALL (\nSELECT \'NOW()\' AS Variable_name, NOW(3) AS Variable_value, \'System Time\' AS Type, \'YES\' AS Enabled\n) UNION ALL (\nSELECT \'UNIX_TIMESTAMP()\' AS Variable_name, ROUND(UNIX_TIMESTAMP(NOW(3)), 3) AS Variable_value, \'System Time\' AS Type, \'YES\' AS Enabled\n)\n ORDER BY Type, Variable_name; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/processlist.frm b/.rtx5tmp/db/sys/processlist.frm similarity index 99% rename from .rtx5tmp/d/sys/processlist.frm rename to .rtx5tmp/db/sys/processlist.frm index b92d8e2..b6714e7 100644 --- a/.rtx5tmp/d/sys/processlist.frm +++ b/.rtx5tmp/db/sys/processlist.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639182543 +timestamp=0001790056256110571 create-version=2 source=SELECT pps.thread_id AS thd_id,\n pps.processlist_id AS conn_id,\n IF(pps.name = \'thread/sql/one_connection\',\n CONCAT(pps.processlist_user, \'@\', pps.processlist_host),\n REPLACE(pps.name, \'thread/\', \'\')) user,\n pps.processlist_db AS db,\n pps.processlist_command AS command,\n pps.processlist_state AS state,\n pps.processlist_time AS time,\n sys.format_statement(pps.processlist_info) AS current_statement,\n IF(esc.end_event_id IS NULL,\n sys.format_time(esc.timer_wait),\n NULL) AS statement_latency,\n IF(esc.end_event_id IS NULL,\n ROUND(100 * (estc.work_completed / estc.work_estimated), 2),\n NULL) AS progress,\n sys.format_time(esc.lock_time) AS lock_latency,\n esc.rows_examined AS rows_examined,\n esc.rows_sent AS rows_sent,\n esc.rows_affected AS rows_affected,\n esc.created_tmp_tables AS tmp_tables,\n esc.created_tmp_disk_tables AS tmp_disk_tables,\n IF(esc.no_good_index_used > 0 OR esc.no_index_used > 0, \'YES\', \'NO\') AS full_scan,\n IF(esc.end_event_id IS NOT NULL,\n sys.format_statement(esc.sql_text),\n NULL) AS last_statement,\n IF(esc.end_event_id IS NOT NULL,\n sys.format_time(esc.timer_wait),\n NULL) AS last_statement_latency,\n sys.format_bytes(mem.current_allocated) AS current_memory,\n ewc.event_name AS last_wait,\n IF(ewc.end_event_id IS NULL AND ewc.event_name IS NOT NULL,\n \'Still Waiting\',\n sys.format_time(ewc.timer_wait)) last_wait_latency,\n ewc.source,\n sys.format_time(etc.timer_wait) AS trx_latency,\n etc.state AS trx_state,\n etc.autocommit AS trx_autocommit,\n conattr_pid.attr_value as pid,\n conattr_progname.attr_value as program_name\n FROM performance_schema.threads AS pps\n LEFT JOIN performance_schema.events_waits_current AS ewc USING (thread_id)\n LEFT JOIN performance_schema.events_stages_current AS estc USING (thread_id)\n LEFT JOIN performance_schema.events_statements_current AS esc USING (thread_id)\n LEFT JOIN performance_schema.events_transactions_current AS etc USING (thread_id)\n LEFT JOIN sys.x$memory_by_thread_by_current_bytes AS mem USING (thread_id)\n LEFT JOIN performance_schema.session_connect_attrs AS conattr_pid\n ON conattr_pid.processlist_id=pps.processlist_id and conattr_pid.attr_name=\'_pid\'\n LEFT JOIN performance_schema.session_connect_attrs AS conattr_progname\n ON conattr_progname.processlist_id=pps.processlist_id and conattr_progname.attr_name=\'program_name\'\n ORDER BY pps.processlist_time DESC, last_wait_latency DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/ps_check_lost_instrumentation.frm b/.rtx5tmp/db/sys/ps_check_lost_instrumentation.frm similarity index 97% rename from .rtx5tmp/d/sys/ps_check_lost_instrumentation.frm rename to .rtx5tmp/db/sys/ps_check_lost_instrumentation.frm index 4247e9d..b70f634 100644 --- a/.rtx5tmp/d/sys/ps_check_lost_instrumentation.frm +++ b/.rtx5tmp/db/sys/ps_check_lost_instrumentation.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638661232 +timestamp=0001790056255564838 create-version=2 source=SELECT variable_name, variable_value\n FROM performance_schema.global_status\n WHERE variable_name LIKE \'perf%lost\'\n AND variable_value > 0; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_auto_increment_columns.frm b/.rtx5tmp/db/sys/schema_auto_increment_columns.frm similarity index 99% rename from .rtx5tmp/d/sys/schema_auto_increment_columns.frm rename to .rtx5tmp/db/sys/schema_auto_increment_columns.frm index 96e38b3..d8e9b63 100644 --- a/.rtx5tmp/d/sys/schema_auto_increment_columns.frm +++ b/.rtx5tmp/db/sys/schema_auto_increment_columns.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638644139 +timestamp=0001790056255544953 create-version=2 source=SELECT TABLE_SCHEMA,\n TABLE_NAME,\n COLUMN_NAME,\n DATA_TYPE,\n COLUMN_TYPE,\n (LOCATE(\'unsigned\', COLUMN_TYPE) = 0) AS is_signed,\n (LOCATE(\'unsigned\', COLUMN_TYPE) > 0) AS is_unsigned,\n (\n CASE DATA_TYPE\n WHEN \'tinyint\' THEN 255\n WHEN \'smallint\' THEN 65535\n WHEN \'mediumint\' THEN 16777215\n WHEN \'int\' THEN 4294967295\n WHEN \'bigint\' THEN 18446744073709551615\n END >> IF(LOCATE(\'unsigned\', COLUMN_TYPE) > 0, 0, 1)\n ) AS max_value,\n AUTO_INCREMENT,\n AUTO_INCREMENT / (\n CASE DATA_TYPE\n WHEN \'tinyint\' THEN 255\n WHEN \'smallint\' THEN 65535\n WHEN \'mediumint\' THEN 16777215\n WHEN \'int\' THEN 4294967295\n WHEN \'bigint\' THEN 18446744073709551615\n END >> IF(LOCATE(\'unsigned\', COLUMN_TYPE) > 0, 0, 1)\n ) AS auto_increment_ratio\n FROM INFORMATION_SCHEMA.COLUMNS\n INNER JOIN INFORMATION_SCHEMA.TABLES USING (TABLE_SCHEMA, TABLE_NAME)\n WHERE TABLE_SCHEMA NOT IN (\'mysql\', \'sys\', \'INFORMATION_SCHEMA\', \'performance_schema\')\n AND TABLE_TYPE=\'BASE TABLE\'\n AND EXTRA=\'auto_increment\'\n ORDER BY auto_increment_ratio DESC, max_value; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_index_statistics.frm b/.rtx5tmp/db/sys/schema_index_statistics.frm similarity index 99% rename from .rtx5tmp/d/sys/schema_index_statistics.frm rename to .rtx5tmp/db/sys/schema_index_statistics.frm index e41b9ea..2f2b974 100644 --- a/.rtx5tmp/d/sys/schema_index_statistics.frm +++ b/.rtx5tmp/db/sys/schema_index_statistics.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638796740 +timestamp=0001790056255706297 create-version=2 source=SELECT OBJECT_SCHEMA AS table_schema,\n OBJECT_NAME AS table_name,\n INDEX_NAME as index_name,\n COUNT_FETCH AS rows_selected,\n sys.format_time(SUM_TIMER_FETCH) AS select_latency,\n COUNT_INSERT AS rows_inserted,\n sys.format_time(SUM_TIMER_INSERT) AS insert_latency,\n COUNT_UPDATE AS rows_updated,\n sys.format_time(SUM_TIMER_UPDATE) AS update_latency,\n COUNT_DELETE AS rows_deleted,\n sys.format_time(SUM_TIMER_INSERT) AS delete_latency\n FROM performance_schema.table_io_waits_summary_by_index_usage\n WHERE index_name IS NOT NULL\n ORDER BY sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_object_overview.frm b/.rtx5tmp/db/sys/schema_object_overview.frm similarity index 99% rename from .rtx5tmp/d/sys/schema_object_overview.frm rename to .rtx5tmp/db/sys/schema_object_overview.frm index 322ce41..11424e2 100644 --- a/.rtx5tmp/d/sys/schema_object_overview.frm +++ b/.rtx5tmp/db/sys/schema_object_overview.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638638387 +timestamp=0001790056255538568 create-version=2 source=SELECT ROUTINE_SCHEMA AS db, ROUTINE_TYPE AS object_type, COUNT(*) AS count FROM information_schema.routines GROUP BY ROUTINE_SCHEMA, ROUTINE_TYPE\n UNION\nSELECT TABLE_SCHEMA, TABLE_TYPE, COUNT(*) FROM information_schema.tables GROUP BY TABLE_SCHEMA, TABLE_TYPE\n UNION\nSELECT TABLE_SCHEMA, CONCAT(\'INDEX (\', INDEX_TYPE, \')\'), COUNT(*) FROM information_schema.statistics GROUP BY TABLE_SCHEMA, INDEX_TYPE\n UNION\nSELECT TRIGGER_SCHEMA, \'TRIGGER\', COUNT(*) FROM information_schema.triggers GROUP BY TRIGGER_SCHEMA\n UNION\nSELECT EVENT_SCHEMA, \'EVENT\', COUNT(*) FROM information_schema.events GROUP BY EVENT_SCHEMA\nORDER BY DB, OBJECT_TYPE; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_redundant_indexes.frm b/.rtx5tmp/db/sys/schema_redundant_indexes.frm similarity index 99% rename from .rtx5tmp/d/sys/schema_redundant_indexes.frm rename to .rtx5tmp/db/sys/schema_redundant_indexes.frm index 1e8f0a1..6c16454 100644 --- a/.rtx5tmp/d/sys/schema_redundant_indexes.frm +++ b/.rtx5tmp/db/sys/schema_redundant_indexes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638655133 +timestamp=0001790056255556954 create-version=2 source=SELECT\n redundant_keys.table_schema,\n redundant_keys.table_name,\n redundant_keys.index_name AS redundant_index_name,\n redundant_keys.index_columns AS redundant_index_columns,\n redundant_keys.non_unique AS redundant_index_non_unique,\n dominant_keys.index_name AS dominant_index_name,\n dominant_keys.index_columns AS dominant_index_columns,\n dominant_keys.non_unique AS dominant_index_non_unique,\n IF(redundant_keys.subpart_exists OR dominant_keys.subpart_exists, 1 ,0) AS subpart_exists,\n CONCAT(\n \'ALTER TABLE `\', redundant_keys.table_schema, \'`.`\', redundant_keys.table_name, \'` DROP INDEX `\', redundant_keys.index_name, \'`\'\n ) AS sql_drop_index\n FROM\n x$schema_flattened_keys AS redundant_keys\n INNER JOIN x$schema_flattened_keys AS dominant_keys\n USING (TABLE_SCHEMA, TABLE_NAME)\n WHERE\n redundant_keys.index_name != dominant_keys.index_name\n AND (\n (\n /* Identical columns */\n (redundant_keys.index_columns = dominant_keys.index_columns)\n AND (\n (redundant_keys.non_unique > dominant_keys.non_unique)\n OR (redundant_keys.non_unique = dominant_keys.non_unique\n AND IF(redundant_keys.index_name=\'PRIMARY\', \'\', redundant_keys.index_name) > IF(dominant_keys.index_name=\'PRIMARY\', \'\', dominant_keys.index_name)\n )\n )\n )\n OR\n (\n /* Non-unique prefix columns */\n LOCATE(CONCAT(redundant_keys.index_columns, \',\'), dominant_keys.index_columns) = 1\n AND redundant_keys.non_unique = 1\n )\n OR\n (\n /* Unique prefix columns */\n LOCATE(CONCAT(dominant_keys.index_columns, \',\'), redundant_keys.index_columns) = 1\n AND dominant_keys.non_unique = 0\n )\n ); client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_table_lock_waits.frm b/.rtx5tmp/db/sys/schema_table_lock_waits.frm similarity index 99% rename from .rtx5tmp/d/sys/schema_table_lock_waits.frm rename to .rtx5tmp/db/sys/schema_table_lock_waits.frm index cbe8215..da235dd 100644 --- a/.rtx5tmp/d/sys/schema_table_lock_waits.frm +++ b/.rtx5tmp/db/sys/schema_table_lock_waits.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638856970 +timestamp=0001790056255774275 create-version=2 source=SELECT g.object_schema AS object_schema,\n g.object_name AS object_name,\n pt.thread_id AS waiting_thread_id,\n pt.processlist_id AS waiting_pid,\n sys.ps_thread_account(p.owner_thread_id) AS waiting_account,\n p.lock_type AS waiting_lock_type,\n p.lock_duration AS waiting_lock_duration,\n sys.format_statement(pt.processlist_info) AS waiting_query,\n pt.processlist_time AS waiting_query_secs,\n ps.rows_affected AS waiting_query_rows_affected,\n ps.rows_examined AS waiting_query_rows_examined,\n gt.thread_id AS blocking_thread_id,\n gt.processlist_id AS blocking_pid,\n sys.ps_thread_account(g.owner_thread_id) AS blocking_account,\n g.lock_type AS blocking_lock_type,\n g.lock_duration AS blocking_lock_duration,\n CONCAT(\'KILL QUERY \', gt.processlist_id) AS sql_kill_blocking_query,\n CONCAT(\'KILL \', gt.processlist_id) AS sql_kill_blocking_connection\n FROM performance_schema.metadata_locks g\n INNER JOIN performance_schema.metadata_locks p\n ON g.object_type = p.object_type\n AND g.object_schema = p.object_schema\n AND g.object_name = p.object_name\n AND g.lock_status = \'GRANTED\'\n AND p.lock_status = \'PENDING\'\n INNER JOIN performance_schema.threads gt ON g.owner_thread_id = gt.thread_id\n INNER JOIN performance_schema.threads pt ON p.owner_thread_id = pt.thread_id\n LEFT JOIN performance_schema.events_statements_current gs ON g.owner_thread_id = gs.thread_id\n LEFT JOIN performance_schema.events_statements_current ps ON p.owner_thread_id = ps.thread_id\n WHERE g.object_type = \'TABLE\'; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_table_statistics.frm b/.rtx5tmp/db/sys/schema_table_statistics.frm similarity index 99% rename from .rtx5tmp/d/sys/schema_table_statistics.frm rename to .rtx5tmp/db/sys/schema_table_statistics.frm index 6425f13..d26ee33 100644 --- a/.rtx5tmp/d/sys/schema_table_statistics.frm +++ b/.rtx5tmp/db/sys/schema_table_statistics.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638814242 +timestamp=0001790056255726616 create-version=2 source=SELECT pst.object_schema AS table_schema,\n pst.object_name AS table_name,\n sys.format_time(pst.sum_timer_wait) AS total_latency,\n pst.count_fetch AS rows_fetched,\n sys.format_time(pst.sum_timer_fetch) AS fetch_latency,\n pst.count_insert AS rows_inserted,\n sys.format_time(pst.sum_timer_insert) AS insert_latency,\n pst.count_update AS rows_updated,\n sys.format_time(pst.sum_timer_update) AS update_latency,\n pst.count_delete AS rows_deleted,\n sys.format_time(pst.sum_timer_delete) AS delete_latency,\n fsbi.count_read AS io_read_requests,\n sys.format_bytes(fsbi.sum_number_of_bytes_read) AS io_read,\n sys.format_time(fsbi.sum_timer_read) AS io_read_latency,\n fsbi.count_write AS io_write_requests,\n sys.format_bytes(fsbi.sum_number_of_bytes_write) AS io_write,\n sys.format_time(fsbi.sum_timer_write) AS io_write_latency,\n fsbi.count_misc AS io_misc_requests,\n sys.format_time(fsbi.sum_timer_misc) AS io_misc_latency\n FROM performance_schema.table_io_waits_summary_by_table AS pst\n LEFT JOIN x$ps_schema_table_statistics_io AS fsbi\n ON pst.object_schema = fsbi.table_schema\n AND pst.object_name = fsbi.table_name\n ORDER BY pst.sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_table_statistics_with_buffer.frm b/.rtx5tmp/db/sys/schema_table_statistics_with_buffer.frm similarity index 99% rename from .rtx5tmp/d/sys/schema_table_statistics_with_buffer.frm rename to .rtx5tmp/db/sys/schema_table_statistics_with_buffer.frm index cd1f4a0..54a4cfe 100644 --- a/.rtx5tmp/d/sys/schema_table_statistics_with_buffer.frm +++ b/.rtx5tmp/db/sys/schema_table_statistics_with_buffer.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638827153 +timestamp=0001790056255741259 create-version=2 source=SELECT pst.object_schema AS table_schema,\n pst.object_name AS table_name,\n pst.count_fetch AS rows_fetched,\n sys.format_time(pst.sum_timer_fetch) AS fetch_latency,\n pst.count_insert AS rows_inserted,\n sys.format_time(pst.sum_timer_insert) AS insert_latency,\n pst.count_update AS rows_updated,\n sys.format_time(pst.sum_timer_update) AS update_latency,\n pst.count_delete AS rows_deleted,\n sys.format_time(pst.sum_timer_delete) AS delete_latency,\n fsbi.count_read AS io_read_requests,\n sys.format_bytes(fsbi.sum_number_of_bytes_read) AS io_read,\n sys.format_time(fsbi.sum_timer_read) AS io_read_latency,\n fsbi.count_write AS io_write_requests,\n sys.format_bytes(fsbi.sum_number_of_bytes_write) AS io_write,\n sys.format_time(fsbi.sum_timer_write) AS io_write_latency,\n fsbi.count_misc AS io_misc_requests,\n sys.format_time(fsbi.sum_timer_misc) AS io_misc_latency,\n sys.format_bytes(ibp.allocated) AS innodb_buffer_allocated,\n sys.format_bytes(ibp.data) AS innodb_buffer_data,\n sys.format_bytes(ibp.allocated - ibp.data) AS innodb_buffer_free,\n ibp.pages AS innodb_buffer_pages,\n ibp.pages_hashed AS innodb_buffer_pages_hashed,\n ibp.pages_old AS innodb_buffer_pages_old,\n ibp.rows_cached AS innodb_buffer_rows_cached\n FROM performance_schema.table_io_waits_summary_by_table AS pst\n LEFT JOIN x$ps_schema_table_statistics_io AS fsbi\n ON pst.object_schema = fsbi.table_schema\n AND pst.object_name = fsbi.table_name\n LEFT JOIN sys.x$innodb_buffer_stats_by_table AS ibp\n ON pst.object_schema = ibp.object_schema\n AND pst.object_name = ibp.object_name\n ORDER BY pst.sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_tables_with_full_table_scans.frm b/.rtx5tmp/db/sys/schema_tables_with_full_table_scans.frm similarity index 98% rename from .rtx5tmp/d/sys/schema_tables_with_full_table_scans.frm rename to .rtx5tmp/db/sys/schema_tables_with_full_table_scans.frm index 6d8a1db..f467ce8 100644 --- a/.rtx5tmp/d/sys/schema_tables_with_full_table_scans.frm +++ b/.rtx5tmp/db/sys/schema_tables_with_full_table_scans.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638838887 +timestamp=0001790056255754296 create-version=2 source=SELECT object_schema,\n object_name,\n count_read AS rows_full_scanned,\n sys.format_time(sum_timer_wait) AS latency\n FROM performance_schema.table_io_waits_summary_by_index_usage\n WHERE index_name IS NULL\n AND count_read > 0\n ORDER BY count_read DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/schema_unused_indexes.frm b/.rtx5tmp/db/sys/schema_unused_indexes.frm similarity index 98% rename from .rtx5tmp/d/sys/schema_unused_indexes.frm rename to .rtx5tmp/db/sys/schema_unused_indexes.frm index f4b52a5..d1fdf68 100644 --- a/.rtx5tmp/d/sys/schema_unused_indexes.frm +++ b/.rtx5tmp/db/sys/schema_unused_indexes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638849873 +timestamp=0001790056255766646 create-version=2 source=SELECT object_schema,\n object_name,\n index_name\n FROM performance_schema.table_io_waits_summary_by_index_usage\n WHERE index_name IS NOT NULL\n AND count_star = 0\n AND object_schema != \'mysql\'\n AND index_name != \'PRIMARY\'\n ORDER BY object_schema, object_name; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/session.frm b/.rtx5tmp/db/sys/session.frm similarity index 99% rename from .rtx5tmp/d/sys/session.frm rename to .rtx5tmp/db/sys/session.frm index 9725376..f0367fe 100644 --- a/.rtx5tmp/d/sys/session.frm +++ b/.rtx5tmp/db/sys/session.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639196892 +timestamp=0001790056256124641 create-version=2 source=SELECT * FROM sys.processlist\nWHERE conn_id IS NOT NULL AND command != \'Daemon\'; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/session_ssl_status.frm b/.rtx5tmp/db/sys/session_ssl_status.frm similarity index 98% rename from .rtx5tmp/d/sys/session_ssl_status.frm rename to .rtx5tmp/db/sys/session_ssl_status.frm index e79f4b0..1cdfd2d 100644 --- a/.rtx5tmp/d/sys/session_ssl_status.frm +++ b/.rtx5tmp/db/sys/session_ssl_status.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639209817 +timestamp=0001790056256137815 create-version=2 source=SELECT sslver.thread_id,\n sslver.variable_value ssl_version,\n sslcip.variable_value ssl_cipher,\n sslreuse.variable_value ssl_sessions_reused\n FROM performance_schema.status_by_thread sslver\n LEFT JOIN performance_schema.status_by_thread sslcip\n ON (sslcip.thread_id=sslver.thread_id and sslcip.variable_name=\'Ssl_cipher\')\n LEFT JOIN performance_schema.status_by_thread sslreuse\n ON (sslreuse.thread_id=sslver.thread_id and sslreuse.variable_name=\'Ssl_sessions_reused\')\n WHERE sslver.variable_name=\'Ssl_version\'; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/statement_analysis.frm b/.rtx5tmp/db/sys/statement_analysis.frm similarity index 99% rename from .rtx5tmp/d/sys/statement_analysis.frm rename to .rtx5tmp/db/sys/statement_analysis.frm index 67c4ea6..9c09473 100644 --- a/.rtx5tmp/d/sys/statement_analysis.frm +++ b/.rtx5tmp/db/sys/statement_analysis.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638869992 +timestamp=0001790056255788827 create-version=2 source=SELECT sys.format_statement(DIGEST_TEXT) AS query,\n SCHEMA_NAME AS db,\n IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, \'*\', \'\') AS full_scan,\n COUNT_STAR AS exec_count,\n SUM_ERRORS AS err_count,\n SUM_WARNINGS AS warn_count,\n sys.format_time(SUM_TIMER_WAIT) AS total_latency,\n sys.format_time(MAX_TIMER_WAIT) AS max_latency,\n sys.format_time(AVG_TIMER_WAIT) AS avg_latency,\n sys.format_time(SUM_LOCK_TIME) AS lock_latency,\n SUM_ROWS_SENT AS rows_sent,\n ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,\n SUM_ROWS_EXAMINED AS rows_examined,\n ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,\n SUM_ROWS_AFFECTED AS rows_affected,\n ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg,\n SUM_CREATED_TMP_TABLES AS tmp_tables,\n SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables,\n SUM_SORT_ROWS AS rows_sorted,\n SUM_SORT_MERGE_PASSES AS sort_merge_passes,\n DIGEST AS digest,\n FIRST_SEEN AS first_seen,\n LAST_SEEN as last_seen\n FROM performance_schema.events_statements_summary_by_digest\nORDER BY SUM_TIMER_WAIT DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/statements_with_errors_or_warnings.frm b/.rtx5tmp/db/sys/statements_with_errors_or_warnings.frm similarity index 99% rename from .rtx5tmp/d/sys/statements_with_errors_or_warnings.frm rename to .rtx5tmp/db/sys/statements_with_errors_or_warnings.frm index f15ba02..5d4ae3b 100644 --- a/.rtx5tmp/d/sys/statements_with_errors_or_warnings.frm +++ b/.rtx5tmp/db/sys/statements_with_errors_or_warnings.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638880951 +timestamp=0001790056255801610 create-version=2 source=SELECT sys.format_statement(DIGEST_TEXT) AS query,\n SCHEMA_NAME as db,\n COUNT_STAR AS exec_count,\n SUM_ERRORS AS errors,\n IFNULL(SUM_ERRORS / NULLIF(COUNT_STAR, 0), 0) * 100 as error_pct,\n SUM_WARNINGS AS warnings,\n IFNULL(SUM_WARNINGS / NULLIF(COUNT_STAR, 0), 0) * 100 as warning_pct,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest\n WHERE SUM_ERRORS > 0\n OR SUM_WARNINGS > 0\nORDER BY SUM_ERRORS DESC, SUM_WARNINGS DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/statements_with_full_table_scans.frm b/.rtx5tmp/db/sys/statements_with_full_table_scans.frm similarity index 99% rename from .rtx5tmp/d/sys/statements_with_full_table_scans.frm rename to .rtx5tmp/db/sys/statements_with_full_table_scans.frm index 18d8c38..4312f84 100644 --- a/.rtx5tmp/d/sys/statements_with_full_table_scans.frm +++ b/.rtx5tmp/db/sys/statements_with_full_table_scans.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638892437 +timestamp=0001790056255814040 create-version=2 source=SELECT sys.format_statement(DIGEST_TEXT) AS query,\n SCHEMA_NAME as db,\n COUNT_STAR AS exec_count,\n sys.format_time(SUM_TIMER_WAIT) AS total_latency,\n SUM_NO_INDEX_USED AS no_index_used_count,\n SUM_NO_GOOD_INDEX_USED AS no_good_index_used_count,\n ROUND(IFNULL(SUM_NO_INDEX_USED / NULLIF(COUNT_STAR, 0), 0) * 100) AS no_index_used_pct,\n SUM_ROWS_SENT AS rows_sent,\n SUM_ROWS_EXAMINED AS rows_examined,\n ROUND(SUM_ROWS_SENT/COUNT_STAR) AS rows_sent_avg,\n ROUND(SUM_ROWS_EXAMINED/COUNT_STAR) AS rows_examined_avg,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest\n WHERE (SUM_NO_INDEX_USED > 0\n OR SUM_NO_GOOD_INDEX_USED > 0)\n AND DIGEST_TEXT NOT LIKE \'SHOW%\'\n ORDER BY no_index_used_pct DESC, total_latency DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/statements_with_runtimes_in_95th_percentile.frm b/.rtx5tmp/db/sys/statements_with_runtimes_in_95th_percentile.frm similarity index 99% rename from .rtx5tmp/d/sys/statements_with_runtimes_in_95th_percentile.frm rename to .rtx5tmp/db/sys/statements_with_runtimes_in_95th_percentile.frm index 2d43a56..490b3bd 100644 --- a/.rtx5tmp/d/sys/statements_with_runtimes_in_95th_percentile.frm +++ b/.rtx5tmp/db/sys/statements_with_runtimes_in_95th_percentile.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638914350 +timestamp=0001790056255840876 create-version=2 source=SELECT sys.format_statement(DIGEST_TEXT) AS query,\n SCHEMA_NAME as db,\n IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, \'*\', \'\') AS full_scan,\n COUNT_STAR AS exec_count,\n SUM_ERRORS AS err_count,\n SUM_WARNINGS AS warn_count,\n sys.format_time(SUM_TIMER_WAIT) AS total_latency,\n sys.format_time(MAX_TIMER_WAIT) AS max_latency,\n sys.format_time(AVG_TIMER_WAIT) AS avg_latency,\n SUM_ROWS_SENT AS rows_sent,\n ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,\n SUM_ROWS_EXAMINED AS rows_examined,\n ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,\n FIRST_SEEN AS first_seen,\n LAST_SEEN AS last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest stmts\n JOIN sys.x$ps_digest_95th_percentile_by_avg_us AS top_percentile\n ON ROUND(stmts.avg_timer_wait/1000000) >= top_percentile.avg_us\n ORDER BY AVG_TIMER_WAIT DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/statements_with_sorting.frm b/.rtx5tmp/db/sys/statements_with_sorting.frm similarity index 99% rename from .rtx5tmp/d/sys/statements_with_sorting.frm rename to .rtx5tmp/db/sys/statements_with_sorting.frm index 621b171..92be62f 100644 --- a/.rtx5tmp/d/sys/statements_with_sorting.frm +++ b/.rtx5tmp/db/sys/statements_with_sorting.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638926337 +timestamp=0001790056255853426 create-version=2 source=SELECT sys.format_statement(DIGEST_TEXT) AS query,\n SCHEMA_NAME db,\n COUNT_STAR AS exec_count,\n sys.format_time(SUM_TIMER_WAIT) AS total_latency,\n SUM_SORT_MERGE_PASSES AS sort_merge_passes,\n ROUND(IFNULL(SUM_SORT_MERGE_PASSES / NULLIF(COUNT_STAR, 0), 0)) AS avg_sort_merges,\n SUM_SORT_SCAN AS sorts_using_scans,\n SUM_SORT_RANGE AS sort_using_range,\n SUM_SORT_ROWS AS rows_sorted,\n ROUND(IFNULL(SUM_SORT_ROWS / NULLIF(COUNT_STAR, 0), 0)) AS avg_rows_sorted,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest\n WHERE SUM_SORT_ROWS > 0\n ORDER BY SUM_TIMER_WAIT DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/statements_with_temp_tables.frm b/.rtx5tmp/db/sys/statements_with_temp_tables.frm similarity index 99% rename from .rtx5tmp/d/sys/statements_with_temp_tables.frm rename to .rtx5tmp/db/sys/statements_with_temp_tables.frm index fe30352..e6f2496 100644 --- a/.rtx5tmp/d/sys/statements_with_temp_tables.frm +++ b/.rtx5tmp/db/sys/statements_with_temp_tables.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638937886 +timestamp=0001790056255866357 create-version=2 source=SELECT sys.format_statement(DIGEST_TEXT) AS query,\n SCHEMA_NAME as db,\n COUNT_STAR AS exec_count,\n sys.format_time(SUM_TIMER_WAIT) as total_latency,\n SUM_CREATED_TMP_TABLES AS memory_tmp_tables,\n SUM_CREATED_TMP_DISK_TABLES AS disk_tmp_tables,\n ROUND(IFNULL(SUM_CREATED_TMP_TABLES / NULLIF(COUNT_STAR, 0), 0)) AS avg_tmp_tables_per_query,\n ROUND(IFNULL(SUM_CREATED_TMP_DISK_TABLES / NULLIF(SUM_CREATED_TMP_TABLES, 0), 0) * 100) AS tmp_tables_to_disk_pct,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest\n WHERE SUM_CREATED_TMP_TABLES > 0\nORDER BY SUM_CREATED_TMP_DISK_TABLES DESC, SUM_CREATED_TMP_TABLES DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/sys_config.MAD b/.rtx5tmp/db/sys/sys_config.MAD similarity index 98% rename from .rtx5tmp/d/sys/sys_config.MAD rename to .rtx5tmp/db/sys/sys_config.MAD index 3fe7bd4efc7db76ff83a5ae76583f7e2e0101356..34240e366273ea4daff4c72b6df17094d6b12a25 100644 GIT binary patch delta 64 zcmZo@U~Fh$+#saDByK-hL_vvF++Kx&d2)_|!sKWLK9FFxf;Nbnp`Zz(4lAetsm(7H MgymWGu(_TB0QzeXeEp5MIS{x(;^kGrKe{$#fY0ES-? A9RL6T diff --git a/.rtx5tmp/d/sys/sys_config.frm b/.rtx5tmp/db/sys/sys_config.frm similarity index 93% rename from .rtx5tmp/d/sys/sys_config.frm rename to .rtx5tmp/db/sys/sys_config.frm index 983acf25a38943902f24cf6cdaa7ebb2fa530208..5244c289c83bc4ec6451ada7e3b35aed667ee823 100644 GIT binary patch delta 21 dcmew$@IhdL6W8Q3c}?3q1wXDZ-RPsj0RU|r2{Qly delta 21 dcmew$@IhdL6W0Ykm4(|}1wZbV-sq#k0RUum2z&ql diff --git a/.rtx5tmp/d/sys/user_summary.frm b/.rtx5tmp/db/sys/user_summary.frm similarity index 99% rename from .rtx5tmp/d/sys/user_summary.frm rename to .rtx5tmp/db/sys/user_summary.frm index 680659a..f20e719 100644 --- a/.rtx5tmp/d/sys/user_summary.frm +++ b/.rtx5tmp/db/sys/user_summary.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639008927 +timestamp=0001790056255951820 create-version=2 source=SELECT IF(accounts.user IS NULL, \'background\', accounts.user) AS user,\n SUM(stmt.total) AS statements,\n sys.format_time(SUM(stmt.total_latency)) AS statement_latency,\n sys.format_time(IFNULL(SUM(stmt.total_latency) / NULLIF(SUM(stmt.total), 0), 0)) AS statement_avg_latency,\n SUM(stmt.full_scans) AS table_scans,\n SUM(io.ios) AS file_ios,\n sys.format_time(SUM(io.io_latency)) AS file_io_latency,\n SUM(accounts.current_connections) AS current_connections,\n SUM(accounts.total_connections) AS total_connections,\n COUNT(DISTINCT host) AS unique_hosts,\n sys.format_bytes(SUM(mem.current_allocated)) AS current_memory,\n sys.format_bytes(SUM(mem.total_allocated)) AS total_memory_allocated\n FROM performance_schema.accounts\n LEFT JOIN sys.x$user_summary_by_statement_latency AS stmt ON IF(accounts.user IS NULL, \'background\', accounts.user) = stmt.user\n LEFT JOIN sys.x$user_summary_by_file_io AS io ON IF(accounts.user IS NULL, \'background\', accounts.user) = io.user\n LEFT JOIN sys.x$memory_by_user_by_current_bytes mem ON IF(accounts.user IS NULL, \'background\', accounts.user) = mem.user\n GROUP BY IF(accounts.user IS NULL, \'background\', accounts.user)\n ORDER BY SUM(stmt.total_latency) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/user_summary_by_file_io.frm b/.rtx5tmp/db/sys/user_summary_by_file_io.frm similarity index 98% rename from .rtx5tmp/d/sys/user_summary_by_file_io.frm rename to .rtx5tmp/db/sys/user_summary_by_file_io.frm index 8898d9e..f192102 100644 --- a/.rtx5tmp/d/sys/user_summary_by_file_io.frm +++ b/.rtx5tmp/db/sys/user_summary_by_file_io.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638960783 +timestamp=0001790056255893080 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n SUM(count_star) AS ios,\n sys.format_time(SUM(sum_timer_wait)) AS io_latency\n FROM performance_schema.events_waits_summary_by_user_by_event_name\n WHERE event_name LIKE \'wait/io/file/%\'\n GROUP BY IF(user IS NULL, \'background\', user)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/user_summary_by_file_io_type.frm b/.rtx5tmp/db/sys/user_summary_by_file_io_type.frm similarity index 98% rename from .rtx5tmp/d/sys/user_summary_by_file_io_type.frm rename to .rtx5tmp/db/sys/user_summary_by_file_io_type.frm index 4187f47..50106b3 100644 --- a/.rtx5tmp/d/sys/user_summary_by_file_io_type.frm +++ b/.rtx5tmp/db/sys/user_summary_by_file_io_type.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638949404 +timestamp=0001790056255878893 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n event_name,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS latency,\n sys.format_time(max_timer_wait) AS max_latency\n FROM performance_schema.events_waits_summary_by_user_by_event_name\n WHERE event_name LIKE \'wait/io/file%\'\n AND count_star > 0\n ORDER BY user, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/user_summary_by_stages.frm b/.rtx5tmp/db/sys/user_summary_by_stages.frm similarity index 98% rename from .rtx5tmp/d/sys/user_summary_by_stages.frm rename to .rtx5tmp/db/sys/user_summary_by_stages.frm index 9ec203a..176a344 100644 --- a/.rtx5tmp/d/sys/user_summary_by_stages.frm +++ b/.rtx5tmp/db/sys/user_summary_by_stages.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638994431 +timestamp=0001790056255937272 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n event_name,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(avg_timer_wait) AS avg_latency\n FROM performance_schema.events_stages_summary_by_user_by_event_name\n WHERE sum_timer_wait != 0\n ORDER BY user, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/user_summary_by_statement_latency.frm b/.rtx5tmp/db/sys/user_summary_by_statement_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/user_summary_by_statement_latency.frm rename to .rtx5tmp/db/sys/user_summary_by_statement_latency.frm index 92711e4..fae28e5 100644 --- a/.rtx5tmp/d/sys/user_summary_by_statement_latency.frm +++ b/.rtx5tmp/db/sys/user_summary_by_statement_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638982847 +timestamp=0001790056255919888 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n SUM(count_star) AS total,\n sys.format_time(SUM(sum_timer_wait)) AS total_latency,\n sys.format_time(SUM(max_timer_wait)) AS max_latency,\n sys.format_time(SUM(sum_lock_time)) AS lock_latency,\n SUM(sum_rows_sent) AS rows_sent,\n SUM(sum_rows_examined) AS rows_examined,\n SUM(sum_rows_affected) AS rows_affected,\n SUM(sum_no_index_used) + SUM(sum_no_good_index_used) AS full_scans\n FROM performance_schema.events_statements_summary_by_user_by_event_name\n GROUP BY IF(user IS NULL, \'background\', user)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/user_summary_by_statement_type.frm b/.rtx5tmp/db/sys/user_summary_by_statement_type.frm similarity index 99% rename from .rtx5tmp/d/sys/user_summary_by_statement_type.frm rename to .rtx5tmp/db/sys/user_summary_by_statement_type.frm index 0537249..4ebab9f 100644 --- a/.rtx5tmp/d/sys/user_summary_by_statement_type.frm +++ b/.rtx5tmp/db/sys/user_summary_by_statement_type.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638972186 +timestamp=0001790056255906099 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n SUBSTRING_INDEX(event_name, \'/\', -1) AS statement,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(max_timer_wait) AS max_latency,\n sys.format_time(sum_lock_time) AS lock_latency,\n sum_rows_sent AS rows_sent,\n sum_rows_examined AS rows_examined,\n sum_rows_affected AS rows_affected,\n sum_no_index_used + sum_no_good_index_used AS full_scans\n FROM performance_schema.events_statements_summary_by_user_by_event_name\n WHERE sum_timer_wait != 0\n ORDER BY user, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/version.frm b/.rtx5tmp/db/sys/version.frm similarity index 94% rename from .rtx5tmp/d/sys/version.frm rename to .rtx5tmp/db/sys/version.frm index e239529..d35b0f8 100644 --- a/.rtx5tmp/d/sys/version.frm +++ b/.rtx5tmp/db/sys/version.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638473957 +timestamp=0001790056255365812 create-version=2 source=SELECT \'1.5.1\' AS sys_version,\n version() AS mysql_version; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/wait_classes_global_by_avg_latency.frm b/.rtx5tmp/db/sys/wait_classes_global_by_avg_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/wait_classes_global_by_avg_latency.frm rename to .rtx5tmp/db/sys/wait_classes_global_by_avg_latency.frm index 8c26e78..1d57664 100644 --- a/.rtx5tmp/d/sys/wait_classes_global_by_avg_latency.frm +++ b/.rtx5tmp/db/sys/wait_classes_global_by_avg_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639103477 +timestamp=0001790056256038554 create-version=2 source=SELECT SUBSTRING_INDEX(event_name,\'/\', 3) AS event_class,\n SUM(COUNT_STAR) AS total,\n sys.format_time(CAST(SUM(sum_timer_wait) AS UNSIGNED)) AS total_latency,\n sys.format_time(MIN(min_timer_wait)) AS min_latency,\n sys.format_time(IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0)) AS avg_latency,\n sys.format_time(CAST(MAX(max_timer_wait) AS UNSIGNED)) AS max_latency\n FROM performance_schema.events_waits_summary_global_by_event_name\n WHERE sum_timer_wait > 0\n AND event_name != \'idle\'\n GROUP BY event_class\n ORDER BY IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/wait_classes_global_by_latency.frm b/.rtx5tmp/db/sys/wait_classes_global_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/wait_classes_global_by_latency.frm rename to .rtx5tmp/db/sys/wait_classes_global_by_latency.frm index e6fec34..daadaa6 100644 --- a/.rtx5tmp/d/sys/wait_classes_global_by_latency.frm +++ b/.rtx5tmp/db/sys/wait_classes_global_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639116898 +timestamp=0001790056256050147 create-version=2 source=SELECT SUBSTRING_INDEX(event_name,\'/\', 3) AS event_class,\n SUM(COUNT_STAR) AS total,\n sys.format_time(SUM(sum_timer_wait)) AS total_latency,\n sys.format_time(MIN(min_timer_wait)) min_latency,\n sys.format_time(IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0)) AS avg_latency,\n sys.format_time(MAX(max_timer_wait)) AS max_latency\n FROM performance_schema.events_waits_summary_global_by_event_name\n WHERE sum_timer_wait > 0\n AND event_name != \'idle\'\n GROUP BY SUBSTRING_INDEX(event_name,\'/\', 3)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/waits_by_host_by_latency.frm b/.rtx5tmp/db/sys/waits_by_host_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/waits_by_host_by_latency.frm rename to .rtx5tmp/db/sys/waits_by_host_by_latency.frm index 31a77f5..4b024d8 100644 --- a/.rtx5tmp/d/sys/waits_by_host_by_latency.frm +++ b/.rtx5tmp/db/sys/waits_by_host_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639146349 +timestamp=0001790056256074527 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n event_name AS event,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(avg_timer_wait) AS avg_latency,\n sys.format_time(max_timer_wait) AS max_latency\n FROM performance_schema.events_waits_summary_by_host_by_event_name\n WHERE event_name != \'idle\'\n AND sum_timer_wait > 0\n ORDER BY host, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/waits_by_user_by_latency.frm b/.rtx5tmp/db/sys/waits_by_user_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/waits_by_user_by_latency.frm rename to .rtx5tmp/db/sys/waits_by_user_by_latency.frm index 5c7052f..5defcae 100644 --- a/.rtx5tmp/d/sys/waits_by_user_by_latency.frm +++ b/.rtx5tmp/db/sys/waits_by_user_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639130837 +timestamp=0001790056256062072 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n event_name AS event,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(avg_timer_wait) AS avg_latency,\n sys.format_time(max_timer_wait) AS max_latency\n FROM performance_schema.events_waits_summary_by_user_by_event_name\n WHERE event_name != \'idle\'\n AND user IS NOT NULL\n AND sum_timer_wait > 0\n ORDER BY user, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/waits_global_by_latency.frm b/.rtx5tmp/db/sys/waits_global_by_latency.frm similarity index 98% rename from .rtx5tmp/d/sys/waits_global_by_latency.frm rename to .rtx5tmp/db/sys/waits_global_by_latency.frm index 1aff108..8d1eaee 100644 --- a/.rtx5tmp/d/sys/waits_global_by_latency.frm +++ b/.rtx5tmp/db/sys/waits_global_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639161408 +timestamp=0001790056256088435 create-version=2 source=SELECT event_name AS event,\n count_star AS total,\n sys.format_time(sum_timer_wait) AS total_latency,\n sys.format_time(avg_timer_wait) AS avg_latency,\n sys.format_time(max_timer_wait) AS max_latency\n FROM performance_schema.events_waits_summary_global_by_event_name\n WHERE event_name != \'idle\'\n AND sum_timer_wait > 0\n ORDER BY sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024host_summary.frm b/.rtx5tmp/db/sys/x@0024host_summary.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024host_summary.frm rename to .rtx5tmp/db/sys/x@0024host_summary.frm index 07b72a9..c9ec0eb 100644 --- a/.rtx5tmp/d/sys/x@0024host_summary.frm +++ b/.rtx5tmp/db/sys/x@0024host_summary.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639096925 +timestamp=0001790056256032240 create-version=2 source=SELECT IF(accounts.host IS NULL, \'background\', accounts.host) AS host,\n SUM(stmt.total) AS statements,\n SUM(stmt.total_latency) AS statement_latency,\n SUM(stmt.total_latency) / SUM(stmt.total) AS statement_avg_latency,\n SUM(stmt.full_scans) AS table_scans,\n SUM(io.ios) AS file_ios,\n SUM(io.io_latency) AS file_io_latency,\n SUM(accounts.current_connections) AS current_connections,\n SUM(accounts.total_connections) AS total_connections,\n COUNT(DISTINCT accounts.user) AS unique_users,\n SUM(mem.current_allocated) AS current_memory,\n SUM(mem.total_allocated) AS total_memory_allocated\n FROM performance_schema.accounts\n JOIN sys.x$host_summary_by_statement_latency AS stmt ON accounts.host = stmt.host\n JOIN sys.x$host_summary_by_file_io AS io ON accounts.host = io.host\n JOIN sys.x$memory_by_host_by_current_bytes mem ON accounts.host = mem.host\n GROUP BY IF(accounts.host IS NULL, \'background\', accounts.host); client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024host_summary_by_file_io.frm b/.rtx5tmp/db/sys/x@0024host_summary_by_file_io.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024host_summary_by_file_io.frm rename to .rtx5tmp/db/sys/x@0024host_summary_by_file_io.frm index a2365a5..14afacf 100644 --- a/.rtx5tmp/d/sys/x@0024host_summary_by_file_io.frm +++ b/.rtx5tmp/db/sys/x@0024host_summary_by_file_io.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639044872 +timestamp=0001790056255981275 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n SUM(count_star) AS ios,\n SUM(sum_timer_wait) AS io_latency\n FROM performance_schema.events_waits_summary_by_host_by_event_name\n WHERE event_name LIKE \'wait/io/file/%\'\n GROUP BY IF(host IS NULL, \'background\', host)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024host_summary_by_file_io_type.frm b/.rtx5tmp/db/sys/x@0024host_summary_by_file_io_type.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024host_summary_by_file_io_type.frm rename to .rtx5tmp/db/sys/x@0024host_summary_by_file_io_type.frm index 4f4504a..7e5ba13 100644 --- a/.rtx5tmp/d/sys/x@0024host_summary_by_file_io_type.frm +++ b/.rtx5tmp/db/sys/x@0024host_summary_by_file_io_type.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639032038 +timestamp=0001790056255969562 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n event_name,\n count_star AS total,\n sum_timer_wait AS total_latency,\n max_timer_wait AS max_latency\n FROM performance_schema.events_waits_summary_by_host_by_event_name\n WHERE event_name LIKE \'wait/io/file%\'\n AND count_star > 0\n ORDER BY IF(host IS NULL, \'background\', host), sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024host_summary_by_stages.frm b/.rtx5tmp/db/sys/x@0024host_summary_by_stages.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024host_summary_by_stages.frm rename to .rtx5tmp/db/sys/x@0024host_summary_by_stages.frm index 201aa8a..5ec474b 100644 --- a/.rtx5tmp/d/sys/x@0024host_summary_by_stages.frm +++ b/.rtx5tmp/db/sys/x@0024host_summary_by_stages.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639080050 +timestamp=0001790056256017722 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n event_name,\n count_star AS total,\n sum_timer_wait AS total_latency,\n avg_timer_wait AS avg_latency\n FROM performance_schema.events_stages_summary_by_host_by_event_name\n WHERE sum_timer_wait != 0\n ORDER BY IF(host IS NULL, \'background\', host), sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024host_summary_by_statement_latency.frm b/.rtx5tmp/db/sys/x@0024host_summary_by_statement_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024host_summary_by_statement_latency.frm rename to .rtx5tmp/db/sys/x@0024host_summary_by_statement_latency.frm index 494b5d1..da67ee1 100644 --- a/.rtx5tmp/d/sys/x@0024host_summary_by_statement_latency.frm +++ b/.rtx5tmp/db/sys/x@0024host_summary_by_statement_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639068350 +timestamp=0001790056256005982 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n SUM(count_star) AS total,\n SUM(sum_timer_wait) AS total_latency,\n MAX(max_timer_wait) AS max_latency,\n SUM(sum_lock_time) AS lock_latency,\n SUM(sum_rows_sent) AS rows_sent,\n SUM(sum_rows_examined) AS rows_examined,\n SUM(sum_rows_affected) AS rows_affected,\n SUM(sum_no_index_used) + SUM(sum_no_good_index_used) AS full_scans\n FROM performance_schema.events_statements_summary_by_host_by_event_name\n GROUP BY IF(host IS NULL, \'background\', host)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024host_summary_by_statement_type.frm b/.rtx5tmp/db/sys/x@0024host_summary_by_statement_type.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024host_summary_by_statement_type.frm rename to .rtx5tmp/db/sys/x@0024host_summary_by_statement_type.frm index 6a0a8ff..e85c93a 100644 --- a/.rtx5tmp/d/sys/x@0024host_summary_by_statement_type.frm +++ b/.rtx5tmp/db/sys/x@0024host_summary_by_statement_type.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639056998 +timestamp=0001790056255993745 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n SUBSTRING_INDEX(event_name, \'/\', -1) AS statement,\n count_star AS total,\n sum_timer_wait AS total_latency,\n max_timer_wait AS max_latency,\n sum_lock_time AS lock_latency,\n sum_rows_sent AS rows_sent,\n sum_rows_examined AS rows_examined,\n sum_rows_affected AS rows_affected,\n sum_no_index_used + sum_no_good_index_used AS full_scans\n FROM performance_schema.events_statements_summary_by_host_by_event_name\n WHERE sum_timer_wait != 0\n ORDER BY IF(host IS NULL, \'background\', host), sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024innodb_buffer_stats_by_schema.frm b/.rtx5tmp/db/sys/x@0024innodb_buffer_stats_by_schema.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024innodb_buffer_stats_by_schema.frm rename to .rtx5tmp/db/sys/x@0024innodb_buffer_stats_by_schema.frm index e2d9af2..ec82c86 100644 --- a/.rtx5tmp/d/sys/x@0024innodb_buffer_stats_by_schema.frm +++ b/.rtx5tmp/db/sys/x@0024innodb_buffer_stats_by_schema.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638610661 +timestamp=0001790056255504730 create-version=2 source=SELECT IF(LOCATE(\'.\', ibp.table_name) = 0, \'InnoDB System\', REPLACE(SUBSTRING_INDEX(ibp.table_name, \'.\', 1), \'`\', \'\')) AS object_schema,\n SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) AS allocated,\n SUM(ibp.data_size) AS data,\n COUNT(ibp.page_number) AS pages,\n COUNT(IF(ibp.is_hashed, 1, NULL)) AS pages_hashed,\n COUNT(IF(ibp.is_old, 1, NULL)) AS pages_old,\n ROUND(IFNULL(SUM(ibp.number_records)/NULLIF(COUNT(DISTINCT ibp.index_name), 0), 0)) AS rows_cached\n FROM information_schema.innodb_buffer_page ibp\n WHERE table_name IS NOT NULL\n GROUP BY object_schema\n ORDER BY SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024innodb_buffer_stats_by_table.frm b/.rtx5tmp/db/sys/x@0024innodb_buffer_stats_by_table.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024innodb_buffer_stats_by_table.frm rename to .rtx5tmp/db/sys/x@0024innodb_buffer_stats_by_table.frm index 566b499..982d64f 100644 --- a/.rtx5tmp/d/sys/x@0024innodb_buffer_stats_by_table.frm +++ b/.rtx5tmp/db/sys/x@0024innodb_buffer_stats_by_table.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638621539 +timestamp=0001790056255520146 create-version=2 source=SELECT IF(LOCATE(\'.\', ibp.table_name) = 0, \'InnoDB System\', REPLACE(SUBSTRING_INDEX(ibp.table_name, \'.\', 1), \'`\', \'\')) AS object_schema,\n REPLACE(SUBSTRING_INDEX(ibp.table_name, \'.\', -1), \'`\', \'\') AS object_name,\n SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) AS allocated,\n SUM(ibp.data_size) AS data,\n COUNT(ibp.page_number) AS pages,\n COUNT(IF(ibp.is_hashed, 1, NULL)) AS pages_hashed,\n COUNT(IF(ibp.is_old, 1, NULL)) AS pages_old,\n ROUND(IFNULL(SUM(ibp.number_records)/NULLIF(COUNT(DISTINCT ibp.index_name), 0), 0)) AS rows_cached\n FROM information_schema.innodb_buffer_page ibp\n WHERE table_name IS NOT NULL\n GROUP BY object_schema, object_name\n ORDER BY SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024innodb_lock_waits.frm b/.rtx5tmp/db/sys/x@0024innodb_lock_waits.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024innodb_lock_waits.frm rename to .rtx5tmp/db/sys/x@0024innodb_lock_waits.frm index c336b0b..c999ab8 100644 --- a/.rtx5tmp/d/sys/x@0024innodb_lock_waits.frm +++ b/.rtx5tmp/db/sys/x@0024innodb_lock_waits.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638633172 +timestamp=0001790056255532948 create-version=2 source=SELECT r.trx_wait_started AS wait_started,\n TIMEDIFF(NOW(), r.trx_wait_started) AS wait_age,\n TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) AS wait_age_secs,\n rl.lock_table AS locked_table,\n rl.lock_index AS locked_index,\n rl.lock_type AS locked_type,\n r.trx_id AS waiting_trx_id,\n r.trx_started as waiting_trx_started,\n TIMEDIFF(NOW(), r.trx_started) AS waiting_trx_age,\n r.trx_rows_locked AS waiting_trx_rows_locked,\n r.trx_rows_modified AS waiting_trx_rows_modified,\n r.trx_mysql_thread_id AS waiting_pid,\n r.trx_query AS waiting_query,\n rl.lock_id AS waiting_lock_id,\n rl.lock_mode AS waiting_lock_mode,\n b.trx_id AS blocking_trx_id,\n b.trx_mysql_thread_id AS blocking_pid,\n b.trx_query AS blocking_query,\n bl.lock_id AS blocking_lock_id,\n bl.lock_mode AS blocking_lock_mode,\n b.trx_started AS blocking_trx_started,\n TIMEDIFF(NOW(), b.trx_started) AS blocking_trx_age,\n b.trx_rows_locked AS blocking_trx_rows_locked,\n b.trx_rows_modified AS blocking_trx_rows_modified,\n CONCAT(\'KILL QUERY \', b.trx_mysql_thread_id) AS sql_kill_blocking_query,\n CONCAT(\'KILL \', b.trx_mysql_thread_id) AS sql_kill_blocking_connection\n FROM information_schema.innodb_lock_waits w\n INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id\n INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id\n INNER JOIN information_schema.innodb_locks bl ON bl.lock_id = w.blocking_lock_id\n INNER JOIN information_schema.innodb_locks rl ON rl.lock_id = w.requested_lock_id\n ORDER BY r.trx_wait_started; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024io_by_thread_by_latency.frm b/.rtx5tmp/db/sys/x@0024io_by_thread_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024io_by_thread_by_latency.frm rename to .rtx5tmp/db/sys/x@0024io_by_thread_by_latency.frm index 80703cf..05e2d8b 100644 --- a/.rtx5tmp/d/sys/x@0024io_by_thread_by_latency.frm +++ b/.rtx5tmp/db/sys/x@0024io_by_thread_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638685919 +timestamp=0001790056255590183 create-version=2 source=SELECT IF(processlist_id IS NULL,\n SUBSTRING_INDEX(name, \'/\', -1),\n CONCAT(processlist_user, \'@\', processlist_host)\n ) user,\n SUM(count_star) total,\n SUM(sum_timer_wait) total_latency,\n MIN(min_timer_wait) min_latency,\n AVG(avg_timer_wait) avg_latency,\n MAX(max_timer_wait) max_latency,\n thread_id,\n processlist_id\n FROM performance_schema.events_waits_summary_by_thread_by_event_name\n LEFT JOIN performance_schema.threads USING (thread_id)\n WHERE event_name LIKE \'wait/io/file/%\'\n AND sum_timer_wait > 0\n GROUP BY thread_id, processlist_id, user\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024io_global_by_file_by_bytes.frm b/.rtx5tmp/db/sys/x@0024io_global_by_file_by_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024io_global_by_file_by_bytes.frm rename to .rtx5tmp/db/sys/x@0024io_global_by_file_by_bytes.frm index 35b19fa..0b65490 100644 --- a/.rtx5tmp/d/sys/x@0024io_global_by_file_by_bytes.frm +++ b/.rtx5tmp/db/sys/x@0024io_global_by_file_by_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638698320 +timestamp=0001790056255602469 create-version=2 source=SELECT file_name AS file,\n count_read,\n sum_number_of_bytes_read AS total_read,\n IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0) AS avg_read,\n count_write,\n sum_number_of_bytes_write AS total_written,\n IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0.00) AS avg_write,\n sum_number_of_bytes_read + sum_number_of_bytes_write AS total,\n IFNULL(ROUND(100-((sum_number_of_bytes_read/ NULLIF((sum_number_of_bytes_read+sum_number_of_bytes_write), 0))*100), 2), 0.00) AS write_pct\n FROM performance_schema.file_summary_by_instance\n ORDER BY sum_number_of_bytes_read + sum_number_of_bytes_write DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024io_global_by_file_by_latency.frm b/.rtx5tmp/db/sys/x@0024io_global_by_file_by_latency.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024io_global_by_file_by_latency.frm rename to .rtx5tmp/db/sys/x@0024io_global_by_file_by_latency.frm index b60e974..9f7e104 100644 --- a/.rtx5tmp/d/sys/x@0024io_global_by_file_by_latency.frm +++ b/.rtx5tmp/db/sys/x@0024io_global_by_file_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638710489 +timestamp=0001790056255614299 create-version=2 source=SELECT file_name AS file,\n count_star AS total,\n sum_timer_wait AS total_latency,\n count_read,\n sum_timer_read AS read_latency,\n count_write,\n sum_timer_write AS write_latency,\n count_misc,\n sum_timer_misc AS misc_latency\n FROM performance_schema.file_summary_by_instance\n ORDER BY sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024io_global_by_wait_by_bytes.frm b/.rtx5tmp/db/sys/x@0024io_global_by_wait_by_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024io_global_by_wait_by_bytes.frm rename to .rtx5tmp/db/sys/x@0024io_global_by_wait_by_bytes.frm index a0482ee..5f86fda 100644 --- a/.rtx5tmp/d/sys/x@0024io_global_by_wait_by_bytes.frm +++ b/.rtx5tmp/db/sys/x@0024io_global_by_wait_by_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638722151 +timestamp=0001790056255626555 create-version=2 source=SELECT SUBSTRING_INDEX(event_name, \'/\', -2) AS event_name,\n count_star AS total,\n sum_timer_wait AS total_latency,\n min_timer_wait AS min_latency,\n avg_timer_wait AS avg_latency,\n max_timer_wait AS max_latency,\n count_read,\n sum_number_of_bytes_read AS total_read,\n IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0) AS avg_read,\n count_write,\n sum_number_of_bytes_write AS total_written,\n IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0) AS avg_written,\n sum_number_of_bytes_write + sum_number_of_bytes_read AS total_requested\n FROM performance_schema.file_summary_by_event_name\n WHERE event_name LIKE \'wait/io/file/%\'\n AND count_star > 0\n ORDER BY sum_number_of_bytes_write + sum_number_of_bytes_read DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024io_global_by_wait_by_latency.frm b/.rtx5tmp/db/sys/x@0024io_global_by_wait_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024io_global_by_wait_by_latency.frm rename to .rtx5tmp/db/sys/x@0024io_global_by_wait_by_latency.frm index d0d3bdc..3de4ad1 100644 --- a/.rtx5tmp/d/sys/x@0024io_global_by_wait_by_latency.frm +++ b/.rtx5tmp/db/sys/x@0024io_global_by_wait_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638733861 +timestamp=0001790056255639776 create-version=2 source=SELECT SUBSTRING_INDEX(event_name, \'/\', -2) AS event_name,\n count_star AS total,\n sum_timer_wait AS total_latency,\n avg_timer_wait AS avg_latency,\n max_timer_wait AS max_latency,\n sum_timer_read AS read_latency,\n sum_timer_write AS write_latency,\n sum_timer_misc AS misc_latency,\n count_read,\n sum_number_of_bytes_read AS total_read,\n IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0) AS avg_read,\n count_write,\n sum_number_of_bytes_write AS total_written,\n IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0) AS avg_written\n FROM performance_schema.file_summary_by_event_name\n WHERE event_name LIKE \'wait/io/file/%\'\n AND count_star > 0\n ORDER BY sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024latest_file_io.frm b/.rtx5tmp/db/sys/x@0024latest_file_io.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024latest_file_io.frm rename to .rtx5tmp/db/sys/x@0024latest_file_io.frm index a36d0d9..5c541b4 100644 --- a/.rtx5tmp/d/sys/x@0024latest_file_io.frm +++ b/.rtx5tmp/db/sys/x@0024latest_file_io.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638674240 +timestamp=0001790056255578042 create-version=2 source=SELECT IF(id IS NULL,\n CONCAT(SUBSTRING_INDEX(name, \'/\', -1), \':\', thread_id),\n CONCAT(user, \'@\', host, \':\', id)\n ) thread,\n object_name file,\n timer_wait AS latency,\n operation,\n number_of_bytes AS requested\n FROM performance_schema.events_waits_history_long\n JOIN performance_schema.threads USING (thread_id)\n LEFT JOIN information_schema.processlist ON processlist_id = id\n WHERE object_name IS NOT NULL\n AND event_name LIKE \'wait/io/file/%\'\n ORDER BY timer_start; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024memory_by_host_by_current_bytes.frm b/.rtx5tmp/db/sys/x@0024memory_by_host_by_current_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024memory_by_host_by_current_bytes.frm rename to .rtx5tmp/db/sys/x@0024memory_by_host_by_current_bytes.frm index 7e3012a..aa20c5c 100644 --- a/.rtx5tmp/d/sys/x@0024memory_by_host_by_current_bytes.frm +++ b/.rtx5tmp/db/sys/x@0024memory_by_host_by_current_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638756943 +timestamp=0001790056255664465 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n SUM(current_count_used) AS current_count_used,\n SUM(current_number_of_bytes_used) AS current_allocated,\n IFNULL(SUM(current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0) AS current_avg_alloc,\n MAX(current_number_of_bytes_used) AS current_max_alloc,\n SUM(sum_number_of_bytes_alloc) AS total_allocated\n FROM performance_schema.memory_summary_by_host_by_event_name\n GROUP BY IF(host IS NULL, \'background\', host)\n ORDER BY SUM(current_number_of_bytes_used) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024memory_by_thread_by_current_bytes.frm b/.rtx5tmp/db/sys/x@0024memory_by_thread_by_current_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024memory_by_thread_by_current_bytes.frm rename to .rtx5tmp/db/sys/x@0024memory_by_thread_by_current_bytes.frm index eda2ffe..81c49b4 100644 --- a/.rtx5tmp/d/sys/x@0024memory_by_thread_by_current_bytes.frm +++ b/.rtx5tmp/db/sys/x@0024memory_by_thread_by_current_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638768537 +timestamp=0001790056255676651 create-version=2 source=SELECT t.thread_id,\n IF(t.name = \'thread/sql/one_connection\',\n CONCAT(t.processlist_user, \'@\', t.processlist_host),\n REPLACE(t.name, \'thread/\', \'\')) user,\n SUM(mt.current_count_used) AS current_count_used,\n SUM(mt.current_number_of_bytes_used) AS current_allocated,\n IFNULL(SUM(mt.current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0) AS current_avg_alloc,\n MAX(mt.current_number_of_bytes_used) AS current_max_alloc,\n SUM(mt.sum_number_of_bytes_alloc) AS total_allocated\n FROM performance_schema.memory_summary_by_thread_by_event_name AS mt\n JOIN performance_schema.threads AS t USING (thread_id)\n GROUP BY thread_id, IF(t.name = \'thread/sql/one_connection\',\n CONCAT(t.processlist_user, \'@\', t.processlist_host),\n REPLACE(t.name, \'thread/\', \'\'))\n ORDER BY SUM(mt.current_number_of_bytes_used) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024memory_by_user_by_current_bytes.frm b/.rtx5tmp/db/sys/x@0024memory_by_user_by_current_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024memory_by_user_by_current_bytes.frm rename to .rtx5tmp/db/sys/x@0024memory_by_user_by_current_bytes.frm index 5081c06..f56fdcd 100644 --- a/.rtx5tmp/d/sys/x@0024memory_by_user_by_current_bytes.frm +++ b/.rtx5tmp/db/sys/x@0024memory_by_user_by_current_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638745512 +timestamp=0001790056255652364 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n SUM(current_count_used) AS current_count_used,\n SUM(current_number_of_bytes_used) AS current_allocated,\n IFNULL(SUM(current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0) AS current_avg_alloc,\n MAX(current_number_of_bytes_used) AS current_max_alloc,\n SUM(sum_number_of_bytes_alloc) AS total_allocated\n FROM performance_schema.memory_summary_by_user_by_event_name\n GROUP BY IF(user IS NULL, \'background\', user)\n ORDER BY SUM(current_number_of_bytes_used) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024memory_global_by_current_bytes.frm b/.rtx5tmp/db/sys/x@0024memory_global_by_current_bytes.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024memory_global_by_current_bytes.frm rename to .rtx5tmp/db/sys/x@0024memory_global_by_current_bytes.frm index d75bbff..badd7f9 100644 --- a/.rtx5tmp/d/sys/x@0024memory_global_by_current_bytes.frm +++ b/.rtx5tmp/db/sys/x@0024memory_global_by_current_bytes.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638779028 +timestamp=0001790056255688706 create-version=2 source=SELECT event_name,\n current_count_used AS current_count,\n current_number_of_bytes_used AS current_alloc,\n IFNULL(current_number_of_bytes_used / NULLIF(current_count_used, 0), 0) AS current_avg_alloc,\n high_count_used AS high_count,\n high_number_of_bytes_used AS high_alloc,\n IFNULL(high_number_of_bytes_used / NULLIF(high_count_used, 0), 0) AS high_avg_alloc\n FROM performance_schema.memory_summary_global_by_event_name\n WHERE current_number_of_bytes_used > 0\n ORDER BY current_number_of_bytes_used DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024memory_global_total.frm b/.rtx5tmp/db/sys/x@0024memory_global_total.frm similarity index 96% rename from .rtx5tmp/d/sys/x@0024memory_global_total.frm rename to .rtx5tmp/db/sys/x@0024memory_global_total.frm index 85b57d4..d394e08 100644 --- a/.rtx5tmp/d/sys/x@0024memory_global_total.frm +++ b/.rtx5tmp/db/sys/x@0024memory_global_total.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638790356 +timestamp=0001790056255700288 create-version=2 source=SELECT SUM(CURRENT_NUMBER_OF_BYTES_USED) total_allocated\n FROM performance_schema.memory_summary_global_by_event_name; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024processlist.frm b/.rtx5tmp/db/sys/x@0024processlist.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024processlist.frm rename to .rtx5tmp/db/sys/x@0024processlist.frm index 6312913..172033c 100644 --- a/.rtx5tmp/d/sys/x@0024processlist.frm +++ b/.rtx5tmp/db/sys/x@0024processlist.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639189324 +timestamp=0001790056256117074 create-version=2 source=SELECT pps.thread_id AS thd_id,\n pps.processlist_id AS conn_id,\n IF(pps.name = \'thread/sql/one_connection\',\n CONCAT(pps.processlist_user, \'@\', pps.processlist_host),\n REPLACE(pps.name, \'thread/\', \'\')) user,\n pps.processlist_db AS db,\n pps.processlist_command AS command,\n pps.processlist_state AS state,\n pps.processlist_time AS time,\n pps.processlist_info AS current_statement,\n IF(esc.end_event_id IS NULL,\n esc.timer_wait,\n NULL) AS statement_latency,\n IF(esc.end_event_id IS NULL,\n ROUND(100 * (estc.work_completed / estc.work_estimated), 2),\n NULL) AS progress,\n esc.lock_time AS lock_latency,\n esc.rows_examined AS rows_examined,\n esc.rows_sent AS rows_sent,\n esc.rows_affected AS rows_affected,\n esc.created_tmp_tables AS tmp_tables,\n esc.created_tmp_disk_tables AS tmp_disk_tables,\n IF(esc.no_good_index_used > 0 OR esc.no_index_used > 0, \'YES\', \'NO\') AS full_scan,\n IF(esc.end_event_id IS NOT NULL,\n esc.sql_text,\n NULL) AS last_statement,\n IF(esc.end_event_id IS NOT NULL,\n esc.timer_wait,\n NULL) AS last_statement_latency,\n mem.current_allocated AS current_memory,\n ewc.event_name AS last_wait,\n IF(ewc.end_event_id IS NULL AND ewc.event_name IS NOT NULL,\n \'Still Waiting\',\n ewc.timer_wait) last_wait_latency,\n ewc.source,\n etc.timer_wait AS trx_latency,\n etc.state AS trx_state,\n etc.autocommit AS trx_autocommit,\n conattr_pid.attr_value as pid,\n conattr_progname.attr_value as program_name\n FROM performance_schema.threads AS pps\n LEFT JOIN performance_schema.events_waits_current AS ewc USING (thread_id)\n LEFT JOIN performance_schema.events_stages_current AS estc USING (thread_id)\n LEFT JOIN performance_schema.events_statements_current AS esc USING (thread_id)\n LEFT JOIN performance_schema.events_transactions_current AS etc USING (thread_id)\n LEFT JOIN sys.x$memory_by_thread_by_current_bytes AS mem USING (thread_id)\n LEFT JOIN performance_schema.session_connect_attrs AS conattr_pid\n ON conattr_pid.processlist_id=pps.processlist_id and conattr_pid.attr_name=\'_pid\'\n LEFT JOIN performance_schema.session_connect_attrs AS conattr_progname\n ON conattr_progname.processlist_id=pps.processlist_id and conattr_progname.attr_name=\'program_name\'\n ORDER BY pps.processlist_time DESC, last_wait_latency DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024ps_digest_95th_percentile_by_avg_us.frm b/.rtx5tmp/db/sys/x@0024ps_digest_95th_percentile_by_avg_us.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024ps_digest_95th_percentile_by_avg_us.frm rename to .rtx5tmp/db/sys/x@0024ps_digest_95th_percentile_by_avg_us.frm index ecd162c..5f5131b 100644 --- a/.rtx5tmp/d/sys/x@0024ps_digest_95th_percentile_by_avg_us.frm +++ b/.rtx5tmp/db/sys/x@0024ps_digest_95th_percentile_by_avg_us.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638908455 +timestamp=0001790056255833353 create-version=2 source=SELECT s2.avg_us avg_us,\n IFNULL(SUM(s1.cnt)/NULLIF((SELECT COUNT(*) FROM performance_schema.events_statements_summary_by_digest), 0), 0) percentile\n FROM sys.x$ps_digest_avg_latency_distribution AS s1\n JOIN sys.x$ps_digest_avg_latency_distribution AS s2\n ON s1.avg_us <= s2.avg_us\n GROUP BY s2.avg_us\nHAVING IFNULL(SUM(s1.cnt)/NULLIF((SELECT COUNT(*) FROM performance_schema.events_statements_summary_by_digest), 0), 0) > 0.95\n ORDER BY percentile\n LIMIT 1; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024ps_digest_avg_latency_distribution.frm b/.rtx5tmp/db/sys/x@0024ps_digest_avg_latency_distribution.frm similarity index 97% rename from .rtx5tmp/d/sys/x@0024ps_digest_avg_latency_distribution.frm rename to .rtx5tmp/db/sys/x@0024ps_digest_avg_latency_distribution.frm index f737b3d..49dd3a6 100644 --- a/.rtx5tmp/d/sys/x@0024ps_digest_avg_latency_distribution.frm +++ b/.rtx5tmp/db/sys/x@0024ps_digest_avg_latency_distribution.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638902552 +timestamp=0001790056255825990 create-version=2 source=SELECT COUNT(*) cnt,\n ROUND(avg_timer_wait/1000000) AS avg_us\n FROM performance_schema.events_statements_summary_by_digest\n GROUP BY avg_us; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024ps_schema_table_statistics_io.frm b/.rtx5tmp/db/sys/x@0024ps_schema_table_statistics_io.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024ps_schema_table_statistics_io.frm rename to .rtx5tmp/db/sys/x@0024ps_schema_table_statistics_io.frm index dd1bff4..df70b0d 100644 --- a/.rtx5tmp/d/sys/x@0024ps_schema_table_statistics_io.frm +++ b/.rtx5tmp/db/sys/x@0024ps_schema_table_statistics_io.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638807299 +timestamp=0001790056255718952 create-version=2 source=SELECT extract_schema_from_file_name(file_name) AS table_schema,\n extract_table_from_file_name(file_name) AS table_name,\n SUM(count_read) AS count_read,\n SUM(sum_number_of_bytes_read) AS sum_number_of_bytes_read,\n SUM(sum_timer_read) AS sum_timer_read,\n SUM(count_write) AS count_write,\n SUM(sum_number_of_bytes_write) AS sum_number_of_bytes_write,\n SUM(sum_timer_write) AS sum_timer_write,\n SUM(count_misc) AS count_misc,\n SUM(sum_timer_misc) AS sum_timer_misc\n FROM performance_schema.file_summary_by_instance\n GROUP BY table_schema, table_name; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024schema_flattened_keys.frm b/.rtx5tmp/db/sys/x@0024schema_flattened_keys.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024schema_flattened_keys.frm rename to .rtx5tmp/db/sys/x@0024schema_flattened_keys.frm index 6f811bf..7ae7676 100644 --- a/.rtx5tmp/d/sys/x@0024schema_flattened_keys.frm +++ b/.rtx5tmp/db/sys/x@0024schema_flattened_keys.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638649001 +timestamp=0001790056255550250 create-version=2 source=SELECT\n TABLE_SCHEMA,\n TABLE_NAME,\n INDEX_NAME,\n MAX(NON_UNIQUE) AS non_unique,\n MAX(IF(SUB_PART IS NULL, 0, 1)) AS subpart_exists,\n GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS index_columns\n FROM INFORMATION_SCHEMA.STATISTICS\n WHERE\n INDEX_TYPE=\'BTREE\'\n AND TABLE_SCHEMA NOT IN (\'mysql\', \'sys\', \'INFORMATION_SCHEMA\', \'PERFORMANCE_SCHEMA\')\n GROUP BY\n TABLE_SCHEMA, TABLE_NAME, INDEX_NAME; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024schema_index_statistics.frm b/.rtx5tmp/db/sys/x@0024schema_index_statistics.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024schema_index_statistics.frm rename to .rtx5tmp/db/sys/x@0024schema_index_statistics.frm index 79412d4..cdd5ba1 100644 --- a/.rtx5tmp/d/sys/x@0024schema_index_statistics.frm +++ b/.rtx5tmp/db/sys/x@0024schema_index_statistics.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638801856 +timestamp=0001790056255713067 create-version=2 source=SELECT OBJECT_SCHEMA AS table_schema,\n OBJECT_NAME AS table_name,\n INDEX_NAME as index_name,\n COUNT_FETCH AS rows_selected,\n SUM_TIMER_FETCH AS select_latency,\n COUNT_INSERT AS rows_inserted,\n SUM_TIMER_INSERT AS insert_latency,\n COUNT_UPDATE AS rows_updated,\n SUM_TIMER_UPDATE AS update_latency,\n COUNT_DELETE AS rows_deleted,\n SUM_TIMER_INSERT AS delete_latency\n FROM performance_schema.table_io_waits_summary_by_index_usage\n WHERE index_name IS NOT NULL\n ORDER BY sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024schema_table_lock_waits.frm b/.rtx5tmp/db/sys/x@0024schema_table_lock_waits.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024schema_table_lock_waits.frm rename to .rtx5tmp/db/sys/x@0024schema_table_lock_waits.frm index 1162ff8..08127d2 100644 --- a/.rtx5tmp/d/sys/x@0024schema_table_lock_waits.frm +++ b/.rtx5tmp/db/sys/x@0024schema_table_lock_waits.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638863140 +timestamp=0001790056255781087 create-version=2 source=SELECT g.object_schema AS object_schema,\n g.object_name AS object_name,\n pt.thread_id AS waiting_thread_id,\n pt.processlist_id AS waiting_pid,\n sys.ps_thread_account(p.owner_thread_id) AS waiting_account,\n p.lock_type AS waiting_lock_type,\n p.lock_duration AS waiting_lock_duration,\n pt.processlist_info AS waiting_query,\n pt.processlist_time AS waiting_query_secs,\n ps.rows_affected AS waiting_query_rows_affected,\n ps.rows_examined AS waiting_query_rows_examined,\n gt.thread_id AS blocking_thread_id,\n gt.processlist_id AS blocking_pid,\n sys.ps_thread_account(g.owner_thread_id) AS blocking_account,\n g.lock_type AS blocking_lock_type,\n g.lock_duration AS blocking_lock_duration,\n CONCAT(\'KILL QUERY \', gt.processlist_id) AS sql_kill_blocking_query,\n CONCAT(\'KILL \', gt.processlist_id) AS sql_kill_blocking_connection\n FROM performance_schema.metadata_locks g\n INNER JOIN performance_schema.metadata_locks p\n ON g.object_type = p.object_type\n AND g.object_schema = p.object_schema\n AND g.object_name = p.object_name\n AND g.lock_status = \'GRANTED\'\n AND p.lock_status = \'PENDING\'\n INNER JOIN performance_schema.threads gt ON g.owner_thread_id = gt.thread_id\n INNER JOIN performance_schema.threads pt ON p.owner_thread_id = pt.thread_id\n LEFT JOIN performance_schema.events_statements_current gs ON g.owner_thread_id = gs.thread_id\n LEFT JOIN performance_schema.events_statements_current ps ON p.owner_thread_id = ps.thread_id\n WHERE g.object_type = \'TABLE\'; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024schema_table_statistics.frm b/.rtx5tmp/db/sys/x@0024schema_table_statistics.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024schema_table_statistics.frm rename to .rtx5tmp/db/sys/x@0024schema_table_statistics.frm index d5abcf7..dd999c0 100644 --- a/.rtx5tmp/d/sys/x@0024schema_table_statistics.frm +++ b/.rtx5tmp/db/sys/x@0024schema_table_statistics.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638820689 +timestamp=0001790056255733323 create-version=2 source=SELECT pst.object_schema AS table_schema,\n pst.object_name AS table_name,\n pst.sum_timer_wait AS total_latency,\n pst.count_fetch AS rows_fetched,\n pst.sum_timer_fetch AS fetch_latency,\n pst.count_insert AS rows_inserted,\n pst.sum_timer_insert AS insert_latency,\n pst.count_update AS rows_updated,\n pst.sum_timer_update AS update_latency,\n pst.count_delete AS rows_deleted,\n pst.sum_timer_delete AS delete_latency,\n fsbi.count_read AS io_read_requests,\n fsbi.sum_number_of_bytes_read AS io_read,\n fsbi.sum_timer_read AS io_read_latency,\n fsbi.count_write AS io_write_requests,\n fsbi.sum_number_of_bytes_write AS io_write,\n fsbi.sum_timer_write AS io_write_latency,\n fsbi.count_misc AS io_misc_requests,\n fsbi.sum_timer_misc AS io_misc_latency\n FROM performance_schema.table_io_waits_summary_by_table AS pst\n LEFT JOIN x$ps_schema_table_statistics_io AS fsbi\n ON pst.object_schema = fsbi.table_schema\n AND pst.object_name = fsbi.table_name\n ORDER BY pst.sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024schema_table_statistics_with_buffer.frm b/.rtx5tmp/db/sys/x@0024schema_table_statistics_with_buffer.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024schema_table_statistics_with_buffer.frm rename to .rtx5tmp/db/sys/x@0024schema_table_statistics_with_buffer.frm index b4257bb..3fe3557 100644 --- a/.rtx5tmp/d/sys/x@0024schema_table_statistics_with_buffer.frm +++ b/.rtx5tmp/db/sys/x@0024schema_table_statistics_with_buffer.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638833553 +timestamp=0001790056255748306 create-version=2 source=SELECT pst.object_schema AS table_schema,\n pst.object_name AS table_name,\n pst.count_fetch AS rows_fetched,\n pst.sum_timer_fetch AS fetch_latency,\n pst.count_insert AS rows_inserted,\n pst.sum_timer_insert AS insert_latency,\n pst.count_update AS rows_updated,\n pst.sum_timer_update AS update_latency,\n pst.count_delete AS rows_deleted,\n pst.sum_timer_delete AS delete_latency,\n fsbi.count_read AS io_read_requests,\n fsbi.sum_number_of_bytes_read AS io_read,\n fsbi.sum_timer_read AS io_read_latency,\n fsbi.count_write AS io_write_requests,\n fsbi.sum_number_of_bytes_write AS io_write,\n fsbi.sum_timer_write AS io_write_latency,\n fsbi.count_misc AS io_misc_requests,\n fsbi.sum_timer_misc AS io_misc_latency,\n ibp.allocated AS innodb_buffer_allocated,\n ibp.data AS innodb_buffer_data,\n (ibp.allocated - ibp.data) AS innodb_buffer_free,\n ibp.pages AS innodb_buffer_pages,\n ibp.pages_hashed AS innodb_buffer_pages_hashed,\n ibp.pages_old AS innodb_buffer_pages_old,\n ibp.rows_cached AS innodb_buffer_rows_cached\n FROM performance_schema.table_io_waits_summary_by_table AS pst\n LEFT JOIN x$ps_schema_table_statistics_io AS fsbi\n ON pst.object_schema = fsbi.table_schema\n AND pst.object_name = fsbi.table_name\n LEFT JOIN sys.x$innodb_buffer_stats_by_table AS ibp\n ON pst.object_schema = ibp.object_schema\n AND pst.object_name = ibp.object_name\n ORDER BY pst.sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024schema_tables_with_full_table_scans.frm b/.rtx5tmp/db/sys/x@0024schema_tables_with_full_table_scans.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024schema_tables_with_full_table_scans.frm rename to .rtx5tmp/db/sys/x@0024schema_tables_with_full_table_scans.frm index 520a0f4..b594d1d 100644 --- a/.rtx5tmp/d/sys/x@0024schema_tables_with_full_table_scans.frm +++ b/.rtx5tmp/db/sys/x@0024schema_tables_with_full_table_scans.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638844828 +timestamp=0001790056255760916 create-version=2 source=SELECT object_schema,\n object_name,\n count_read AS rows_full_scanned,\n sum_timer_wait AS latency\n FROM performance_schema.table_io_waits_summary_by_index_usage\n WHERE index_name IS NULL\n AND count_read > 0\n ORDER BY count_read DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024session.frm b/.rtx5tmp/db/sys/x@0024session.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024session.frm rename to .rtx5tmp/db/sys/x@0024session.frm index 031428c..fc56005 100644 --- a/.rtx5tmp/d/sys/x@0024session.frm +++ b/.rtx5tmp/db/sys/x@0024session.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639203161 +timestamp=0001790056256131998 create-version=2 source=SELECT * FROM sys.x$processlist\nWHERE conn_id IS NOT NULL AND command != \'Daemon\'; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024statement_analysis.frm b/.rtx5tmp/db/sys/x@0024statement_analysis.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024statement_analysis.frm rename to .rtx5tmp/db/sys/x@0024statement_analysis.frm index 71bfaf1..b7b1814 100644 --- a/.rtx5tmp/d/sys/x@0024statement_analysis.frm +++ b/.rtx5tmp/db/sys/x@0024statement_analysis.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638875022 +timestamp=0001790056255794610 create-version=2 source=SELECT DIGEST_TEXT AS query,\n SCHEMA_NAME AS db,\n IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, \'*\', \'\') AS full_scan,\n COUNT_STAR AS exec_count,\n SUM_ERRORS AS err_count,\n SUM_WARNINGS AS warn_count,\n SUM_TIMER_WAIT AS total_latency,\n MAX_TIMER_WAIT AS max_latency,\n AVG_TIMER_WAIT AS avg_latency,\n SUM_LOCK_TIME AS lock_latency,\n SUM_ROWS_SENT AS rows_sent,\n ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,\n SUM_ROWS_EXAMINED AS rows_examined,\n ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,\n SUM_ROWS_AFFECTED AS rows_affected,\n ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg,\n SUM_CREATED_TMP_TABLES AS tmp_tables,\n SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables,\n SUM_SORT_ROWS AS rows_sorted,\n SUM_SORT_MERGE_PASSES AS sort_merge_passes,\n DIGEST AS digest,\n FIRST_SEEN AS first_seen,\n LAST_SEEN as last_seen\n FROM performance_schema.events_statements_summary_by_digest\nORDER BY SUM_TIMER_WAIT DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024statements_with_errors_or_warnings.frm b/.rtx5tmp/db/sys/x@0024statements_with_errors_or_warnings.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024statements_with_errors_or_warnings.frm rename to .rtx5tmp/db/sys/x@0024statements_with_errors_or_warnings.frm index 7624e1a..1f63b8b 100644 --- a/.rtx5tmp/d/sys/x@0024statements_with_errors_or_warnings.frm +++ b/.rtx5tmp/db/sys/x@0024statements_with_errors_or_warnings.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638886160 +timestamp=0001790056255807929 create-version=2 source=SELECT DIGEST_TEXT AS query,\n SCHEMA_NAME as db,\n COUNT_STAR AS exec_count,\n SUM_ERRORS AS errors,\n IFNULL(SUM_ERRORS / NULLIF(COUNT_STAR, 0), 0) * 100 as error_pct,\n SUM_WARNINGS AS warnings,\n IFNULL(SUM_WARNINGS / NULLIF(COUNT_STAR, 0), 0) * 100 as warning_pct,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest\n WHERE SUM_ERRORS > 0\n OR SUM_WARNINGS > 0\nORDER BY SUM_ERRORS DESC, SUM_WARNINGS DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024statements_with_full_table_scans.frm b/.rtx5tmp/db/sys/x@0024statements_with_full_table_scans.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024statements_with_full_table_scans.frm rename to .rtx5tmp/db/sys/x@0024statements_with_full_table_scans.frm index ad6e7e0..9cce6f4 100644 --- a/.rtx5tmp/d/sys/x@0024statements_with_full_table_scans.frm +++ b/.rtx5tmp/db/sys/x@0024statements_with_full_table_scans.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638897493 +timestamp=0001790056255820305 create-version=2 source=SELECT DIGEST_TEXT AS query,\n SCHEMA_NAME as db,\n COUNT_STAR AS exec_count,\n SUM_TIMER_WAIT AS total_latency,\n SUM_NO_INDEX_USED AS no_index_used_count,\n SUM_NO_GOOD_INDEX_USED AS no_good_index_used_count,\n ROUND(IFNULL(SUM_NO_INDEX_USED / NULLIF(COUNT_STAR, 0), 0) * 100) AS no_index_used_pct,\n SUM_ROWS_SENT AS rows_sent,\n SUM_ROWS_EXAMINED AS rows_examined,\n ROUND(SUM_ROWS_SENT/COUNT_STAR) AS rows_sent_avg,\n ROUND(SUM_ROWS_EXAMINED/COUNT_STAR) AS rows_examined_avg,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest\n WHERE (SUM_NO_INDEX_USED > 0\n OR SUM_NO_GOOD_INDEX_USED > 0)\n AND DIGEST_TEXT NOT LIKE \'SHOW%\'\n ORDER BY no_index_used_pct DESC, total_latency DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024statements_with_runtimes_in_95th_percentile.frm b/.rtx5tmp/db/sys/x@0024statements_with_runtimes_in_95th_percentile.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024statements_with_runtimes_in_95th_percentile.frm rename to .rtx5tmp/db/sys/x@0024statements_with_runtimes_in_95th_percentile.frm index d3662e9..4169e35 100644 --- a/.rtx5tmp/d/sys/x@0024statements_with_runtimes_in_95th_percentile.frm +++ b/.rtx5tmp/db/sys/x@0024statements_with_runtimes_in_95th_percentile.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638920776 +timestamp=0001790056255846514 create-version=2 source=SELECT DIGEST_TEXT AS query,\n SCHEMA_NAME AS db,\n IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, \'*\', \'\') AS full_scan,\n COUNT_STAR AS exec_count,\n SUM_ERRORS AS err_count,\n SUM_WARNINGS AS warn_count,\n SUM_TIMER_WAIT AS total_latency,\n MAX_TIMER_WAIT AS max_latency,\n AVG_TIMER_WAIT AS avg_latency,\n SUM_ROWS_SENT AS rows_sent,\n ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,\n SUM_ROWS_EXAMINED AS rows_examined,\n ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest stmts\n JOIN sys.x$ps_digest_95th_percentile_by_avg_us AS top_percentile\n ON ROUND(stmts.avg_timer_wait/1000000) >= top_percentile.avg_us\n ORDER BY AVG_TIMER_WAIT DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024statements_with_sorting.frm b/.rtx5tmp/db/sys/x@0024statements_with_sorting.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024statements_with_sorting.frm rename to .rtx5tmp/db/sys/x@0024statements_with_sorting.frm index 2566261..3e7718a 100644 --- a/.rtx5tmp/d/sys/x@0024statements_with_sorting.frm +++ b/.rtx5tmp/db/sys/x@0024statements_with_sorting.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638932466 +timestamp=0001790056255860009 create-version=2 source=SELECT DIGEST_TEXT AS query,\n SCHEMA_NAME db,\n COUNT_STAR AS exec_count,\n SUM_TIMER_WAIT AS total_latency,\n SUM_SORT_MERGE_PASSES AS sort_merge_passes,\n ROUND(IFNULL(SUM_SORT_MERGE_PASSES / NULLIF(COUNT_STAR, 0), 0)) AS avg_sort_merges,\n SUM_SORT_SCAN AS sorts_using_scans,\n SUM_SORT_RANGE AS sort_using_range,\n SUM_SORT_ROWS AS rows_sorted,\n ROUND(IFNULL(SUM_SORT_ROWS / NULLIF(COUNT_STAR, 0), 0)) AS avg_rows_sorted,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest\n WHERE SUM_SORT_ROWS > 0\n ORDER BY SUM_TIMER_WAIT DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024statements_with_temp_tables.frm b/.rtx5tmp/db/sys/x@0024statements_with_temp_tables.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024statements_with_temp_tables.frm rename to .rtx5tmp/db/sys/x@0024statements_with_temp_tables.frm index f4badea..c7c6170 100644 --- a/.rtx5tmp/d/sys/x@0024statements_with_temp_tables.frm +++ b/.rtx5tmp/db/sys/x@0024statements_with_temp_tables.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638943130 +timestamp=0001790056255872815 create-version=2 source=SELECT DIGEST_TEXT AS query,\n SCHEMA_NAME as db,\n COUNT_STAR AS exec_count,\n SUM_TIMER_WAIT as total_latency,\n SUM_CREATED_TMP_TABLES AS memory_tmp_tables,\n SUM_CREATED_TMP_DISK_TABLES AS disk_tmp_tables,\n ROUND(IFNULL(SUM_CREATED_TMP_TABLES / NULLIF(COUNT_STAR, 0), 0)) AS avg_tmp_tables_per_query,\n ROUND(IFNULL(SUM_CREATED_TMP_DISK_TABLES / NULLIF(SUM_CREATED_TMP_TABLES, 0), 0) * 100) AS tmp_tables_to_disk_pct,\n FIRST_SEEN as first_seen,\n LAST_SEEN as last_seen,\n DIGEST AS digest\n FROM performance_schema.events_statements_summary_by_digest\n WHERE SUM_CREATED_TMP_TABLES > 0\nORDER BY SUM_CREATED_TMP_DISK_TABLES DESC, SUM_CREATED_TMP_TABLES DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024user_summary.frm b/.rtx5tmp/db/sys/x@0024user_summary.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024user_summary.frm rename to .rtx5tmp/db/sys/x@0024user_summary.frm index 04e0b17..2ef7583 100644 --- a/.rtx5tmp/d/sys/x@0024user_summary.frm +++ b/.rtx5tmp/db/sys/x@0024user_summary.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639016979 +timestamp=0001790056255957512 create-version=2 source=SELECT IF(accounts.user IS NULL, \'background\', accounts.user) AS user,\n SUM(stmt.total) AS statements,\n SUM(stmt.total_latency) AS statement_latency,\n IFNULL(SUM(stmt.total_latency) / NULLIF(SUM(stmt.total), 0), 0) AS statement_avg_latency,\n SUM(stmt.full_scans) AS table_scans,\n SUM(io.ios) AS file_ios,\n SUM(io.io_latency) AS file_io_latency,\n SUM(accounts.current_connections) AS current_connections,\n SUM(accounts.total_connections) AS total_connections,\n COUNT(DISTINCT host) AS unique_hosts,\n SUM(mem.current_allocated) AS current_memory,\n SUM(mem.total_allocated) AS total_memory_allocated\n FROM performance_schema.accounts\n LEFT JOIN sys.x$user_summary_by_statement_latency AS stmt ON IF(accounts.user IS NULL, \'background\', accounts.user) = stmt.user\n LEFT JOIN sys.x$user_summary_by_file_io AS io ON IF(accounts.user IS NULL, \'background\', accounts.user) = io.user\n LEFT JOIN sys.x$memory_by_user_by_current_bytes mem ON IF(accounts.user IS NULL, \'background\', accounts.user) = mem.user\n GROUP BY IF(accounts.user IS NULL, \'background\', accounts.user)\n ORDER BY SUM(stmt.total_latency) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024user_summary_by_file_io.frm b/.rtx5tmp/db/sys/x@0024user_summary_by_file_io.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024user_summary_by_file_io.frm rename to .rtx5tmp/db/sys/x@0024user_summary_by_file_io.frm index f8b5155..193ad71 100644 --- a/.rtx5tmp/d/sys/x@0024user_summary_by_file_io.frm +++ b/.rtx5tmp/db/sys/x@0024user_summary_by_file_io.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638965817 +timestamp=0001790056255898994 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n SUM(count_star) AS ios,\n SUM(sum_timer_wait) AS io_latency\n FROM performance_schema.events_waits_summary_by_user_by_event_name\n WHERE event_name LIKE \'wait/io/file/%\'\n GROUP BY IF(user IS NULL, \'background\', user)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024user_summary_by_file_io_type.frm b/.rtx5tmp/db/sys/x@0024user_summary_by_file_io_type.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024user_summary_by_file_io_type.frm rename to .rtx5tmp/db/sys/x@0024user_summary_by_file_io_type.frm index e525baf..9dcfccd 100644 --- a/.rtx5tmp/d/sys/x@0024user_summary_by_file_io_type.frm +++ b/.rtx5tmp/db/sys/x@0024user_summary_by_file_io_type.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638954596 +timestamp=0001790056255885341 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n event_name,\n count_star AS total,\n sum_timer_wait AS latency,\n max_timer_wait AS max_latency\n FROM performance_schema.events_waits_summary_by_user_by_event_name\n WHERE event_name LIKE \'wait/io/file%\'\n AND count_star > 0\n ORDER BY user, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024user_summary_by_stages.frm b/.rtx5tmp/db/sys/x@0024user_summary_by_stages.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024user_summary_by_stages.frm rename to .rtx5tmp/db/sys/x@0024user_summary_by_stages.frm index c6fccde..5465234 100644 --- a/.rtx5tmp/d/sys/x@0024user_summary_by_stages.frm +++ b/.rtx5tmp/db/sys/x@0024user_summary_by_stages.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639000168 +timestamp=0001790056255942888 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n event_name,\n count_star AS total,\n sum_timer_wait AS total_latency,\n avg_timer_wait AS avg_latency\n FROM performance_schema.events_stages_summary_by_user_by_event_name\n WHERE sum_timer_wait != 0\n ORDER BY user, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024user_summary_by_statement_latency.frm b/.rtx5tmp/db/sys/x@0024user_summary_by_statement_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024user_summary_by_statement_latency.frm rename to .rtx5tmp/db/sys/x@0024user_summary_by_statement_latency.frm index 994d973..0261cf1 100644 --- a/.rtx5tmp/d/sys/x@0024user_summary_by_statement_latency.frm +++ b/.rtx5tmp/db/sys/x@0024user_summary_by_statement_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638988540 +timestamp=0001790056255929441 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n SUM(count_star) AS total,\n SUM(sum_timer_wait) AS total_latency,\n SUM(max_timer_wait) AS max_latency,\n SUM(sum_lock_time) AS lock_latency,\n SUM(sum_rows_sent) AS rows_sent,\n SUM(sum_rows_examined) AS rows_examined,\n SUM(sum_rows_affected) AS rows_affected,\n SUM(sum_no_index_used) + SUM(sum_no_good_index_used) AS full_scans\n FROM performance_schema.events_statements_summary_by_user_by_event_name\n GROUP BY IF(user IS NULL, \'background\', user)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024user_summary_by_statement_type.frm b/.rtx5tmp/db/sys/x@0024user_summary_by_statement_type.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024user_summary_by_statement_type.frm rename to .rtx5tmp/db/sys/x@0024user_summary_by_statement_type.frm index a7b3f70..7730f03 100644 --- a/.rtx5tmp/d/sys/x@0024user_summary_by_statement_type.frm +++ b/.rtx5tmp/db/sys/x@0024user_summary_by_statement_type.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054638977621 +timestamp=0001790056255913162 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n SUBSTRING_INDEX(event_name, \'/\', -1) AS statement,\n count_star AS total,\n sum_timer_wait AS total_latency,\n max_timer_wait AS max_latency,\n sum_lock_time AS lock_latency,\n sum_rows_sent AS rows_sent,\n sum_rows_examined AS rows_examined,\n sum_rows_affected AS rows_affected,\n sum_no_index_used + sum_no_good_index_used AS full_scans\n FROM performance_schema.events_statements_summary_by_user_by_event_name\n WHERE sum_timer_wait != 0\n ORDER BY user, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024wait_classes_global_by_avg_latency.frm b/.rtx5tmp/db/sys/x@0024wait_classes_global_by_avg_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024wait_classes_global_by_avg_latency.frm rename to .rtx5tmp/db/sys/x@0024wait_classes_global_by_avg_latency.frm index f8d616b..a2578a4 100644 --- a/.rtx5tmp/d/sys/x@0024wait_classes_global_by_avg_latency.frm +++ b/.rtx5tmp/db/sys/x@0024wait_classes_global_by_avg_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639110163 +timestamp=0001790056256044526 create-version=2 source=SELECT SUBSTRING_INDEX(event_name,\'/\', 3) AS event_class,\n SUM(COUNT_STAR) AS total,\n SUM(sum_timer_wait) AS total_latency,\n MIN(min_timer_wait) AS min_latency,\n IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0) AS avg_latency,\n MAX(max_timer_wait) AS max_latency\n FROM performance_schema.events_waits_summary_global_by_event_name\n WHERE sum_timer_wait > 0\n AND event_name != \'idle\'\n GROUP BY event_class\n ORDER BY IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024wait_classes_global_by_latency.frm b/.rtx5tmp/db/sys/x@0024wait_classes_global_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024wait_classes_global_by_latency.frm rename to .rtx5tmp/db/sys/x@0024wait_classes_global_by_latency.frm index 39f7cb8..dd68bd8 100644 --- a/.rtx5tmp/d/sys/x@0024wait_classes_global_by_latency.frm +++ b/.rtx5tmp/db/sys/x@0024wait_classes_global_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639123468 +timestamp=0001790056256056250 create-version=2 source=SELECT SUBSTRING_INDEX(event_name,\'/\', 3) AS event_class,\n SUM(COUNT_STAR) AS total,\n SUM(sum_timer_wait) AS total_latency,\n MIN(min_timer_wait) AS min_latency,\n IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0) AS avg_latency,\n MAX(max_timer_wait) AS max_latency\n FROM performance_schema.events_waits_summary_global_by_event_name\n WHERE sum_timer_wait > 0\n AND event_name != \'idle\'\n GROUP BY SUBSTRING_INDEX(event_name,\'/\', 3)\n ORDER BY SUM(sum_timer_wait) DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024waits_by_host_by_latency.frm b/.rtx5tmp/db/sys/x@0024waits_by_host_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024waits_by_host_by_latency.frm rename to .rtx5tmp/db/sys/x@0024waits_by_host_by_latency.frm index c7d84fd..bcc6f51 100644 --- a/.rtx5tmp/d/sys/x@0024waits_by_host_by_latency.frm +++ b/.rtx5tmp/db/sys/x@0024waits_by_host_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639154765 +timestamp=0001790056256081825 create-version=2 source=SELECT IF(host IS NULL, \'background\', host) AS host,\n event_name AS event,\n count_star AS total,\n sum_timer_wait AS total_latency,\n avg_timer_wait AS avg_latency,\n max_timer_wait AS max_latency\n FROM performance_schema.events_waits_summary_by_host_by_event_name\n WHERE event_name != \'idle\'\n AND sum_timer_wait > 0\n ORDER BY host, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024waits_by_user_by_latency.frm b/.rtx5tmp/db/sys/x@0024waits_by_user_by_latency.frm similarity index 99% rename from .rtx5tmp/d/sys/x@0024waits_by_user_by_latency.frm rename to .rtx5tmp/db/sys/x@0024waits_by_user_by_latency.frm index 8b773a9..a6dea92 100644 --- a/.rtx5tmp/d/sys/x@0024waits_by_user_by_latency.frm +++ b/.rtx5tmp/db/sys/x@0024waits_by_user_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639138158 +timestamp=0001790056256068728 create-version=2 source=SELECT IF(user IS NULL, \'background\', user) AS user,\n event_name AS event,\n count_star AS total,\n sum_timer_wait AS total_latency,\n avg_timer_wait AS avg_latency,\n max_timer_wait AS max_latency\n FROM performance_schema.events_waits_summary_by_user_by_event_name\n WHERE event_name != \'idle\'\n AND user IS NOT NULL\n AND sum_timer_wait > 0\n ORDER BY user, sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/sys/x@0024waits_global_by_latency.frm b/.rtx5tmp/db/sys/x@0024waits_global_by_latency.frm similarity index 98% rename from .rtx5tmp/d/sys/x@0024waits_global_by_latency.frm rename to .rtx5tmp/db/sys/x@0024waits_global_by_latency.frm index 7acd404..faedb91 100644 --- a/.rtx5tmp/d/sys/x@0024waits_global_by_latency.frm +++ b/.rtx5tmp/db/sys/x@0024waits_global_by_latency.frm @@ -7,7 +7,7 @@ definer_user=mariadb.sys definer_host=localhost suid=0 with_check_option=0 -timestamp=0001790054639167366 +timestamp=0001790056256094196 create-version=2 source=SELECT event_name AS event,\n count_star AS total,\n sum_timer_wait AS total_latency,\n avg_timer_wait AS avg_latency,\n max_timer_wait AS max_latency\n FROM performance_schema.events_waits_summary_global_by_event_name\n WHERE event_name != \'idle\'\n AND sum_timer_wait > 0\n ORDER BY sum_timer_wait DESC; client_cs_name=utf8mb3 diff --git a/.rtx5tmp/d/test/db.opt b/.rtx5tmp/db/test/db.opt similarity index 100% rename from .rtx5tmp/d/test/db.opt rename to .rtx5tmp/db/test/db.opt diff --git a/.rtx5tmp/ddl_before.py b/.rtx5tmp/ddl_before.py new file mode 100644 index 0000000..b4d3714 --- /dev/null +++ b/.rtx5tmp/ddl_before.py @@ -0,0 +1,1026 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""pbl_runtime_event 表 DDL 单一权威生成器(M11b-1)。 + +范围(任务边界,勿越界):只负责 **schema 定义 + 按月 RANGE 分区 + append-only +约束** 的 DDL 生成与校验;不含事务写入逻辑、广播代码、轮询代码(那些属 M11b-2/-3, +在 pbl_runtime_ext/pbl_runtime_ext/{tx_write,partitions,broadcast}.py)。 + +归属模块(QC #22 决策 (b)):本表属 pbls 项目 generated_modules 中的 +``pbl_runtime_ext``(见 projects/pbls/pbls_spec.json 的 generated_modules 列表), +**不写在共享模块 world_sync 里**(world_sync 只保留 W-05 同步职责,已回退无关改动)。 + +设计决策(详见 projects/pbls/docs/02-develop/dev-notes-m11b1-pbl_runtime_event.md): + 1. 逻辑主键是 ``id``(AUTO_INCREMENT),但 MySQL/MariaDB 分区表要求 + 「每个唯一键必须包含全部分区列」,所以**物理主键是复合键 (id, created_at)**; + ``id`` 仍然全局唯一(AUTO_INCREMENT 保证),只是不再单独作 PRIMARY KEY。 + 2. 分区键选 ``created_at``(DATETIME,不用 TIMESTAMP:分区表达式不允许 TIMESTAMP), + 采用 ``PARTITION BY RANGE COLUMNS(created_at)`` + 命名月分区 p + + 末尾 ``pmax VALUES LESS THAN (MAXVALUE)`` 兜底,预建 6 个月。 + 3. append-only 双保险: + (a) 权限层 —— 迁移脚本 REVOKE app 账号的 UPDATE/DELETE(deploy 按需执行); + (b) 触发器层 —— BEFORE UPDATE / BEFORE DELETE 触发器调用存储过程 + ``pbl_assert_append_only()`` SIGNAL SQLSTATE '45000' 拒绝。 + 注:MySQL 系不允许在分区表上写视图/事件,但触发器是允许的; + 护栏防的是「误用与 ORM 隐式写入」,不防拥有 SET 权限的 DBA + (break-glass 变量 ``@pbl_guard_ctx`` 仅用于一次性历史数据回填)。 + 4. 与 sqlor ORM 的兼容性:sor.C() 只发 INSERT(不冲突);sor.U()/sor.D() 会被 + 触发器拒绝 —— 因此本模块所有写路径必须走 INSERT(tx_event/tx_write 已如此), + 迁移脚本与生成器**不产生任何** UPDATE/DELETE 语句。 + +用法: + python3 scripts/pbl_runtime_event_ddl.py --print # 打印建表 DDL + python3 scripts/pbl_runtime_event_ddl.py --emit [目录] # 生成迁移 SQL(幂等) + python3 scripts/pbl_runtime_event_ddl.py --verify # 离线静态自检 + python3 scripts/pbl_runtime_event_ddl.py --apply # 连库执行(读 env/*.json) + python3 scripts/pbl_runtime_event_ddl.py --verify-db # 连库验证分区裁剪/落分区/禁改禁删 + +退出码:0 成功 / 1 校验失败 / 2 环境不可用(DB 连不上,如实上报不谎报)。 +""" + +import argparse +import json +import os +import re +import sys +from datetime import date + +# 相对路径基准:本文件 = modules/pbl_runtime_ext/scripts/xxx.py → 上溯 3 级 = 机构工作空间 +HERE = os.path.dirname(os.path.abspath(__file__)) +MODULE_DIR = os.path.dirname(HERE) # modules/pbl_runtime_ext +WORKSPACE = os.path.dirname(os.path.dirname(MODULE_DIR)) # 机构工作空间根 +DEV_NOTES = "projects/pbls/docs/02-develop/dev-notes-m11b1-pbl_runtime_event.md" + +TABLE = "pbl_runtime_event" +PARTITION_COLUMN = "created_at" +PARTITION_PREFIX = "p" # p202609 ... +PARTITION_MAXVALUE = "pmax" +MONTHS_PRECREATE = 6 # 任务要求:预建 >= 6 个月分区 +RETENTION_MONTHS = 14 # 月分区保留数(超出由维护过程 DROP PARTITION) + +# ---------------------------------------------------------------- 列定义(唯一真源) +# (列名, 类型串, COMMENT);顺序 = 物理列顺序 +COLUMNS = [ + ("id", "BIGINT NOT NULL AUTO_INCREMENT", "自增ID(逻辑主键;物理主键=(id,created_at))"), + ("tenant_id", "VARCHAR(32) NOT NULL DEFAULT ''", "租户ID(多租户强制打头)"), + ("event_uid", "VARCHAR(64) NOT NULL", "事件UID(uuid,应用层生成)"), + ("event_code", "VARCHAR(64) NOT NULL DEFAULT ''", "事件编码"), + ("idem_key", "VARCHAR(128) NOT NULL DEFAULT ''", "幂等键(同键重复投递只落一条)"), + ("world_id", "BIGINT NOT NULL DEFAULT 0", "世界ID(引用 world 基表,只读)"), + ("scene_id", "BIGINT NOT NULL DEFAULT 0", "场景/会话ID(引用 scense 基表,只读)"), + ("session_id", "BIGINT NOT NULL DEFAULT 0", "游戏会话ID(M11a 语义,与 scene_id 同域)"), + ("entity_id", "VARCHAR(64) NOT NULL DEFAULT ''", "实体ID(引用 entity 基表,只读)"), + ("actor_id", "VARCHAR(64) NOT NULL DEFAULT ''", "触发者(服务端会话解析,客户端禁填)"), + ("event_type", "VARCHAR(64) NOT NULL", "事件类型"), + ("payload", "TEXT NULL", "事件负载JSON(任务书字段)"), + ("payload_json", "LONGTEXT NULL", "事件负载JSON(M11a 写路径列名,与 payload 同义留宽)"), + ("causation_id", "VARCHAR(64) NOT NULL DEFAULT ''", "因果链:引发本事件的事件UID"), + ("seq", "BIGINT NOT NULL DEFAULT 0", "会话内单调序号(轮询游标,应用层生成)"), + ("seq_no", "BIGINT NOT NULL DEFAULT 0", "会话内单调序号(M11a 写路径列名)"), + ("source", "VARCHAR(32) NOT NULL DEFAULT 'runtime'", "来源:runtime/agent/script/client_intent"), + ("state", "VARCHAR(16) NOT NULL DEFAULT 'applied'", "applied/rejected/rolled_back"), + ("state_version", "BIGINT NOT NULL DEFAULT 0", "本事件推进到的服务端权威版本"), + ("tx_group", "VARCHAR(64) NOT NULL DEFAULT ''", "事务组(同组同事务)"), + ("broadcast", "TINYINT NOT NULL DEFAULT 1", "是否参与广播 0/1"), + ("created_by", "BIGINT NOT NULL DEFAULT 0", "创建人"), + ("created_at", "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP", "创建时间(分区键,禁TIMESTAMP)"), + ("updated_at", "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP", "记录时间戳(append-only:永不 UPDATE)"), +] + +# 索引:(索引名, 类型, [列]);分区表铁律——唯一键必须包含全部分区列 +UNIQUE_KEYS = [ + ("uk_event_uid", ["tenant_id", "event_uid", PARTITION_COLUMN]), + ("uk_tenant_idem", ["tenant_id", "idem_key", PARTITION_COLUMN]), +] +SECONDARY_KEYS = [ + ("ix_scene_created", ["scene_id", PARTITION_COLUMN]), # 任务书要求的复合索引 + ("ix_tenant_session_seq", ["tenant_id", "session_id", "seq"]), + ("ix_tenant_session_seqno", ["tenant_id", "session_id", "seq_no"]), + ("ix_tenant_world_type", ["tenant_id", "world_id", "event_type"]), + ("ix_tx_group", ["tx_group"]), + ("ix_created_at", [PARTITION_COLUMN]), +] +PRIMARY_KEY = ["id", PARTITION_COLUMN] + +# M11a/M11b 现有写路径 INSERT 的列(自检据此断言 DDL 覆盖,防列名漂移) +INSERT_COLUMNS = ["tenant_id", "event_uid", "session_id", "world_id", "actor_id", + "event_type", "payload_json", "causation_id", "state_version", + "seq", "occurred_at", "created_at"] +# tx_event.py(M11a 单事务写路径)使用的列 +TX_EVENT_COLUMNS = ["tenant_id", "event_code", "idem_key", "world_id", "session_id", + "entity_id", "event_type", "payload", "seq_no", "source", "state", + "tx_group", "broadcast", "created_by", "created_at", "updated_at"] +# occurred_at 是 M11a 写路径与 partitions.py 曾用的分区列名 —— 迁移时必须一并落列, +# 否则旧 INSERT 直接报错。保留为兼容列(分区键已改为 created_at)。 +LEGACY_COLUMNS = ["occurred_at"] + +GUARD_ADMIN_CTX = "append_only_admin" + + +def column_names(): + return [c[0] for c in COLUMNS] + LEGACY_COLUMNS + + +# ---------------------------------------------------------------- DDL 片段生成 +def month_start(d): + return date(d.year, d.month, 1) + + +def add_months(d, n): + total = d.year * 12 + (d.month - 1) + n + return date(total // 12, total % 12 + 1, 1) + + +def partition_plan(today=None, months=None): + """返回 [(分区名, 上界 date), ...],含当月共 months 个月(>=6)。""" + today = today or date.today() + months = max(1, int(months or MONTHS_PRECREATE)) + first = month_start(today) + out = [] + for i in range(months): + ms = add_months(first, i) + out.append(("%s%s" % (PARTITION_PREFIX, ms.strftime("%Y%m")), add_months(ms, 1))) + return out + + +def create_table_sql(today=None, months=None): + """建表 DDL(含 RANGE COLUMNS 月分区 + pmax 兜底)。幂等:IF NOT EXISTS。""" + lines = ["CREATE TABLE IF NOT EXISTS `%s` (" % TABLE] + body = [] + for name, typ, comment in COLUMNS: + body.append(" `%s` %s COMMENT '%s'" % (name, typ, comment)) + for legacy in LEGACY_COLUMNS: + body.append(" `%s` DATETIME NULL COMMENT '兼容列(M11a 旧分区键,新写入可空)'" % legacy) + body.append(" PRIMARY KEY (%s)" % ", ".join("`%s`" % c for c in PRIMARY_KEY)) + for name, cols in UNIQUE_KEYS: + body.append(" UNIQUE KEY `%s` (%s)" % (name, ", ".join("`%s`" % c for c in cols))) + for name, cols in SECONDARY_KEYS: + body.append(" KEY `%s` (%s)" % (name, ", ".join("`%s`" % c for c in cols))) + lines.append(",\n".join(body)) + lines.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci") + lines.append(" COMMENT='运行时事件流(append-only,按月RANGE分区,保留%d个月)' " % RETENTION_MONTHS) + plan = partition_plan(today, months) + parts = [" PARTITION `%s` VALUES LESS THAN (DATE '%s')" % (n, b.isoformat()) + for n, b in plan] + parts.append(" PARTITION `%s` VALUES LESS THAN (MAXVALUE)" % PARTITION_MAXVALUE) + lines.append("PARTITION BY RANGE COLUMNS(`%s`) (\n%s\n);" % (PARTITION_COLUMN, ",\n".join(parts))) + return "\n".join(lines) + + +def append_only_sql(): + """append-only 约束:存储过程 + BEFORE UPDATE/DELETE 触发器(幂等)。""" + return """-- append-only 断言过程:非白名单操作一律 SIGNAL 拒绝 +DROP PROCEDURE IF EXISTS `pbl_assert_append_only`; +CREATE PROCEDURE `pbl_assert_append_only`( + IN p_table VARCHAR(64), IN p_priv VARCHAR(16), IN p_detail VARCHAR(255)) + READS SQL DATA +BEGIN + IF p_table <> '%(table)s' THEN + RETURN; -- 只守护事件表,其他表不受影响 + END IF; + IF IFNULL(@pbl_guard_ctx, '') = '%(ctx)s' THEN + RETURN; -- break-glass:一次性历史数据回填 + END IF; + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED', + MYSQL_ERRNO = 45001; +END; + +-- BEFORE UPDATE 护栏:把违规语句原文带进错误消息,便于定位调用方 +DROP TRIGGER IF EXISTS `trg_%(table)s_append_only_upd`; +CREATE TRIGGER `trg_%(table)s_append_only_upd` + BEFORE UPDATE ON `%(table)s` FOR EACH ROW +BEGIN + DECLARE v_sql TEXT; + DECLARE v_msg VARCHAR(255); + SET v_sql = ''; + BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_sql = ''; + SELECT INFO INTO v_sql FROM information_schema.processlist + WHERE ID = CONNECTION_ID(); + END; + IF IFNULL(@pbl_guard_ctx, '') = '%(ctx)s' THEN + SET v_msg = CONCAT('break-glass update on ', '%(table)s'); + ELSE + SET v_msg = CONCAT('UPDATE denied: ', LEFT(IFNULL(v_sql, 'n/a'), 120)); + END IF; + CALL pbl_assert_append_only('%(table)s', 'update', v_msg); + IF IFNULL(@pbl_guard_ctx, '') <> '%(ctx)s' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED_UPDATE', + MYSQL_ERRNO = 45002; + END IF; +END; + +-- BEFORE DELETE 护栏 +DROP TRIGGER IF EXISTS `trg_%(table)s_append_only_del`; +CREATE TRIGGER `trg_%(table)s_append_only_del` + BEFORE DELETE ON `%(table)s` FOR EACH ROW +BEGIN + DECLARE v_sql TEXT; + DECLARE v_msg VARCHAR(255); + SET v_sql = ''; + BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_sql = ''; + SELECT INFO INTO v_sql FROM information_schema.processlist + WHERE ID = CONNECTION_ID(); + END; + IF IFNULL(@pbl_guard_ctx, '') = '%(ctx)s' THEN + SET v_msg = CONCAT('break-glass delete on ', '%(table)s'); + ELSE + SET v_msg = CONCAT('DELETE denied: ', LEFT(IFNULL(v_sql, 'n/a'), 120)); + END IF; + CALL pbl_assert_append_only('%(table)s', 'delete', v_msg); + IF IFNULL(@pbl_guard_ctx, '') <> '%(ctx)s' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED_DELETE', + MYSQL_ERRNO = 45003; + END IF; +END; + +-- 权限层加固(可选,需 DBA 账号执行;app 账号只保留增/查) +-- GRANT INSERT, SELECT, UPDATE, DELETE ON `%(db)s`.`%(table)s` TO NULL; -- 占位,勿执行 +-- REVOKE UPDATE, DELETE ON `%(db)s`.`%(table)s` FROM '%(app_user)s'@'%%'; +""" % {"table": TABLE, "ctx": GUARD_ADMIN_CTX, "db": "%(dbname)s", "app_user": "%(app_user)s"} + + +def maintenance_sql(today=None, months=None): + """分区维护:过程(幂等补建月分区 / 到期 DROP 旧分区)+ 每月 EVENT。 + + QC #1 修复:正文含大量字面百分号(DATE_FORMAT(...,'%Y-%m-01')、'%Y%m'), + 原先用「三引号 % 字典」渲染会抛 ValueError: unsupported format character。 + 现改用 __TABLE__/__PMAX__/__MONTHS__ token + str.replace, + 字面百分号原样输出、无需再写双写转义。 + """ + months = int(months or MONTHS_PRECREATE) + body = """-- 1) 幂等补建未来月分区:pmax 存在时用 REORGANIZE PARTITION 拆出新月份(不丢数据) +DROP PROCEDURE IF EXISTS `pbl_runtime_event_ensure_partitions`; +CREATE PROCEDURE `pbl_runtime_event_ensure_partitions`(IN p_months_ahead INT) + MODIFIES SQL DATA +BEGIN + DECLARE v_done INT DEFAULT 0; + DECLARE v_name VARCHAR(16); + DECLARE v_upper DATE; + DECLARE v_exists INT DEFAULT 0; + DECLARE v_sql TEXT; + DECLARE cur CURSOR FOR + WITH RECURSIVE ms(month_start) AS ( + SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01') + UNION ALL + SELECT DATE_ADD(month_start, INTERVAL 1 MONTH) FROM ms + WHERE month_start < DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), + INTERVAL p_months_ahead MONTH) + ) + SELECT CONCAT('p', DATE_FORMAT(month_start, '%Y%m')), + DATE_ADD(month_start, INTERVAL 1 MONTH) + FROM ms; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1; + OPEN cur; + read_loop: LOOP + FETCH cur INTO v_name, v_upper; + IF v_done = 1 THEN + LEAVE read_loop; + END IF; + SELECT COUNT(*) INTO v_exists FROM information_schema.PARTITIONS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '__TABLE__' + AND PARTITION_NAME = v_name; + IF v_exists = 0 THEN + SET @pbl_part_sql = CONCAT( + 'ALTER TABLE `__TABLE__` REORGANIZE PARTITION `__PMAX__` INTO (', + 'PARTITION `', v_name, '` VALUES LESS THAN (DATE ''', v_upper, '''), ', + 'PARTITION `__PMAX__` VALUES LESS THAN (MAXVALUE))'); + PREPARE pbl_part_st FROM @pbl_part_sql; + EXECUTE pbl_part_st; + DEALLOCATE PREPARE pbl_part_st; + END IF; + END LOOP; + CLOSE cur; +END; + +-- 2) 到期归档:整月 DROP PARTITION(append-only 表唯一合规的清理手段) +DROP PROCEDURE IF EXISTS `pbl_runtime_event_prune_partitions`; +CREATE PROCEDURE `pbl_runtime_event_prune_partitions`(IN p_keep_months INT) + MODIFIES SQL DATA +BEGIN + DECLARE v_done INT DEFAULT 0; + DECLARE v_name VARCHAR(64); + DECLARE v_cutoff DATE; + DECLARE cur CURSOR FOR + SELECT PARTITION_NAME FROM information_schema.PARTITIONS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '__TABLE__' + AND PARTITION_NAME IS NOT NULL + AND PARTITION_NAME <> '__PMAX__' + AND PARTITION_NAME < CONCAT('p', DATE_FORMAT(v_cutoff, '%Y%m')); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1; + SET v_cutoff = DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL -p_keep_months MONTH); + OPEN cur; + prune_loop: LOOP + FETCH cur INTO v_name; + IF v_done = 1 THEN + LEAVE prune_loop; + END IF; + SET @pbl_drop_sql = CONCAT('ALTER TABLE `__TABLE__` DROP PARTITION `', v_name, '`'); + PREPARE pbl_drop_st FROM @pbl_drop_sql; + EXECUTE pbl_drop_st; + DEALLOCATE PREPARE pbl_drop_st; + END LOOP; + CLOSE cur; +END; + +-- 3) 每月自动补分区(需 event_scheduler=ON;否则用 cron,见开发说明) +-- SET GLOBAL event_scheduler = ON; +DROP EVENT IF EXISTS `ev___TABLE___partition_maintain`; +CREATE EVENT IF NOT EXISTS `ev___TABLE___partition_maintain` + ON SCHEDULE EVERY 1 MONTH + STARTS TIMESTAMP(DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01 03:00:00')) + ON COMPLETION PRESERVE + ENABLE + COMMENT '每月预建未来 __MONTHS__ 个月分区' +DO CALL pbl_runtime_event_ensure_partitions(__MONTHS__); +""" + return (body + .replace("__TABLE__", TABLE) + .replace("__PMAX__", PARTITION_MAXVALUE) + .replace("__MONTHS__", str(months))) + + +def migrate_from_legacy_sql(): + """M11a 非分区表 → M11b 分区表的一次性改造(幂等:已分区则跳过)。""" + return """-- 一次性改造(仅当 pbl_runtime_event 已存在且未分区时手工执行;先备份): +-- 1) CREATE TABLE pbl_runtime_event_new ... (本文件 A 段 DDL,改名 _new) +-- 2) SET @pbl_guard_ctx = '%(ctx)s'; -- break-glass,仅回填期间 +-- INSERT INTO pbl_runtime_event_new (...) SELECT ... FROM pbl_runtime_event; +-- SET @pbl_guard_ctx = NULL; +-- 3) RENAME TABLE pbl_runtime_event TO pbl_runtime_event_m11a_bak, +-- pbl_runtime_event_new TO pbl_runtime_event; +-- 4) 重放 append-only 触发器段(B 段),核对 EXPLAIN 分区裁剪后删备份表。 +-- 本脚本不自动执行改造:DROP/RENAME 生产表必须人工确认(见开发说明「回滚」段)。 +SELECT 'm11b-1 migrate: 人工执行,见注释' AS note; +""" % {"ctx": GUARD_ADMIN_CTX} + + +def full_script(dbname="pbls", app_user="pbls", today=None, months=None): + ddl = create_table_sql(today, months) + guard = append_only_sql().replace("%(dbname)s", dbname).replace("%(app_user)s", app_user) + maint = maintenance_sql(today, months) + head = ("-- ===========================================================================\n" + "-- %s 表 DDL + 按月 RANGE 分区 + append-only 约束(M11b-1)\n" + "-- 由 scripts/pbl_runtime_event_ddl.py 生成,改表结构只改生成器再 --emit。\n" + "-- 目标引擎 mariadb(projects/pbls/env/test.json: db.engine=mariadb)。\n" + "-- 执行:mysql --protocol=tcp -u -p < 本文件\n" + "-- 说明:触发器含多语句体,须用 mysql CLI(DELIMITER)执行;\n" + "-- 应用侧 ensure_tables() 只执行 A 段单语句 CREATE TABLE。\n" + "-- 开发说明:%s\n" + "-- ===========================================================================\n\n" + % (TABLE, DEV_NOTES)) + return (head + + "-- ---------------------------------------------------------------- A. 建表(分区)\n" + + ddl + "\n\n" + + "DELIMITER $$\n\n" + + "-- ---------------------------------------------------------------- B. append-only\n" + + _with_delimiter(guard) + + "\n-- ---------------------------------------------------------------- C. 分区维护\n" + + _with_delimiter(maint) + + "\nDELIMITER ;\n\n" + + "-- ---------------------------------------------------------------- D. 一次性改造\n" + + migrate_from_legacy_sql()) + + +_BLOCK_OPEN = re.compile(r"^BEGIN\b", re.I) +_BLOCK_CLOSE = re.compile(r"^END\s*;?\s*$", re.I) +_SUB_CLOSE = re.compile(r"^END\s+(IF|LOOP|CASE)\b", re.I) +_STMT_HEAD = re.compile( + r"^(DROP|CREATE|GRANT|REVOKE|SET|SELECT|CALL|ALTER|WITH|INSERT|UPDATE|DELETE|START)\b", re.I) +# 一个 $$ 段内不应再出现的「另一条 DDL 语句头」——出现即说明两条语句被黏在了一起 +_INLINE_DDL_HEAD = re.compile( + r"^\s*(DROP|CREATE)\s+(PROCEDURE|TRIGGER|EVENT|TABLE|FUNCTION)\b", re.I) +# 裸关键字残缺行:`CREATE$$` / `DROP$$`(QC #12 的致命产物形态) +_BARE_TOKEN = re.compile(r"^(CREATE|DROP|ALTER|GRANT|REVOKE)\s*\$\$\s*$", re.I) + + +def _with_delimiter(body, delim="$$"): + """把过程/触发器/EVENT 正文按语句切分,逐条以 $$ 收尾,交给 mysql CLI(DELIMITER)执行。 + + QC #12 修复(致命缺陷:迁移资产整体不可执行): + 旧实现 `re.split(r"(?<=;)\n(?=(DROP|CREATE|...))", body)` 的前瞻里带**捕获组**, + re.split 会把捕获到的文本('CREATE' / 'DROP')作为独立元素插进结果列表;这些孤立 token + 随后被当成一条完整语句,拼成裸 `CREATE$$` / `DROP$$` 行写进 .sql。在 `DELIMITER $$` 下 + 服务端把 `CREATE` 当独立语句解析 → ERROR 1064,02/03/canonical 三个文件全部无法执行。 + 另外旧实现把 `DROP PROCEDURE/TRIGGER/EVENT` 留在 `;` 结尾,而 DELIMITER 已改成 `$$`, + 客户端只认 `$$` 为语句结束符,`;` 结尾的 DROP 会与下一条 CREATE 黏成一条语句。 + 现改为按行扫描 + BEGIN/END 嵌套深度判定语句边界(不再使用带捕获组的 re.split): + · 每条语句去掉结尾 `;` 后以 `$$` 结束(含 DROP ... IF EXISTS); + · `--` 注释行原样保留、不加 `$$`(否则 `$$` 被行注释吞掉,语句永不结束); + · 结构上只可能产出以完整关键字开头的语句段,不可能产出裸 `CREATE`/`DROP`。 + """ + out = [] + buf = [] + cmts = [] + depth = [0] + + def flush(): + if not buf: + if cmts: + out.append("\n".join(cmts)) + del cmts[:] + return + stmt = re.sub(r";\s*$", "", "\n".join(buf).strip()) + head = ("\n".join(cmts) + "\n") if cmts else "" + out.append(head + stmt + delim) + del buf[:] + del cmts[:] + + for raw in body.replace("\r\n", "\n").split("\n"): + line = raw.rstrip() + s = line.strip() + if not s: + continue + if not buf: + if s.startswith("--") or s.startswith("#") or not _STMT_HEAD.match(s): + cmts.append(line) + continue + if _BLOCK_OPEN.match(s): + depth[0] += 1 + elif _BLOCK_CLOSE.match(s) and depth[0] > 0: + depth[0] -= 1 + buf.append(line) + if depth[0] == 0 and s.endswith(";") and not _SUB_CLOSE.match(s): + flush() + flush() + return "\n\n".join(out) + "\n" + + +def _delimiter_integrity_errors(text, label=""): + """DELIMITER 语句完整性静态断言(QC #16:PASS 要能证明「可执行」,而非只查关键字存在)。 + + 断言项: + 1) `DELIMITER x` 与 `DELIMITER ;` 严格配对,文件结束时不残留未闭合块; + 2) 每个 `$$` 段首个代码行必须是**完整**语句头(关键字 + 对象类型), + 禁止 `CREATE$$` / `DROP$$` 这类孤立残缺 token(服务端 ERROR 1064); + 3) 一个 `$$` 段内不得再出现第二条 DDL 语句头(防止 `;` 结尾语句与下一条黏连); + 4) 未以 `$$` 收尾的残段里若含可执行语句(纯注释尾巴放行)即判失败。 + 返回缺陷描述列表;空列表 = 结构通过。 + """ + errs = [] + pfx = ("[%s] " % label) if label else "" + lines = text.split("\n") + delim = [None] + seg = [[]] + + def code_of(ls): + return [x.strip() for x in ls if x.strip() and not x.strip().startswith("--") + and not x.strip().startswith("#")] + + def close_segment(): + code = code_of(seg[0]) + if not code: + seg[0] = [] + return + d = delim[0] or "$$" + first_words = code[0].replace(d, "").split() + if len(first_words) < 2: + errs.append(pfx + "残缺语句 token(服务端按独立语句解析 → ERROR 1064): %r" % code[0]) + for x in code[1:]: + if _INLINE_DDL_HEAD.match(x): + errs.append(pfx + "一个 %s 段内黏连了多条 DDL 语句: %r" % (d, x.strip())) + seg[0] = [] + + for i, ln in enumerate(lines, 1): + s = ln.strip() + if _BARE_TOKEN.match(s): + errs.append(pfx + "L%d 裸关键字$$ 残缺行: %r" % (i, s)) + if s.upper().startswith("DELIMITER"): + parts = s.split(None, 1) + new = parts[1].strip() if len(parts) > 1 else ";" + if seg[0]: + close_segment() + if delim[0] is None: + if new == ";": + errs.append(pfx + "L%d 出现没有配对的 `DELIMITER ;`" % i) + else: + delim[0] = new + else: + if new != ";": + errs.append(pfx + "L%d DELIMITER %s 未闭合就切换到 %s" + % (i, delim[0], new)) + delim[0] = new + else: + delim[0] = None + continue + if delim[0]: + seg[0].append(ln) + if s.endswith(delim[0]): + close_segment() + if seg[0]: + errs.append(pfx + "DELIMITER 块末尾存在未以 %s 收尾的可执行残段: %r" + % (delim[0] or "$$", code_of(seg[0])[0][:60])) + seg[0] = [] + if delim[0] is not None: + errs.append(pfx + "文件结束时 DELIMITER %s 仍未闭合" % delim[0]) + return errs + + +# ---------------------------------------------------------------- 迁移文件产出 +MIGRATION_FILES = [ + ("20260919_m11b_01_create_pbl_runtime_event.sql", + lambda db: create_table_sql() + "\n"), + ("20260919_m11b_02_pbl_runtime_event_append_only.sql", + lambda db: "DELIMITER $$\n\n" + _with_delimiter( + append_only_sql().replace("%(dbname)s", db).replace("%(app_user)s", db)) + + "\nDELIMITER ;\n"), + ("20260919_m11b_03_pbl_runtime_event_partition_maintenance.sql", + lambda db: "DELIMITER $$\n\n" + _with_delimiter(maintenance_sql()) + + "\nDELIMITER ;\n"), +] + + +def emit(out_dir=None, dbname="pbls"): + out_dir = out_dir or os.path.join(MODULE_DIR, "scripts", "migrations") + os.makedirs(out_dir, exist_ok=True) + written = [] + for name, fn in MIGRATION_FILES: + path = os.path.join(out_dir, name) + with open(path, "w", encoding="utf-8") as f: + f.write("-- 生成器: scripts/pbl_runtime_event_ddl.py --emit (M11b-1)\n" + "-- 开发说明: %s\n-- 幂等: CREATE ... IF NOT EXISTS / DROP ... IF EXISTS\n\n" + % DEV_NOTES) + f.write(fn(dbname)) + written.append(path) + canon = os.path.join(MODULE_DIR, "sql", "m11b_partitions.sql") + os.makedirs(os.path.dirname(canon), exist_ok=True) + with open(canon, "w", encoding="utf-8") as f: + f.write(full_script(dbname=dbname)) + written.append(canon) + return written + + +# ---------------------------------------------------------------- 离线静态自检 +def verify(): + """静态断言:返回 (ok, msgs)。不连库,可离线取证。""" + msgs = [] + ok = True + ddl = create_table_sql() + cols = column_names() + + # 1. 任务书字段齐备 + for need in ["event_id", "scene_id", "entity_id", "event_type", "payload", + PARTITION_COLUMN, "seq"]: + hit = need in cols or (need == "event_id" and "event_uid" in cols) + if not hit: + ok = False + msgs.append("FAIL 缺字段 %s(event_id 由 event_uid 承载)" % need) + msgs.append("PASS 任务书字段齐备: %s" % ",".join(cols)) + + # 2. 物理主键含分区键;唯一键含分区键 + if PARTITION_COLUMN not in PRIMARY_KEY: + ok = False + msgs.append("FAIL 物理主键未包含分区键 %s" % PARTITION_COLUMN) + else: + msgs.append("PASS 物理主键=%s(逻辑主键 id + 分区键)" % ",".join(PRIMARY_KEY)) + for name, kcols in UNIQUE_KEYS: + if PARTITION_COLUMN not in kcols: + ok = False + msgs.append("FAIL 唯一键 %s 未含分区键" % name) + msgs.append("PASS 唯一键均含分区键: %s" % ",".join(n for n, _ in UNIQUE_KEYS)) + + # 3. 索引要求:scene_id+created_at 复合索引、event_uid 唯一索引 + if not any(set(k) == {"scene_id", PARTITION_COLUMN} for _, k in SECONDARY_KEYS): + ok = False + msgs.append("FAIL 缺 scene_id+created_at 复合索引") + else: + msgs.append("PASS 存在 (scene_id, created_at) 复合索引 ix_scene_created") + if not any(k[:2] == ["tenant_id", "event_uid"] for _, k in UNIQUE_KEYS): + ok = False + msgs.append("FAIL 缺 event_uid 唯一索引") + else: + msgs.append("PASS 存在 event_uid 唯一索引 uk_event_uid") + + # 4. 分区:>=6 个月 + MAXVALUE 兜底 + 分区键为 DATETIME + plan = partition_plan() + if len(plan) < MONTHS_PRECREATE: + ok = False + msgs.append("FAIL 预建分区数 %d < %d" % (len(plan), MONTHS_PRECREATE)) + else: + msgs.append("PASS 预建 %d 个月分区: %s + %s(MAXVALUE)" + % (len(plan), ",".join(n for n, _ in plan), PARTITION_MAXVALUE)) + if "PARTITION BY RANGE COLUMNS(`%s`)" % PARTITION_COLUMN not in ddl: + ok = False + msgs.append("FAIL 未声明 RANGE COLUMNS 分区") + if "VALUES LESS THAN (MAXVALUE)" not in ddl: + ok = False + msgs.append("FAIL 缺 MAXVALUE 兜底分区") + if re.search(r"`%s`\s+TIMESTAMP" % PARTITION_COLUMN, ddl): + ok = False + msgs.append("FAIL 分区键用了 TIMESTAMP(MySQL 不允许)") + else: + msgs.append("PASS 分区键类型 DATETIME(非 TIMESTAMP)") + + # 5. append-only:DDL/迁移全文不得出现对本表的 UPDATE/DELETE 语句 + all_sql = ddl + append_only_sql() + maintenance_sql() + for bad in [r"UPDATE\s+`%s`" % TABLE, r"DELETE\s+FROM\s+`%s`" % TABLE]: + if re.search(bad, all_sql, re.I): + ok = False + msgs.append("FAIL 生成的 SQL 含违规写语句 %s" % bad) + if "BEFORE UPDATE" not in append_only_sql() or "BEFORE DELETE" not in append_only_sql(): + ok = False + msgs.append("FAIL append-only 触发器缺失") + else: + msgs.append("PASS append-only: BEFORE UPDATE + BEFORE DELETE + pbl_assert_append_only()") + + # 6. 与既有写路径列名兼容(防 DDL 漂移把 M11a/M11b 代码打挂) + for col in set(INSERT_COLUMNS) | set(TX_EVENT_COLUMNS): + if col not in cols: + ok = False + msgs.append("FAIL 写路径引用列 %s 不在 DDL 中" % col) + msgs.append("PASS 覆盖 M11a/M11b 写路径全部列名(%d 个)" + % len(set(INSERT_COLUMNS) | set(TX_EVENT_COLUMNS))) + + # 7. 幂等性:所有 DDL 语句可重复执行 + idem_ok = ("CREATE TABLE IF NOT EXISTS" in ddl + and "DROP PROCEDURE IF EXISTS" in append_only_sql() + and "DROP TRIGGER IF EXISTS" in append_only_sql() + and "DROP EVENT IF EXISTS" in maintenance_sql()) + if not idem_ok: + ok = False + msgs.append("FAIL DDL 非幂等(缺 IF EXISTS / DROP IF EXISTS)") + else: + msgs.append("PASS 幂等:IF NOT EXISTS + DROP ... IF EXISTS + 分区存在性判断") + + # 8. DELIMITER 语句完整性(QC #16:PASS 必须能证明「可执行」,不能只查关键字存在性) + artifacts = [ + ("01", create_table_sql()), + ("02", MIGRATION_FILES[1][1]("pbls")), + ("03", MIGRATION_FILES[2][1]("pbls")), + ("canonical", full_script()), + ] + struct_errs = [] + for label, text in artifacts: + struct_errs.extend(_delimiter_integrity_errors(text, label)) + if struct_errs: + ok = False + for e in struct_errs: + msgs.append("FAIL DELIMITER 语句完整性: " + e) + else: + msgs.append("PASS DELIMITER 语句完整性: 4 个产物 DELIMITER 配对正确、%d 个 $$ 段首关键字完整、" + "无裸 CREATE$$/DROP$$ 残缺行" + % sum(len(re.findall(r"\$\$\s*$", t, re.M)) for _, t in artifacts)) + + # 9. 幂等/结构关键字逐产物覆盖(QC #17:完整陈述,不再跳号回避缺陷) + need_map = [ + ("01", ("CREATE TABLE IF NOT EXISTS", "PARTITION BY RANGE COLUMNS", + "VALUES LESS THAN (MAXVALUE)")), + ("02", ("DROP PROCEDURE IF EXISTS", "DROP TRIGGER IF EXISTS", + "BEFORE UPDATE", "BEFORE DELETE")), + ("03", ("DROP PROCEDURE IF EXISTS", "DROP EVENT IF EXISTS", "CREATE EVENT")), + ] + by_label = dict(artifacts) + miss_all = [] + for label, needs in need_map: + miss_all.extend("%s:%s" % (label, n) for n in needs if n not in by_label[label]) + if miss_all: + ok = False + msgs.append("FAIL 幂等/结构关键字缺失: " + ", ".join(miss_all)) + else: + msgs.append("PASS 幂等关键字逐文件覆盖: 01 建表分区 / 02 过程+双触发器 / 03 双过程+EVENT") + return ok, msgs + + +# ---------------------------------------------------------------- 连库执行 / 验证 +def _db_conf(): + """读项目唯一事实源 env/test.json(禁止硬编码连接串)。 + + 沙箱库开关(harness,QC #1 配套的验证隔离能力):环境变量 PBL_DDL_DB_HOST / + PBL_DDL_DB_PORT **只覆盖 host/port**,供 CI / 验证 harness 把连库分支指向一次性沙箱库 + ——破坏性判定(DROP PARTITION、探针 INSERT、guard break-glass)不能拿共享 test/prod 库做实验。 + · user / password / dbname 一律仍只来自 env/*.json:本函数不接受任何环境变量覆盖, + 也不内置默认主机、默认端口、默认账号(禁止硬编码); + · 两个变量都不设置时,返回值与引入该开关之前逐字一致(零行为变化); + · 覆盖生效时 env_name 追加 "+harness" 后缀,日志与 --verify-db 输出可一眼看出连的是沙箱库。 + """ + for env_name in ("test", "prod"): + path = os.path.join(WORKSPACE, "projects", "pbls", "env", "%s.json" % env_name) + if os.path.exists(path): + with open(path, encoding="utf-8") as f: + conf = json.load(f) + db = conf.get("db") or {} + if db.get("host"): + host = (os.environ.get("PBL_DDL_DB_HOST") or "").strip() + port = (os.environ.get("PBL_DDL_DB_PORT") or "").strip() + if host: + db = dict(db, host=host) + env_name = "%s+harness" % env_name + if port: + if not port.isdigit(): + raise RuntimeError("PBL_DDL_DB_PORT 必须是数字端口号: %r" % port) + db = dict(db, port=int(port)) + if "+harness" not in env_name: + env_name = "%s+harness" % env_name + return env_name, db + return None, None + + +def _connect(): + import pymysql + env_name, db = _db_conf() + if not db: + raise RuntimeError("未找到 projects/pbls/env/*.json 的 db 段") + return pymysql.connect(host=db["host"], port=int(db.get("port") or 3306), + user=db.get("user"), password=db.get("password"), + database=db.get("dbname"), charset="utf8mb4", + autocommit=True), env_name, db + + +def apply_ddl(): + """连库执行 A 段建表 + B 段 append-only + C 段维护(逐语句,幂等)。""" + conn, env_name, db = _connect() + cur = conn.cursor() + statements = [create_table_sql()] + statements += _split_procedural(append_only_sql() + .replace("%(dbname)s", db.get("dbname") or "pbls") + .replace("%(app_user)s", db.get("user") or "pbls")) + statements += _split_procedural(maintenance_sql()) + done, failed = [], [] + for stmt in statements: + s = stmt.strip().rstrip(";").strip() + if not s or s.startswith("--"): + continue + try: + cur.execute(s) + done.append(s.split("\n")[0][:70]) + except Exception as exc: # noqa: BLE001 + failed.append((s.split("\n")[0][:70], str(exc)[:200])) + cur.close(); conn.close() + print("[apply] env=%s db=%s 成功 %d 条,失败 %d 条" + % (env_name, db.get("dbname"), len(done), len(failed))) + for f in failed: + print(" FAIL %s -> %s" % f) + return 0 if not failed else 1 + + +def _split_procedural(body): + """按 DDL 边界切语句:CREATE PROCEDURE/TRIGGER/EVENT 取到结尾分号(含内部 ;)。""" + out, buf, inside = [], "", False + for line in body.splitlines(): + low = line.strip().lower() + if not inside and (low.startswith("create procedure") or low.startswith("create trigger") + or low.startswith("create event")): + inside = True + buf += line + "\n" + if inside and line.strip() in ("END;", "END;$$", ";"): + out.append(buf); buf, inside = "", False + elif not inside and low.endswith(";"): + out.append(buf); buf = "" + if buf.strip(): + out.append(buf) + return [x.replace("$$", "").rstrip() for x in out] + + +def _norm_part(name): + """分区名统一口径(QC #1 附带缺陷:两处来源比对方式不一致)。 + + information_schema.PARTITIONS 的 PARTITION_NAME 与 EXPLAIN FORMAT=JSON 计划里的 + partitions 元素,跨引擎/版本可能带反引号、双引号、空白或大小写差异。两边都过这个 + 归一化再比对,避免「分区确实存在但判定说不属于清单」的假失败。 + """ + if not name: + return "" + text = name.decode("utf-8", "replace") if isinstance(name, (bytes, bytearray)) else str(name) + return text.strip().strip("`").strip('"').strip("'").lower() + + +def _render(sql, args=None, placeholders=None): + """SQL 的 % 转义统一出口:可选渲染标识符 + fail-fast 自检(QC #1 的根因处置)。 + + 约定:模板中由 Python 侧填入的标识符(表名/分区名)写 %s;要留给 DBAPI 绑参的 + 百分号占位符一律写 %%s,标识符渲染后即变回 %s。 + · args 不为 None:先执行 sql % args 完成标识符渲染; + · args 为 None:视为调用方已完成渲染(模板就地 % 过),本函数只做转义自检。 + 自检两条,任一不满足立即抛 RuntimeError(而不是丢给驱动报 + "unsupported format character",那会在 verify_db 里被 except 吞成一条模糊失败): + · 结果仍残留 '%%' → 转义写错; + · '%s' 个数与 placeholders 不符 → 漏写/多写绑参占位符。 + 渲染单独成行、括号显式定界,不再依赖「相邻字面量先拼接、再整体 %」的隐式优先级。 + """ + if args is not None: + sql = sql % tuple(args) + if "%%" in sql: + raise RuntimeError("SQL 渲染后仍残留 '%%',转义写法有误: " + sql[:200]) + if placeholders is not None and sql.count("%s") != placeholders: + raise RuntimeError("SQL 渲染后 DBAPI 占位符应为 %d 个,实际 %d 个: %s" + % (placeholders, sql.count("%s"), sql[:200])) + return sql + + +def _explain_partitions(cur, sql, params=None): + """EXPLAIN FORMAT=JSON 取执行计划实际扫描的分区清单(QC #6)。 + + 不再用旧的 PARTITIONS 扩展语法(EXPLAIN 后跟 PARTITIONS 关键字那种):那种写法把分区列固定在 + 结果集第 4 列(下标 3),列序随 MariaDB/MySQL 版本变化,且该扩展语法在新版 MySQL 已废弃。 + JSON 计划里的 partitions 字段两版一致。 + 取不到(引擎不支持/解析失败)返回 [],由调用方判失败,不猜。 + """ + # QC #1(转义):传进来的 sql 必须已完成标识符渲染,只剩 DBAPI 占位符 %s;残留 '%%' 说明 + # 调用方转义写错,直接抛出让它响,别丢给驱动报 "unsupported format character"。 + if "%%" in sql: + raise RuntimeError("EXPLAIN SQL 仍残留 '%%',转义写法有误: " + sql[:200]) + args = tuple(params) if params else None + if args is not None and sql.count("%s") != len(args): + raise RuntimeError("EXPLAIN SQL 占位符 %d 个与参数 %d 个不符: %s" + % (sql.count("%s"), len(args), sql[:200])) + try: + cur.execute("EXPLAIN FORMAT=JSON " + sql, args) + row = cur.fetchone() + except Exception: # noqa: BLE001 + return [] + raw = row[0] if row else None + if isinstance(raw, (bytes, bytearray)): + raw = raw.decode("utf-8", "replace") + if not raw: + return [] + try: + plan = json.loads(raw) + except (ValueError, TypeError): + return [] + found = [] + + def walk(node): + if isinstance(node, dict): + for key, val in node.items(): + if key == "partitions" and isinstance(val, list): + for p in val: + name = _norm_part(p) + if name and name not in found: + found.append(name) + else: + walk(val) + elif isinstance(node, list): + for val in node: + walk(val) + + walk(plan) + return found + + +def _row_in_partition(cur, part, uid): + """SELECT ... FROM t PARTITION(p) 反查:探针行是否物理落在该分区。""" + sql = _render("SELECT id FROM `%s` PARTITION (`%s`)" + " WHERE tenant_id='t_probe' AND event_uid=%%s" % (TABLE, _norm_part(part)), + placeholders=1) + try: + cur.execute(sql, (uid,)) + except Exception: # noqa: BLE001 + return False + return bool(cur.fetchone()) + + +def _locate_row_partition(cur, uid, ts, part_names): + """定位某探针行实际所在分区(QC #6)。 + + 1) 首选按 information_schema 分区清单逐个 PARTITION(p) 反查物理位置——与 EXPLAIN + 输出列序无关,最可靠; + 2) 反查不中(引擎不支持 PARTITION 子句等)时退回 EXPLAIN FORMAT=JSON 解析 + partitions(带 tenant_id+event_uid+created_at 等值条件,裁剪后应只剩 1 个分区)。 + """ + # 1) 逐个 PARTITION(p) 物理反查(复用 _row_in_partition,SQL 只在其内拼装一次, + # 避免同一份转义逻辑在两处各写一遍、改一处漏一处) + for part in part_names: + if _row_in_partition(cur, part, uid): + return _norm_part(part) + # 2) 反查不中才退回 EXPLAIN FORMAT=JSON;标识符渲染与转义自检统一走 _render + probe_sql = _render("SELECT id FROM `%s` WHERE tenant_id='t_probe'" + " AND event_uid=%%s AND created_at=%%s" % TABLE, + placeholders=2) + planned = _explain_partitions(cur, probe_sql, (uid, ts)) + if len(planned) == 1: + return planned[0] + return ",".join(planned) or "?" + + +def verify_db(): + """连库验证:分区裁剪 / 数据落分区 / UPDATE·DELETE 被拒。""" + conn, env_name, db = _connect() + cur = conn.cursor() + results = [] + + cur.execute("SELECT COUNT(*) FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=DATABASE()" + " AND TABLE_NAME=%s AND PARTITION_NAME IS NOT NULL", (TABLE,)) + n_parts = cur.fetchone()[0] + results.append(("分区数", n_parts >= MONTHS_PRECREATE + 1, "实际 %d(含 pmax)" % n_parts)) + + # 分区清单:以 information_schema.PARTITIONS 为权威来源(按 ordinal 排序), + # 后面「落哪个分区」「分区裁剪」两项判定都基于这份清单(QC #6) + cur.execute("SELECT PARTITION_NAME, PARTITION_DESCRIPTION FROM information_schema.PARTITIONS " + "WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=%s " + "AND PARTITION_NAME IS NOT NULL ORDER BY PARTITION_ORDINAL_POSITION", (TABLE,)) + part_rows = [(r[0], r[1]) for r in cur.fetchall()] + part_names = [n for n, _ in part_rows if n] + results.append(("MAXVALUE 兜底", PARTITION_MAXVALUE in part_names, ",".join(part_names))) + # 分区名比对统一走归一化口径(information_schema 与 EXPLAIN JSON 计划两来源一致) + part_norm = set(_norm_part(n) for n in part_names) + + # 插入两条不同月份的探针行 → 应落在两个不同的物理分区 + probe = "m11bprobe%s" % date.today().strftime("%H%M%S") + probes = (("%s_a" % probe, "2026-01-05 00:00:00"), + ("%s_b" % probe, "2027-03-05 00:00:00")) + ins_sql = _render("INSERT INTO `%s` (tenant_id,event_uid,event_type,scene_id,seq,created_at)" + " VALUES ('t_probe',%%s,'probe',0,%%s,%%s)" % TABLE, + placeholders=3) + try: + for i, (uid, ts) in enumerate(probes): + cur.execute(ins_sql, (uid, i + 1, ts)) + except Exception as exc: # noqa: BLE001 + results.append(("跨月插入", False, str(exc)[:160])) + else: + results.append(("跨月插入", True, "%d 条探针行(不同月份)" % len(probes))) + located = [_locate_row_partition(cur, uid, ts, part_names) for uid, ts in probes] + distinct = len(set(located)) == 2 + in_list = all(_norm_part(x) in part_norm + for p in located for x in str(p).split(",")) + results.append(("跨月落不同分区", distinct and in_list, + " | ".join("%s -> %s" % (uid, p) + for (uid, _), p in zip(probes, located)))) + + # 分区裁剪:created_at 区间只应命中该区间所属的少数分区,而非全部分区。 + # 旧写法(PARTITIONS 扩展语法 + 取结果集下标 3 那一列):列序跨版本不稳定,新版 MySQL 已废弃。 + prune_sql = _render("SELECT id FROM `%s` WHERE created_at>='2026-01-01'" + " AND created_at<'2026-02-01'" % TABLE, + placeholders=0) + pruned = _explain_partitions(cur, prune_sql) + results.append(("分区裁剪", + bool(pruned) and all(p in part_norm for p in pruned) + and len(pruned) < max(1, len(part_names)), + "命中 %d/%d 分区: %s" % (len(pruned), len(part_names), + ",".join(pruned) or "N/A"))) + + # append-only:UPDATE / DELETE 必须被拒 + for verb, sql in (("UPDATE", "UPDATE `%s` SET event_type='x' WHERE tenant_id='t_probe'" % TABLE), + ("DELETE", "DELETE FROM `%s` WHERE tenant_id='t_probe'" % TABLE)): + try: + cur.execute(sql) + results.append(("%s 被拒" % verb, False, "居然执行成功了(护栏未生效)")) + except Exception as exc: # noqa: BLE001 + msg = str(exc) + results.append(("%s 被拒" % verb, "APPEND_ONLY" in msg or "45000" in msg or "4500" in msg, + msg[:160])) + + # 清理探针(break-glass,仅验证脚本使用) + try: + cur.execute("SET @pbl_guard_ctx='%s'" % GUARD_ADMIN_CTX) + cur.execute("DELETE FROM `%s` WHERE tenant_id='t_probe'" % TABLE) + cur.execute("SET @pbl_guard_ctx=NULL") + except Exception as exc: # noqa: BLE001 + results.append(("探针清理", False, str(exc)[:120])) + + ok = True + print("[verify-db] env=%s db=%s" % (env_name, db.get("dbname"))) + for name, passed, detail in results: + ok = ok and passed + print(" %s %-16s %s" % ("PASS" if passed else "FAIL", name, detail)) + cur.close(); conn.close() + return 0 if ok else 1 + + +def main(argv=None): + ap = argparse.ArgumentParser(description="pbl_runtime_event DDL 生成器(M11b-1)") + ap.add_argument("--print", action="store_true", help="打印建表 DDL") + ap.add_argument("--print-guard", action="store_true", help="打印 append-only 段") + ap.add_argument("--print-maintain", action="store_true", help="打印分区维护段") + ap.add_argument("--emit", nargs="?", const="", default=None, help="生成迁移 SQL 到目录") + ap.add_argument("--dbname", default="pbls") + ap.add_argument("--verify", action="store_true", help="离线静态自检") + ap.add_argument("--apply", action="store_true", help="连库执行(读 env/*.json)") + ap.add_argument("--verify-db", action="store_true", help="连库验证分区/append-only") + args = ap.parse_args(argv) + + if args.print: + print(create_table_sql()) + if args.print_guard: + print(append_only_sql()) + if args.print_maintain: + print(maintenance_sql()) + if args.emit is not None: + for p in emit(args.emit or None, args.dbname): + print("WROTE %s (%d bytes)" % (p, os.path.getsize(p))) + if args.verify: + ok, msgs = verify() + for m in msgs: + print(m) + print("VERIFY %s" % ("PASS" if ok else "FAIL")) + return 0 if ok else 1 + if args.apply: + try: + return apply_ddl() + except Exception as exc: # noqa: BLE001 + print("APPLY SKIP(环境受限): %s" % str(exc)[:200]) + return 2 + if getattr(args, "verify_db"): + try: + return verify_db() + except Exception as exc: # noqa: BLE001 + print("VERIFY-DB SKIP(环境受限): %s" % str(exc)[:200]) + return 2 + if not any([args.print, args.print_guard, args.print_maintain, args.emit is not None]): + print(__doc__) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.rtx5tmp/full.sql b/.rtx5tmp/full.sql new file mode 100644 index 0000000..1c7cd0b --- /dev/null +++ b/.rtx5tmp/full.sql @@ -0,0 +1,237 @@ +-- =========================================================================== +-- pbl_runtime_event 表 DDL + 按月 RANGE 分区 + append-only 约束(M11b-1) +-- 由 scripts/pbl_runtime_event_ddl.py 生成,改表结构只改生成器再 --emit。 +-- 目标引擎 mariadb(projects/pbls/env/test.json: db.engine=mariadb)。 +-- 执行:mysql --protocol=tcp -u -p < 本文件 +-- 说明:触发器含多语句体,须用 mysql CLI(DELIMITER)执行; +-- 应用侧 ensure_tables() 只执行 A 段单语句 CREATE TABLE。 +-- 开发说明:projects/pbls/docs/02-develop/dev-notes-m11b1-pbl_runtime_event.md +-- =========================================================================== + +-- ---------------------------------------------------------------- A. 建表(分区) +CREATE TABLE IF NOT EXISTS `pbl_runtime_event` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增ID(逻辑主键;物理主键=(id,created_at))', + `tenant_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '租户ID(多租户强制打头)', + `event_uid` VARCHAR(64) NOT NULL COMMENT '事件UID(uuid,应用层生成)', + `event_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事件编码', + `idem_key` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '幂等键(同键重复投递只落一条)', + `world_id` BIGINT NOT NULL DEFAULT 0 COMMENT '世界ID(引用 world 基表,只读)', + `scene_id` BIGINT NOT NULL DEFAULT 0 COMMENT '场景/会话ID(引用 scense 基表,只读)', + `session_id` BIGINT NOT NULL DEFAULT 0 COMMENT '游戏会话ID(M11a 语义,与 scene_id 同域)', + `entity_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '实体ID(引用 entity 基表,只读)', + `actor_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '触发者(服务端会话解析,客户端禁填)', + `event_type` VARCHAR(64) NOT NULL COMMENT '事件类型', + `payload` TEXT NULL COMMENT '事件负载JSON(任务书字段)', + `payload_json` LONGTEXT NULL COMMENT '事件负载JSON(M11a 写路径列名,与 payload 同义留宽)', + `causation_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '因果链:引发本事件的事件UID', + `seq` BIGINT NOT NULL DEFAULT 0 COMMENT '会话内单调序号(轮询游标,应用层生成)', + `seq_no` BIGINT NOT NULL DEFAULT 0 COMMENT '会话内单调序号(M11a 写路径列名)', + `source` VARCHAR(32) NOT NULL DEFAULT 'runtime' COMMENT '来源:runtime/agent/script/client_intent', + `state` VARCHAR(16) NOT NULL DEFAULT 'applied' COMMENT 'applied/rejected/rolled_back', + `state_version` BIGINT NOT NULL DEFAULT 0 COMMENT '本事件推进到的服务端权威版本', + `tx_group` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事务组(同组同事务)', + `broadcast` TINYINT NOT NULL DEFAULT 1 COMMENT '是否参与广播 0/1', + `created_by` BIGINT NOT NULL DEFAULT 0 COMMENT '创建人', + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(分区键,禁TIMESTAMP)', + `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间戳(append-only:永不 UPDATE)', + `occurred_at` DATETIME NULL COMMENT '兼容列(M11a 旧分区键,新写入可空)', + PRIMARY KEY (`id`, `created_at`), + UNIQUE KEY `uk_event_uid` (`tenant_id`, `event_uid`, `created_at`), + UNIQUE KEY `uk_tenant_idem` (`tenant_id`, `idem_key`, `created_at`), + KEY `ix_scene_created` (`scene_id`, `created_at`), + KEY `ix_tenant_session_seq` (`tenant_id`, `session_id`, `seq`), + KEY `ix_tenant_session_seqno` (`tenant_id`, `session_id`, `seq_no`), + KEY `ix_tenant_world_type` (`tenant_id`, `world_id`, `event_type`), + KEY `ix_tx_group` (`tx_group`), + KEY `ix_created_at` (`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci + COMMENT='运行时事件流(append-only,按月RANGE分区,保留14个月)' +PARTITION BY RANGE COLUMNS(`created_at`) ( + PARTITION `p202609` VALUES LESS THAN (DATE '2026-10-01'), + PARTITION `p202610` VALUES LESS THAN (DATE '2026-11-01'), + PARTITION `p202611` VALUES LESS THAN (DATE '2026-12-01'), + PARTITION `p202612` VALUES LESS THAN (DATE '2027-01-01'), + PARTITION `p202701` VALUES LESS THAN (DATE '2027-02-01'), + PARTITION `p202702` VALUES LESS THAN (DATE '2027-03-01'), + PARTITION `pmax` VALUES LESS THAN (MAXVALUE) +); + +DELIMITER $$ + +-- ---------------------------------------------------------------- B. append-only +-- append-only 断言过程:非白名单操作一律 SIGNAL 拒绝 +DROP PROCEDURE IF EXISTS `pbl_assert_append_only`$$ + +CREATE PROCEDURE `pbl_assert_append_only`( + IN p_table VARCHAR(64), IN p_priv VARCHAR(16), IN p_detail VARCHAR(255)) + READS SQL DATA +BEGIN + IF p_table <> 'pbl_runtime_event' THEN + RETURN; -- 只守护事件表,其他表不受影响 + END IF; + IF IFNULL(@pbl_guard_ctx, '') = 'append_only_admin' THEN + RETURN; -- break-glass:一次性历史数据回填 + END IF; + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED', + MYSQL_ERRNO = 45001; +END$$ + +-- BEFORE UPDATE 护栏:把违规语句原文带进错误消息,便于定位调用方 +DROP TRIGGER IF EXISTS `trg_pbl_runtime_event_append_only_upd`$$ + +CREATE TRIGGER `trg_pbl_runtime_event_append_only_upd` + BEFORE UPDATE ON `pbl_runtime_event` FOR EACH ROW +BEGIN + DECLARE v_sql TEXT; + DECLARE v_msg VARCHAR(255); + SET v_sql = ''; + BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_sql = ''; + SELECT INFO INTO v_sql FROM information_schema.processlist + WHERE ID = CONNECTION_ID(); + END; + IF IFNULL(@pbl_guard_ctx, '') = 'append_only_admin' THEN + SET v_msg = CONCAT('break-glass update on ', 'pbl_runtime_event'); + ELSE + SET v_msg = CONCAT('UPDATE denied: ', LEFT(IFNULL(v_sql, 'n/a'), 120)); + END IF; + CALL pbl_assert_append_only('pbl_runtime_event', 'update', v_msg); + IF IFNULL(@pbl_guard_ctx, '') <> 'append_only_admin' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED_UPDATE', + MYSQL_ERRNO = 45002; + END IF; +END$$ + +-- BEFORE DELETE 护栏 +DROP TRIGGER IF EXISTS `trg_pbl_runtime_event_append_only_del`$$ + +CREATE TRIGGER `trg_pbl_runtime_event_append_only_del` + BEFORE DELETE ON `pbl_runtime_event` FOR EACH ROW +BEGIN + DECLARE v_sql TEXT; + DECLARE v_msg VARCHAR(255); + SET v_sql = ''; + BEGIN + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_sql = ''; + SELECT INFO INTO v_sql FROM information_schema.processlist + WHERE ID = CONNECTION_ID(); + END; + IF IFNULL(@pbl_guard_ctx, '') = 'append_only_admin' THEN + SET v_msg = CONCAT('break-glass delete on ', 'pbl_runtime_event'); + ELSE + SET v_msg = CONCAT('DELETE denied: ', LEFT(IFNULL(v_sql, 'n/a'), 120)); + END IF; + CALL pbl_assert_append_only('pbl_runtime_event', 'delete', v_msg); + IF IFNULL(@pbl_guard_ctx, '') <> 'append_only_admin' THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED_DELETE', + MYSQL_ERRNO = 45003; + END IF; +END$$ + +-- 权限层加固(可选,需 DBA 账号执行;app 账号只保留增/查) +-- GRANT INSERT, SELECT, UPDATE, DELETE ON `pbls`.`pbl_runtime_event` TO NULL; -- 占位,勿执行 +-- REVOKE UPDATE, DELETE ON `pbls`.`pbl_runtime_event` FROM 'pbls'@'%'; + +-- ---------------------------------------------------------------- C. 分区维护 +-- 1) 幂等补建未来月分区:pmax 存在时用 REORGANIZE PARTITION 拆出新月份(不丢数据) +DROP PROCEDURE IF EXISTS `pbl_runtime_event_ensure_partitions`$$ + +CREATE PROCEDURE `pbl_runtime_event_ensure_partitions`(IN p_months_ahead INT) + MODIFIES SQL DATA +BEGIN + DECLARE v_done INT DEFAULT 0; + DECLARE v_name VARCHAR(16); + DECLARE v_upper DATE; + DECLARE v_exists INT DEFAULT 0; + DECLARE v_sql TEXT; + DECLARE cur CURSOR FOR + WITH RECURSIVE ms(month_start) AS ( + SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01') + UNION ALL + SELECT DATE_ADD(month_start, INTERVAL 1 MONTH) FROM ms + WHERE month_start < DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), + INTERVAL p_months_ahead MONTH) + ) + SELECT CONCAT('p', DATE_FORMAT(month_start, '%Y%m')), + DATE_ADD(month_start, INTERVAL 1 MONTH) + FROM ms; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1; + OPEN cur; + read_loop: LOOP + FETCH cur INTO v_name, v_upper; + IF v_done = 1 THEN + LEAVE read_loop; + END IF; + SELECT COUNT(*) INTO v_exists FROM information_schema.PARTITIONS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pbl_runtime_event' + AND PARTITION_NAME = v_name; + IF v_exists = 0 THEN + SET @pbl_part_sql = CONCAT( + 'ALTER TABLE `pbl_runtime_event` REORGANIZE PARTITION `pmax` INTO (', + 'PARTITION `', v_name, '` VALUES LESS THAN (DATE ''', v_upper, '''), ', + 'PARTITION `pmax` VALUES LESS THAN (MAXVALUE))'); + PREPARE pbl_part_st FROM @pbl_part_sql; + EXECUTE pbl_part_st; + DEALLOCATE PREPARE pbl_part_st; + END IF; + END LOOP; + CLOSE cur; +END$$ + +-- 2) 到期归档:整月 DROP PARTITION(append-only 表唯一合规的清理手段) +DROP PROCEDURE IF EXISTS `pbl_runtime_event_prune_partitions`$$ + +CREATE PROCEDURE `pbl_runtime_event_prune_partitions`(IN p_keep_months INT) + MODIFIES SQL DATA +BEGIN + DECLARE v_done INT DEFAULT 0; + DECLARE v_name VARCHAR(64); + DECLARE v_cutoff DATE; + DECLARE cur CURSOR FOR + SELECT PARTITION_NAME FROM information_schema.PARTITIONS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'pbl_runtime_event' + AND PARTITION_NAME IS NOT NULL + AND PARTITION_NAME <> 'pmax' + AND PARTITION_NAME < CONCAT('p', DATE_FORMAT(v_cutoff, '%Y%m')); + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1; + SET v_cutoff = DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL -p_keep_months MONTH); + OPEN cur; + prune_loop: LOOP + FETCH cur INTO v_name; + IF v_done = 1 THEN + LEAVE prune_loop; + END IF; + SET @pbl_drop_sql = CONCAT('ALTER TABLE `pbl_runtime_event` DROP PARTITION `', v_name, '`'); + PREPARE pbl_drop_st FROM @pbl_drop_sql; + EXECUTE pbl_drop_st; + DEALLOCATE PREPARE pbl_drop_st; + END LOOP; + CLOSE cur; +END$$ + +-- 3) 每月自动补分区(需 event_scheduler=ON;否则用 cron,见开发说明) +-- SET GLOBAL event_scheduler = ON; +DROP EVENT IF EXISTS `ev_pbl_runtime_event_partition_maintain`$$ + +CREATE EVENT IF NOT EXISTS `ev_pbl_runtime_event_partition_maintain` + ON SCHEDULE EVERY 1 MONTH + STARTS TIMESTAMP(DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01 03:00:00')) + ON COMPLETION PRESERVE + ENABLE + COMMENT '每月预建未来 6 个月分区' +DO CALL pbl_runtime_event_ensure_partitions(6)$$ + +DELIMITER ; + +-- ---------------------------------------------------------------- D. 一次性改造 +-- 一次性改造(仅当 pbl_runtime_event 已存在且未分区时手工执行;先备份): +-- 1) CREATE TABLE pbl_runtime_event_new ... (本文件 A 段 DDL,改名 _new) +-- 2) SET @pbl_guard_ctx = 'append_only_admin'; -- break-glass,仅回填期间 +-- INSERT INTO pbl_runtime_event_new (...) SELECT ... FROM pbl_runtime_event; +-- SET @pbl_guard_ctx = NULL; +-- 3) RENAME TABLE pbl_runtime_event TO pbl_runtime_event_m11a_bak, +-- pbl_runtime_event_new TO pbl_runtime_event; +-- 4) 重放 append-only 触发器段(B 段),核对 EXPLAIN 分区裁剪后删备份表。 +-- 本脚本不自动执行改造:DROP/RENAME 生产表必须人工确认(见开发说明「回滚」段)。 +SELECT 'm11b-1 migrate: 人工执行,见注释' AS note; diff --git a/.rtx5tmp/load.err b/.rtx5tmp/load.err new file mode 100644 index 0000000..874ca47 --- /dev/null +++ b/.rtx5tmp/load.err @@ -0,0 +1,20 @@ +-------------- +CREATE PROCEDURE `pbl_assert_append_only`( + IN p_table VARCHAR(64), IN p_priv VARCHAR(16), IN p_detail VARCHAR(255)) + READS SQL DATA +BEGIN + IF p_table <> 'pbl_runtime_event' THEN + RETURN; + END IF; + IF IFNULL(@pbl_guard_ctx, '') = 'append_only_admin' THEN + RETURN; + END IF; + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED', + MYSQL_ERRNO = 45001; +END +-------------- + +ERROR 1064 (42000) at line 65: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '; + END IF; + IF IFNULL(@pbl_guard_ctx, '') = 'app...' at line 6 diff --git a/.rtx5tmp/my.pid b/.rtx5tmp/my.pid index 8c61d23..7ed6ff8 100644 --- a/.rtx5tmp/my.pid +++ b/.rtx5tmp/my.pid @@ -1 +1 @@ -58 +5 diff --git a/.rtx5tmp/patch_rtx0005.py b/.rtx5tmp/patch_rtx0005.py new file mode 100644 index 0000000..5e7b061 --- /dev/null +++ b/.rtx5tmp/patch_rtx0005.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""PBL-RTX-0005 生成器补丁:修 pbl_assert_append_only 过程体 + _with_delimiter 行尾注释加固。 + +每处替换都断言命中,未命中即 rc=1(禁止静默漏改)。 +""" +import io +import os +import re +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +MODULE_DIR = os.path.dirname(HERE) +TARGET = os.path.join(MODULE_DIR, "scripts", "pbl_runtime_event_ddl.py") + +src = io.open(TARGET, encoding="utf-8").read() +orig = src +applied = [] + + +def rep(old, new, tag): + global src + n = src.count(old) + if n != 1: + print("FAIL 定位不唯一(%d):%s" % (n, tag)) + sys.exit(1) + src = src.replace(old, new) + applied.append(tag) + + +# ---------------------------------------------------------------- 1) 过程体 RETURN; → 正向条件 SIGNAL +rep( + """CREATE PROCEDURE `pbl_assert_append_only`( + IN p_table VARCHAR(64), IN p_priv VARCHAR(16), IN p_detail VARCHAR(255)) + READS SQL DATA +BEGIN + IF p_table <> '%(table)s' THEN + RETURN; -- 只守护事件表,其他表不受影响 + END IF; + IF IFNULL(@pbl_guard_ctx, '') = '%(ctx)s' THEN + RETURN; -- break-glass:一次性历史数据回填 + END IF; + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED', + MYSQL_ERRNO = 45001; +END;""", + """CREATE PROCEDURE `pbl_assert_append_only`( + IN p_table VARCHAR(64), IN p_priv VARCHAR(16), IN p_detail VARCHAR(255)) + READS SQL DATA +BEGIN + -- PBL-RTX-0005:MariaDB 存储过程体禁用 RETURN(RETURN 只在 FUNCTION 中合法), + -- 旧写法 `IF ... THEN RETURN; END IF;` 在建过程阶段即 ERROR 1064,导致本过程 + -- 连同其后的触发器/维护过程全部未创建。改为等价正向条件单语句 SIGNAL: + -- 仅「是本表」且「非 break-glass 上下文」时才拒绝,其余情形不执行任何语句, + -- 与旧的两段提前返回语义完全一致。 + IF p_table = '%(table)s' + AND IFNULL(@pbl_guard_ctx, '') <> '%(ctx)s' THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'PBL_APPEND_ONLY_DENIED', + MYSQL_ERRNO = 45001; + END IF; +END;""", + "append_only_sql: RETURN; -> 正向条件 SIGNAL", +) + +# ---------------------------------------------------------------- 2) _with_delimiter 行尾注释加固 +rep( + '''_BARE_TOKEN = re.compile(r"^(CREATE|DROP|ALTER|GRANT|REVOKE)\\s*\\$\\$\\s*$", re.I)''', + '''_BARE_TOKEN = re.compile(r"^(CREATE|DROP|ALTER|GRANT|REVOKE)\\s*\\$\\$\\s*$", re.I) +# 语句末行的「代码 + 行尾注释」形态:`$$` 若与 `-- 注释` 同行,会被行注释吞掉, +# 客户端永远等不到语句结束符(PBL-RTX-0005 加固项:注释上移,`$$` 独占行尾)。 +_TRAILING_COMMENT = re.compile(r"^(?P\\S.*?\\s)(?P(?:--|#)\\s.*|/\\*.*\\*/)$") +# 过程/函数/触发器体内非法的裸 RETURN(MariaDB 仅 FUNCTION 允许 RETURN;PROCEDURE 报 1064) +_ILLEGAL_RETURN = re.compile(r"^RETURN\\s*;?\\s*$", re.I)''', + "_with_delimiter: 新增 _TRAILING_COMMENT / _ILLEGAL_RETURN 常量", +) + +rep( + """ def flush(): + if not buf: + if cmts: + out.append("\\n".join(cmts)) + del cmts[:] + return + stmt = re.sub(r";\\s*$", "", "\\n".join(buf).strip()) + head = ("\\n".join(cmts) + "\\n") if cmts else "" + out.append(head + stmt + delim) + del buf[:] + del cmts[:]""", + """ def flush(): + if not buf: + if cmts: + out.append("\\n".join(cmts)) + del cmts[:] + return + lines = list(buf) + # 末行行尾注释上移到语句之前:否则产出 `... -- note$$`,`$$` 落在注释内 + # → 客户端认为语句未结束,与下一条语句黏连(同类 1064 根因)。 + tail_cmts = [] + m = _TRAILING_COMMENT.match(lines[-1].rstrip()) + if m and not m.group("code").lstrip().startswith(("--", "#")): + tail_cmts.append(m.group("cmt")) + lines[-1] = m.group("code") + stmt = re.sub(r";\\s*$", "", "\\n".join(lines).strip()) + head_lines = cmts + tail_cmts + head = ("\\n".join(head_lines) + "\\n") if head_lines else "" + out.append(head + stmt + delim) + del buf[:] + del cmts[:]""", + "_with_delimiter.flush(): 末行行尾注释上移", +) + +# ---------------------------------------------------------------- 3) 静态断言:禁止过程体裸 RETURN +rep( + '''def _delimiter_integrity_errors(text, label=""):''', + '''def _procedure_body_return_errors(text, label=""): + """PBL-RTX-0005 回归门禁:`CREATE PROCEDURE` 体内不得出现裸 `RETURN`。 + + MariaDB/MySQL 的 RETURN 语句只允许出现在 FUNCTION(及触发器外的函数语义)中; + 存储过程里写 `RETURN;` 会在 CREATE PROCEDURE 阶段直接 ERROR 1064,且因为整段 + 在 `DELIMITER $$` 块内,失败会连带后续触发器/维护过程一起未创建(现场表现为 + `SHOW PROCEDURE STATUS` 0 个 + CALL 报 1305 does not exist)。 + 返回缺陷描述列表;空列表 = 通过。 + """ + errs = [] + pfx = ("[%s] " % label) if label else "" + in_proc = False + for i, ln in enumerate(text.split("\\n"), 1): + s = ln.strip() + if re.match(r"^CREATE\\s+(OR\\s+REPLACE\\s+)?PROCEDURE\\b", s, re.I): + in_proc = True + continue + if in_proc and re.match(r"^CREATE\\s+\\w", s, re.I): + in_proc = False + if in_proc and _ILLEGAL_RETURN.match(s): + errs.append(pfx + "L%d 存储过程体内出现裸 RETURN(MariaDB 过程体非法 → ERROR 1064): %r" + % (i, s)) + return errs + + +def _delimiter_integrity_errors(text, label=""):''', + "新增 _procedure_body_return_errors() 回归门禁函数", +) + +rep( + """ struct_errs = [] + for label, text in artifacts: + struct_errs.extend(_delimiter_integrity_errors(text, label))""", + """ struct_errs = [] + for label, text in artifacts: + struct_errs.extend(_delimiter_integrity_errors(text, label)) + # PBL-RTX-0005:过程体裸 RETURN 静态门禁(实库 1064 的根因形态) + struct_errs.extend(_procedure_body_return_errors(text, label))""", + "verify(): 接入过程体 RETURN 静态门禁", +) + +if "PBL_APPEND_ONLY_DENIED" not in src or src.count("RETURN;") > 0: + print("FAIL 校验:src 中仍残留 `RETURN;`") + sys.exit(1) + +io.open(TARGET, "w", encoding="utf-8").write(src) +print("OK 已应用 %d 处替换:" % len(applied)) +for a in applied: + print(" -", a) +print("bytes %d -> %d" % (len(orig), len(src))) diff --git a/.rtx5tmp/server.err b/.rtx5tmp/server.err index 96116d8..a32d9fe 100644 --- a/.rtx5tmp/server.err +++ b/.rtx5tmp/server.err @@ -1,22 +1,100 @@ -2026-09-22 13:23:59 0 [Note] Starting MariaDB 10.6.23-MariaDB-0ubuntu0.22.04.1 source revision fe8047caf26d20e98ea7f6ec1dce3924e696703f server_uid 6zZIOKRSqPQHqChGdC3VR9ExRq0= as process 58 -2026-09-22 13:23:59 0 [Note] InnoDB: Compressed tables use zlib 1.2.11 -2026-09-22 13:23:59 0 [Note] InnoDB: Number of pools: 1 -2026-09-22 13:23:59 0 [Note] InnoDB: Using AVX512 instructions -2026-09-22 13:23:59 0 [Note] InnoDB: Using liburing -2026-09-22 13:23:59 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728 -2026-09-22 13:23:59 0 [Note] InnoDB: Completed initialization of buffer pool -2026-09-22 13:23:59 0 [Note] InnoDB: 128 rollback segments are active. -2026-09-22 13:23:59 0 [Note] InnoDB: Creating shared tablespace for temporary tables -2026-09-22 13:23:59 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... -2026-09-22 13:23:59 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. -2026-09-22 13:23:59 0 [Note] InnoDB: 10.6.23 started; log sequence number 42486; transaction id 14 -2026-09-22 13:23:59 0 [Note] Plugin 'FEEDBACK' is disabled. -2026-09-22 13:23:59 0 [Note] InnoDB: Loading buffer pool(s) from /d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/d/ib_buffer_pool -2026-09-22 13:23:59 0 [Warning] You need to use --log-bin to make --expire-logs-days or --binlog-expire-logs-seconds work. -2026-09-22 13:23:59 0 [Note] Server socket created on IP: '127.0.0.1'. -2026-09-22 13:23:59 0 [Note] InnoDB: Buffer pool(s) load completed at 260922 13:23:59 -2026-09-22 13:23:59 0 [Warning] 'user' entry 'root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. -2026-09-22 13:23:59 0 [Warning] 'user' entry '@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. -2026-09-22 13:23:59 0 [Warning] 'proxies_priv' entry '@% root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. -2026-09-22 13:23:59 0 [Note] mariadbd: ready for connections. +2026-09-22 13:50:56 0 [Note] Starting MariaDB 10.6.23-MariaDB-0ubuntu0.22.04.1 source revision fe8047caf26d20e98ea7f6ec1dce3924e696703f server_uid 6zZIOKRSqPQHqChGdC3VR9ExRq0= as process 59 +2026-09-22 13:50:56 0 [Note] InnoDB: Compressed tables use zlib 1.2.11 +2026-09-22 13:50:56 0 [Note] InnoDB: Number of pools: 1 +2026-09-22 13:50:56 0 [Note] InnoDB: Using AVX512 instructions +2026-09-22 13:50:56 0 [Note] InnoDB: Using liburing +2026-09-22 13:50:56 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728 +2026-09-22 13:50:56 0 [Note] InnoDB: Completed initialization of buffer pool +2026-09-22 13:50:56 0 [Note] InnoDB: 128 rollback segments are active. +2026-09-22 13:50:56 0 [Note] InnoDB: Creating shared tablespace for temporary tables +2026-09-22 13:50:56 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... +2026-09-22 13:50:56 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. +2026-09-22 13:50:56 0 [Note] InnoDB: 10.6.23 started; log sequence number 42514; transaction id 14 +2026-09-22 13:50:56 0 [Note] Plugin 'FEEDBACK' is disabled. +2026-09-22 13:50:56 0 [Note] InnoDB: Loading buffer pool(s) from /d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/db/ib_buffer_pool +2026-09-22 13:50:56 0 [Warning] You need to use --log-bin to make --expire-logs-days or --binlog-expire-logs-seconds work. +2026-09-22 13:50:56 0 [Note] InnoDB: Buffer pool(s) load completed at 260922 13:50:56 +2026-09-22 13:50:56 0 [Note] Server socket created on IP: '127.0.0.1'. +2026-09-22 13:50:56 0 [Warning] 'user' entry 'root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:50:56 0 [Warning] 'user' entry '@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:50:56 0 [Warning] 'proxies_priv' entry '@% root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:50:56 0 [Note] mariadbd: ready for connections. Version: '10.6.23-MariaDB-0ubuntu0.22.04.1' socket: '/d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/my.sock' port: 13401 Ubuntu 22.04 +2026-09-22 13:52:06 0 [Note] Starting MariaDB 10.6.23-MariaDB-0ubuntu0.22.04.1 source revision fe8047caf26d20e98ea7f6ec1dce3924e696703f server_uid 6zZIOKRSqPQHqChGdC3VR9ExRq0= as process 5 +2026-09-22 13:52:06 0 [Note] InnoDB: Compressed tables use zlib 1.2.11 +2026-09-22 13:52:06 0 [Note] InnoDB: Number of pools: 1 +2026-09-22 13:52:06 0 [Note] InnoDB: Using AVX512 instructions +2026-09-22 13:52:06 0 [Note] InnoDB: Using liburing +2026-09-22 13:52:06 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728 +2026-09-22 13:52:06 0 [Note] InnoDB: Completed initialization of buffer pool +2026-09-22 13:52:06 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN=42514,42514 +2026-09-22 13:52:06 0 [Note] InnoDB: To recover: 90 pages +2026-09-22 13:52:06 0 [Note] InnoDB: 128 rollback segments are active. +2026-09-22 13:52:06 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1" +2026-09-22 13:52:06 0 [Note] InnoDB: Creating shared tablespace for temporary tables +2026-09-22 13:52:06 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... +2026-09-22 13:52:06 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. +2026-09-22 13:52:06 0 [Note] InnoDB: 10.6.23 started; log sequence number 166585; transaction id 44 +2026-09-22 13:52:06 0 [Note] InnoDB: Loading buffer pool(s) from /d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/db/ib_buffer_pool +2026-09-22 13:52:06 0 [Note] Plugin 'FEEDBACK' is disabled. +2026-09-22 13:52:06 0 [Warning] You need to use --log-bin to make --expire-logs-days or --binlog-expire-logs-seconds work. +2026-09-22 13:52:06 0 [Note] InnoDB: Buffer pool(s) load completed at 260922 13:52:06 +2026-09-22 13:52:06 0 [Note] Server socket created on IP: '127.0.0.1'. +2026-09-22 13:52:06 0 [Warning] 'user' entry 'root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:52:06 0 [Warning] 'user' entry '@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:52:06 0 [Warning] 'proxies_priv' entry '@% root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:52:06 0 [Note] mariadbd: ready for connections. +Version: '10.6.23-MariaDB-0ubuntu0.22.04.1' socket: '/d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/my.sock' port: 13401 Ubuntu 22.04 +2026-09-22 13:52:07 0 [Note] mariadbd (initiated by: unknown): Normal shutdown +2026-09-22 13:52:15 0 [Note] Starting MariaDB 10.6.23-MariaDB-0ubuntu0.22.04.1 source revision fe8047caf26d20e98ea7f6ec1dce3924e696703f server_uid 6zZIOKRSqPQHqChGdC3VR9ExRq0= as process 5 +2026-09-22 13:52:15 0 [Note] InnoDB: Compressed tables use zlib 1.2.11 +2026-09-22 13:52:15 0 [Note] InnoDB: Number of pools: 1 +2026-09-22 13:52:15 0 [Note] InnoDB: Using AVX512 instructions +2026-09-22 13:52:15 0 [Note] InnoDB: Using liburing +2026-09-22 13:52:15 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728 +2026-09-22 13:52:15 0 [Note] InnoDB: Completed initialization of buffer pool +2026-09-22 13:52:15 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN=42514,42514 +2026-09-22 13:52:15 0 [Note] InnoDB: To recover: 90 pages +2026-09-22 13:52:15 0 [Note] InnoDB: 128 rollback segments are active. +2026-09-22 13:52:15 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1" +2026-09-22 13:52:15 0 [Note] InnoDB: Creating shared tablespace for temporary tables +2026-09-22 13:52:15 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... +2026-09-22 13:52:15 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. +2026-09-22 13:52:15 0 [Note] InnoDB: 10.6.23 started; log sequence number 166665; transaction id 44 +2026-09-22 13:52:15 0 [Note] InnoDB: Loading buffer pool(s) from /d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/db/ib_buffer_pool +2026-09-22 13:52:15 0 [Note] Plugin 'FEEDBACK' is disabled. +2026-09-22 13:52:15 0 [Warning] You need to use --log-bin to make --expire-logs-days or --binlog-expire-logs-seconds work. +2026-09-22 13:52:15 0 [Note] InnoDB: Buffer pool(s) load completed at 260922 13:52:15 +2026-09-22 13:52:15 0 [Note] Server socket created on IP: '127.0.0.1'. +2026-09-22 13:52:15 0 [Warning] 'user' entry 'root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:52:15 0 [Warning] 'user' entry '@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:52:15 0 [Warning] 'proxies_priv' entry '@% root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:52:15 0 [Note] mariadbd: ready for connections. +Version: '10.6.23-MariaDB-0ubuntu0.22.04.1' socket: '/d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/my.sock' port: 13401 Ubuntu 22.04 +2026-09-22 13:52:16 0 [Note] mariadbd (initiated by: unknown): Normal shutdown +2026-09-22 13:53:09 0 [Note] Starting MariaDB 10.6.23-MariaDB-0ubuntu0.22.04.1 source revision fe8047caf26d20e98ea7f6ec1dce3924e696703f server_uid 6zZIOKRSqPQHqChGdC3VR9ExRq0= as process 5 +2026-09-22 13:53:09 0 [Note] InnoDB: Compressed tables use zlib 1.2.11 +2026-09-22 13:53:09 0 [Note] InnoDB: Number of pools: 1 +2026-09-22 13:53:09 0 [Note] InnoDB: Using AVX512 instructions +2026-09-22 13:53:09 0 [Note] InnoDB: Using liburing +2026-09-22 13:53:09 0 [Note] InnoDB: Initializing buffer pool, total size = 134217728, chunk size = 134217728 +2026-09-22 13:53:09 0 [Note] InnoDB: Completed initialization of buffer pool +2026-09-22 13:53:09 0 [Note] InnoDB: Starting crash recovery from checkpoint LSN=42514,42514 +2026-09-22 13:53:09 0 [Note] InnoDB: To recover: 90 pages +2026-09-22 13:53:09 0 [Note] InnoDB: 128 rollback segments are active. +2026-09-22 13:53:09 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1" +2026-09-22 13:53:09 0 [Note] InnoDB: Creating shared tablespace for temporary tables +2026-09-22 13:53:09 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... +2026-09-22 13:53:09 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. +2026-09-22 13:53:09 0 [Note] InnoDB: 10.6.23 started; log sequence number 166745; transaction id 44 +2026-09-22 13:53:09 0 [Note] InnoDB: Loading buffer pool(s) from /d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/db/ib_buffer_pool +2026-09-22 13:53:09 0 [Note] Plugin 'FEEDBACK' is disabled. +2026-09-22 13:53:09 0 [Warning] You need to use --log-bin to make --expire-logs-days or --binlog-expire-logs-seconds work. +2026-09-22 13:53:09 0 [Note] InnoDB: Buffer pool(s) load completed at 260922 13:53:09 +2026-09-22 13:53:09 0 [Note] Server socket created on IP: '127.0.0.1'. +2026-09-22 13:53:09 0 [Warning] 'user' entry 'root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:53:09 0 [Warning] 'user' entry '@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:53:09 0 [Warning] 'proxies_priv' entry '@% root@instance-jo93aa2m-2' ignored in --skip-name-resolve mode. +2026-09-22 13:53:09 0 [Note] mariadbd: ready for connections. +Version: '10.6.23-MariaDB-0ubuntu0.22.04.1' socket: '/d/pipeline/workspaces/0/sdlc_general/modules/pbl_runtime_ext/.rtx5tmp/my.sock' port: 13401 Ubuntu 22.04 +2026-09-22 13:53:10 0 [Note] mariadbd (initiated by: unknown): Normal shutdown diff --git a/.rtx5tmp/t1.err b/.rtx5tmp/t1.err new file mode 100644 index 0000000..b7d3341 --- /dev/null +++ b/.rtx5tmp/t1.err @@ -0,0 +1,14 @@ +-------------- +CREATE PROCEDURE t1p(IN p INT) +BEGIN + IF p <> 1 THEN + RETURN; + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END +-------------- + +ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '; + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END' at line 4 diff --git a/.rtx5tmp/t1.out b/.rtx5tmp/t1.out new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t1.sql b/.rtx5tmp/t1.sql new file mode 100644 index 0000000..7271c1c --- /dev/null +++ b/.rtx5tmp/t1.sql @@ -0,0 +1,10 @@ +DELIMITER $$ +DROP PROCEDURE IF EXISTS t1p$$ +CREATE PROCEDURE t1p(IN p INT) +BEGIN + IF p <> 1 THEN + RETURN; + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END$$ +DELIMITER ; diff --git a/.rtx5tmp/t2.err b/.rtx5tmp/t2.err new file mode 100644 index 0000000..fc58dc0 --- /dev/null +++ b/.rtx5tmp/t2.err @@ -0,0 +1,13 @@ +-------------- +CREATE PROCEDURE t2p(IN p INT) +BEGIN + IF p <> 1 THEN + RETURN; + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END +-------------- + +ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '; + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_...' at line 4 diff --git a/.rtx5tmp/t2.out b/.rtx5tmp/t2.out new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t2.sql b/.rtx5tmp/t2.sql new file mode 100644 index 0000000..e79696f --- /dev/null +++ b/.rtx5tmp/t2.sql @@ -0,0 +1,10 @@ +DELIMITER $$ +DROP PROCEDURE IF EXISTS t2p$$ +CREATE PROCEDURE t2p(IN p INT) +BEGIN + IF p <> 1 THEN + RETURN; -- 只守护事件表 + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END$$ +DELIMITER ; diff --git a/.rtx5tmp/t3.err b/.rtx5tmp/t3.err new file mode 100644 index 0000000..dc23d12 --- /dev/null +++ b/.rtx5tmp/t3.err @@ -0,0 +1,16 @@ +-------------- +CREATE PROCEDURE t3p(IN p INT) +BEGIN + IF p <> 1 THEN + RETURN; + + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END +-------------- + +ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '; + + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END' at line 4 diff --git a/.rtx5tmp/t3.out b/.rtx5tmp/t3.out new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t3.sql b/.rtx5tmp/t3.sql new file mode 100644 index 0000000..e2a2648 --- /dev/null +++ b/.rtx5tmp/t3.sql @@ -0,0 +1,11 @@ +DELIMITER $$ +DROP PROCEDURE IF EXISTS t3p$$ +CREATE PROCEDURE t3p(IN p INT) +BEGIN + IF p <> 1 THEN + RETURN; + -- 只守护事件表 + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END$$ +DELIMITER ; diff --git a/.rtx5tmp/t4.err b/.rtx5tmp/t4.err new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t4.out b/.rtx5tmp/t4.out new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t4.sql b/.rtx5tmp/t4.sql new file mode 100644 index 0000000..f81954f --- /dev/null +++ b/.rtx5tmp/t4.sql @@ -0,0 +1,10 @@ +DELIMITER $$ +DROP PROCEDURE IF EXISTS t4p$$ +CREATE PROCEDURE t4p(IN p INT) +lbl: BEGIN + IF p <> 1 THEN + LEAVE lbl; + END IF; + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'x'; +END$$ +DELIMITER ; diff --git a/.rtx5tmp/t5.err b/.rtx5tmp/t5.err new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t5.out b/.rtx5tmp/t5.out new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t5.sql b/.rtx5tmp/t5.sql new file mode 100644 index 0000000..1458358 --- /dev/null +++ b/.rtx5tmp/t5.sql @@ -0,0 +1,10 @@ +DELIMITER $$ +DROP PROCEDURE IF EXISTS t5p$$ +CREATE PROCEDURE t5p(IN p INT) +BEGIN + IF p = 1 THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'x', MYSQL_ERRNO = 45001; + END IF; +END$$ +DELIMITER ; diff --git a/.rtx5tmp/t6.err b/.rtx5tmp/t6.err new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t6.out b/.rtx5tmp/t6.out new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t6.sql b/.rtx5tmp/t6.sql new file mode 100644 index 0000000..9a8b84e --- /dev/null +++ b/.rtx5tmp/t6.sql @@ -0,0 +1,10 @@ +DELIMITER $$ +DROP FUNCTION IF EXISTS t6f$$ +CREATE FUNCTION t6f(p INT) RETURNS INT +BEGIN + IF p <> 1 THEN + RETURN 0; + END IF; + RETURN 1; +END$$ +DELIMITER ; diff --git a/.rtx5tmp/t7.err b/.rtx5tmp/t7.err new file mode 100644 index 0000000..f904742 --- /dev/null +++ b/.rtx5tmp/t7.err @@ -0,0 +1,9 @@ +-------------- +CREATE PROCEDURE t7p(IN p INT) +BEGIN + RETURN; +END +-------------- + +ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '; +END' at line 3 diff --git a/.rtx5tmp/t7.out b/.rtx5tmp/t7.out new file mode 100644 index 0000000..e69de29 diff --git a/.rtx5tmp/t7.sql b/.rtx5tmp/t7.sql new file mode 100644 index 0000000..b2bb18f --- /dev/null +++ b/.rtx5tmp/t7.sql @@ -0,0 +1,7 @@ +DELIMITER $$ +DROP PROCEDURE IF EXISTS t7p$$ +CREATE PROCEDURE t7p(IN p INT) +BEGIN + RETURN; +END$$ +DELIMITER ;