#!/bin/bash
# 盈尺（Surinch）MySQL 健康体检评分样例实测 v1.0
# 只能在测试实例上跑：会 DROP/CREATE ${DB}，写入自造数据、制造慢查询/锁等待快照。
# 测试：MySQL 8.0.46；库 mysql_hc_lab；非客户数据。
# 用法：BIN=/opt/mysql/bin DB=mysql_hc_lab WORK=/tmp/mysql_hc ./mysql-healthcheck-score-lab.sh | tee result.txt
set -uo pipefail
BIN=${BIN:-/opt/mysql/bin}
CNF=${CNF:-}
DB=${DB:-mysql_hc_lab}
WORK=${WORK:-/tmp/mysql_hc_lab_work}
case "$DB" in *_lab) ;; *) echo "DB 名必须以 _lab 结尾"; exit 1;; esac
if [[ -n "$CNF" ]]; then M="$BIN/mysql --defaults-file=$CNF"; else M="$BIN/mysql -uroot"; fi
mkdir -p "$WORK"
ts(){ date '+%F %T.%3N'; }
now(){ date +%s.%N; }
ms(){ awk -v a="$1" -v b="$2" 'BEGIN{printf "%.0f", (b-a)*1000}'; }
run(){ local tag=$1; shift; local t0 t1 rc; t0=$(now); "$@" > "$WORK/$tag.out" 2> "$WORK/$tag.err"; rc=$?; t1=$(now); echo "RESULT|$tag|rc=$rc|ms=$(ms $t0 $t1)"; cat "$WORK/$tag.out"; [[ -s "$WORK/$tag.err" ]] && echo "ERR|$tag|$(tr '\n' ' ' < "$WORK/$tag.err")"; }

echo "[$(ts)] === MySQL healthcheck score lab v1.0 ==="
echo "[$(ts)] VERSION"
run version $M -N -e "SELECT @@version; SELECT @@hostname; SELECT @@innodb_buffer_pool_size; SELECT @@max_connections; SELECT @@innodb_lock_wait_timeout; SELECT @@log_bin; SELECT @@gtid_mode; SELECT @@transaction_isolation;"

echo "[$(ts)] 建库造数（orders 20万 + items 50万）"
run setup $M <<SQL
DROP DATABASE IF EXISTS $DB;
CREATE DATABASE $DB CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE $DB;
CREATE TABLE accounts(
  id INT PRIMARY KEY,
  balance INT NOT NULL,
  status TINYINT NOT NULL DEFAULT 1,
  updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;
CREATE TABLE orders(
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  account_id INT NOT NULL,
  amount INT NOT NULL,
  status TINYINT NOT NULL,
  created_at DATETIME NOT NULL,
  KEY idx_account_created(account_id, created_at),
  KEY idx_status_created(status, created_at)
) ENGINE=InnoDB;
CREATE TABLE order_items(
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  order_id BIGINT NOT NULL,
  sku VARCHAR(32) NOT NULL,
  qty INT NOT NULL,
  KEY idx_order(order_id),
  KEY idx_sku(sku)
) ENGINE=InnoDB;
INSERT INTO accounts(id, balance, status)
SELECT n, 1000 + MOD(n, 100), 1 FROM (
  SELECT a.d + b.d*10 + c.d*100 + e.d*1000 AS n
  FROM (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) e
) t WHERE n BETWEEN 1 AND 10000;
INSERT INTO orders(account_id, amount, status, created_at)
SELECT 1+MOD(n,10000), 10+MOD(n,900), MOD(n,5),
       DATE_ADD('2026-01-01', INTERVAL MOD(n,250) DAY)
FROM (
  SELECT a.d + b.d*10 + c.d*100 + e.d*1000 + f.d*10000 AS n
  FROM (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) e,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) f
) t WHERE n BETWEEN 1 AND 200000;
INSERT INTO order_items(order_id, sku, qty)
SELECT 1+MOD(n,200000), CONCAT('SKU', LPAD(1+MOD(n,500),4,'0')), 1+MOD(n,5)
FROM (
  SELECT a.d + b.d*10 + c.d*100 + e.d*1000 + f.d*10000 AS n
  FROM (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) e,
       (SELECT 0 d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
        UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
        UNION SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) f
) t WHERE n BETWEEN 1 AND 500000;
ANALYZE TABLE accounts, orders, order_items;
SELECT 'counts' AS mark, (SELECT COUNT(*) FROM accounts) AS accounts,
       (SELECT COUNT(*) FROM orders) AS orders,
       (SELECT COUNT(*) FROM order_items) AS items;
SQL

echo "[$(ts)] 制造慢查询 digest（关闭 query cache 无关；用 sleep + 全表扫）"
# Enable consumers if needed, truncate digest, run slow queries
run digest_prep $M -e "
UPDATE performance_schema.setup_consumers SET ENABLED='YES' WHERE NAME LIKE 'events_statements%';
UPDATE performance_schema.setup_instruments SET ENABLED='YES', TIMED='YES' WHERE NAME LIKE 'statement/%';
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;
"
# Run intentionally slow queries against lab DB
run slow_queries $M "$DB" <<'SQL'
-- force a few digests
SELECT SLEEP(0.35);
SELECT COUNT(*) FROM orders o JOIN order_items i ON i.order_id=o.id WHERE o.status=3 AND i.sku LIKE 'SKU0%';
SELECT account_id, SUM(amount) FROM orders WHERE created_at > '2026-06-01' GROUP BY account_id ORDER BY SUM(amount) DESC LIMIT 20;
SELECT SLEEP(0.22);
SELECT COUNT(*) FROM order_items WHERE sku='SKU0042';
SELECT o.id, COUNT(*) FROM orders o JOIN order_items i ON i.order_id=o.id GROUP BY o.id ORDER BY COUNT(*) DESC LIMIT 5;
SQL

echo "[$(ts)] 制造短锁等待快照（A 持 4s，B timeout=2 → 1205）"
cat > "$WORK/lock_A.sql" <<SQA
USE $DB;
SET SESSION innodb_lock_wait_timeout=50;
BEGIN;
UPDATE accounts SET balance=balance-1 WHERE id=1;
SELECT SLEEP(4);
COMMIT;
SQA
cat > "$WORK/lock_B.sql" <<SQB
USE $DB;
SET SESSION innodb_lock_wait_timeout=2;
SELECT SLEEP(0.5);
BEGIN;
UPDATE accounts SET balance=balance+1 WHERE id=1;
COMMIT;
SQB
$M < "$WORK/lock_A.sql" > "$WORK/lock_A.out" 2>&1 &
APID=$!
$M --force < "$WORK/lock_B.sql" > "$WORK/lock_B.out" 2>&1 &
BPID=$!
# While waiting, snapshot locks
sleep 1.2
run lock_snap $M -e "
SELECT 'data_lock_waits' AS mark, COUNT(*) AS cnt FROM performance_schema.data_lock_waits;
SELECT ENGINE_TRANSACTION_ID, OBJECT_NAME, LOCK_MODE, LOCK_STATUS, LOCK_DATA
FROM performance_schema.data_locks WHERE OBJECT_SCHEMA='$DB' LIMIT 20;
SELECT trx_id, trx_state, TIMESTAMPDIFF(SECOND,trx_started,NOW()) AS age_s, trx_rows_locked
FROM information_schema.innodb_trx;
"
wait $APID $BPID || true
echo "LOCK_A_OUT:"; cat "$WORK/lock_A.out"
echo "LOCK_B_OUT:"; cat "$WORK/lock_B.out"

echo "[$(ts)] 体检只读采集（连接/abort/长事务/digest/InnoDB/表体积/复制）"
run collect $M <<SQL
SELECT 'META' AS section, @@version AS version, NOW() AS collected_at,
       @@hostname AS host_note, 'TEST_LAB_SYNTHETIC' AS data_class;

SELECT 'CONN' AS section,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Threads_connected')+0 AS threads_connected,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Threads_running')+0 AS threads_running,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Aborted_connects')+0 AS aborted_connects,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Aborted_clients')+0 AS aborted_clients,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Max_used_connections')+0 AS max_used_connections,
  @@max_connections AS max_connections,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Uptime')+0 AS uptime_s;

SELECT 'LONG_TRX' AS section, COUNT(*) AS open_trx,
  COALESCE(MAX(TIMESTAMPDIFF(SECOND, trx_started, NOW())),0) AS max_age_s,
  SUM(CASE WHEN TIMESTAMPDIFF(SECOND, trx_started, NOW())>=30 THEN 1 ELSE 0 END) AS trx_ge_30s
FROM information_schema.innodb_trx;

SELECT 'LOCK_WAIT' AS section, COUNT(*) AS waiting_locks
FROM performance_schema.data_lock_waits;

SELECT 'DIGEST_TOP' AS section,
  LEFT(DIGEST_TEXT, 100) AS digest_text,
  COUNT_STAR AS exec_count,
  ROUND(SUM_TIMER_WAIT/1e12, 3) AS total_s,
  ROUND(AVG_TIMER_WAIT/1e12, 3) AS avg_s,
  ROUND(MAX_TIMER_WAIT/1e12, 3) AS max_s,
  ROUND(SUM_LOCK_TIME/1e12, 3) AS lock_s,
  SUM_ROWS_EXAMINED AS rows_examined
FROM performance_schema.events_statements_summary_by_digest
WHERE SCHEMA_NAME='$DB' OR DIGEST_TEXT LIKE '%SLEEP%' OR DIGEST_TEXT LIKE '%orders%'
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;

SELECT 'INNODB' AS section,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty')+0 AS dirty_pages,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_total')+0 AS total_pages,
  ROUND(100*(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty')/
        NULLIF((SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_total'),0),2) AS dirty_pct,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_buffer_pool_read_requests')+0 AS read_requests,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_buffer_pool_reads')+0 AS disk_reads,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_row_lock_current_waits')+0 AS row_lock_waits_now,
  (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_row_lock_time_avg')+0 AS row_lock_time_avg_ms;

-- history list length (INFORMATION_SCHEMA or SHOW ENGINE); try both
SHOW ENGINE INNODB STATUS\G
SQL

# Parse history list from INNODB STATUS into a separate file for scoring
run history_list bash -c "$M -e 'SHOW ENGINE INNODB STATUS\G' 2>/dev/null | awk '/History list length/{print; found=1} /Log sequence number/{print} /Last checkpoint at/{print} /Checkpoint age/{print} found&&/---/{exit}'"

run table_sizes $M -N -e "
SELECT table_schema, table_name, table_rows,
       ROUND((data_length+index_length)/1024/1024,2) AS total_mb,
       ROUND(data_length/1024/1024,2) AS data_mb,
       ROUND(index_length/1024/1024,2) AS index_mb
FROM information_schema.tables
WHERE table_schema='$DB'
ORDER BY (data_length+index_length) DESC;
"

run replication $M -e "
SELECT 'REPL' AS section,
  (SELECT COUNT(*) FROM performance_schema.replication_connection_status) AS replica_channels,
  (SELECT COUNT(*) FROM performance_schema.replication_applier_status) AS applier_channels,
  @@read_only AS read_only,
  @@super_read_only AS super_read_only;
SHOW REPLICA STATUS\G
"

echo "[$(ts)] 评分（绿/黄/红规则写死在脚本，便于文章复述）"
# Collect key numbers into vars via mysql -N
eval $($M -N -e "
SELECT CONCAT('THREADS_CONNECTED=',(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Threads_connected'));
SELECT CONCAT('MAX_CONNECTIONS=',@@max_connections);
SELECT CONCAT('ABORTED_CONNECTS=',(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Aborted_connects'));
SELECT CONCAT('ABORTED_CLIENTS=',(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Aborted_clients'));
SELECT CONCAT('MAX_TRX_AGE=',COALESCE((SELECT MAX(TIMESTAMPDIFF(SECOND,trx_started,NOW())) FROM information_schema.innodb_trx),0));
SELECT CONCAT('LOCK_WAITS=',(SELECT COUNT(*) FROM performance_schema.data_lock_waits));
SELECT CONCAT('DIRTY_PAGES=',(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty'));
SELECT CONCAT('TOTAL_PAGES=',(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_total'));
SELECT CONCAT('REPL_CHANNELS=',(SELECT COUNT(*) FROM performance_schema.replication_connection_status));
SELECT CONCAT('DIGEST_MAX_AVG=',COALESCE((SELECT ROUND(MAX(AVG_TIMER_WAIT)/1e12,3) FROM performance_schema.events_statements_summary_by_digest WHERE SCHEMA_NAME='$DB' OR DIGEST_TEXT LIKE '%SLEEP%'),0));
")

HLL=$(grep -oE 'History list length [0-9]+' "$WORK/history_list.out" 2>/dev/null | head -1 | awk '{print $4}')
HLL=${HLL:-0}
DIRTY_PCT=$(awk -v d="$DIRTY_PAGES" -v t="$TOTAL_PAGES" 'BEGIN{if(t>0) printf "%.2f", 100*d/t; else print 0}')
CONN_PCT=$(awk -v c="$THREADS_CONNECTED" -v m="$MAX_CONNECTIONS" 'BEGIN{if(m>0) printf "%.1f", 100*c/m; else print 0}')

score_conn(){ awk -v p="$CONN_PCT" -v ac="$ABORTED_CONNECTS" 'BEGIN{
  if(p>=90 || ac>1000) print "RED";
  else if(p>=70 || ac>100) print "YELLOW";
  else print "GREEN";
}'; }
score_trx(){ awk -v a="$MAX_TRX_AGE" -v w="$LOCK_WAITS" 'BEGIN{
  if(a>=300 || w>=10) print "RED";
  else if(a>=30 || w>=1) print "YELLOW";
  else print "GREEN";
}'; }
score_slow(){ awk -v a="$DIGEST_MAX_AVG" 'BEGIN{
  if(a+0>=5) print "RED";
  else if(a+0>=1) print "YELLOW";
  else print "GREEN";
}'; }
score_innodb(){ awk -v h="$HLL" -v d="$DIRTY_PCT" 'BEGIN{
  if(h+0>=1000000 || d+0>=75) print "RED";
  else if(h+0>=100000 || d+0>=40) print "YELLOW";
  else print "GREEN";
}'; }
score_size(){ echo "GREEN"; } # lab sizes are tiny; green unless we detect >80% disk (not probed here)
score_repl(){ if [[ "$REPL_CHANNELS" == "0" ]]; then echo "N/A"; else echo "GREEN"; fi; }

S_CONN=$(score_conn); S_TRX=$(score_trx); S_SLOW=$(score_slow); S_INN=$(score_innodb); S_SIZE=$(score_size); S_REPL=$(score_repl)

# Overall: worst of scored (ignore N/A)
OVERALL=$($M -N -e "SELECT 1" >/dev/null; awk -v a="$S_CONN,$S_TRX,$S_SLOW,$S_INN,$S_SIZE" 'BEGIN{
  n=split(a,x,","); w="GREEN";
  for(i=1;i<=n;i++){ if(x[i]=="RED") w="RED"; else if(x[i]=="YELLOW" && w!="RED") w="YELLOW"; }
  print w;
}')

cat > "$WORK/score_report.md" <<REP
# MySQL 健康体检样例报告（测试库 · 自造数据）

- 采集时间：$(date '+%F %T %Z')
- 引擎：MySQL $(grep -m1 . "$WORK/version.out" 2>/dev/null || echo 8.0.46)
- 库：${DB}（accounts 1万 / orders 20万 / order_items 50万）
- 数据类别：TEST_LAB_SYNTHETIC（非客户数据）
- 复制：未配置从库（replica_channels=${REPL_CHANNELS}）→ 复制维度标 N/A

## 等级规则（本样例口径）

| 维度 | 绿 | 黄 | 红 |
|---|---|---|---|
| 连接与 abort | 连接占用 <70% 且 Aborted_connects≤100 | 占用≥70% 或 abort>100 | 占用≥90% 或 abort>1000 |
| 长事务 / 锁等待 | 无 ≥30s 事务且无等待 | 有 ≥30s 或当前有锁等待 | 有 ≥300s 或等待≥10 |
| 慢查询 digest | digest 最大平均耗时 <1s | ≥1s | ≥5s |
| InnoDB | history list <1e5 且 dirty%<40 | history≥1e5 或 dirty≥40% | history≥1e6 或 dirty≥75% |
| 表/索引体积 | 本样例仅列 Top，不因体积标红（生产另按磁盘余量） | — | — |
| 复制 | 有从库且延迟正常 | 延迟偏高 | 复制中断；**无从库则 N/A** |

## 实测结果

| 维度 | 关键数字 | 等级 |
|---|---|---|
| 连接与 abort | threads_connected=${THREADS_CONNECTED} / max=${MAX_CONNECTIONS}（${CONN_PCT}%）；Aborted_connects=${ABORTED_CONNECTS}；Aborted_clients=${ABORTED_CLIENTS} | ${S_CONN} |
| 长事务 / 锁等待 | max_trx_age_s=${MAX_TRX_AGE}；当前 data_lock_waits=${LOCK_WAITS}（持锁场景已结束；制造过程中曾出现等待与 1205） | ${S_TRX} |
| 慢查询 digest | lab 库 digest 最大 AVG≈${DIGEST_MAX_AVG}s（含 SLEEP 与 JOIN） | ${S_SLOW} |
| InnoDB | dirty_pages=${DIRTY_PAGES}/${TOTAL_PAGES}（${DIRTY_PCT}%）；History list length=${HLL} | ${S_INN} |
| 表/索引体积 | 见 CSV；lab 体量小 | ${S_SIZE} |
| 复制 | replica_channels=${REPL_CHANNELS} → 未测 | ${S_REPL} |

**总体等级：${OVERALL}**（取已评分维度最差；N/A 不参与）

## 说明

1. 本报告用于展示「只读采集 → 绿/黄/红」的交付形态，不是任何客户环境结论。
2. 制造了一次 innodb_lock_wait_timeout=2 的 1205，用于验证锁等待巡检段有输出；评分时若等待已结束则按当前快照。
3. 正式 ¥499 体检会在约定证据内给出 P0/P1/P2、证据缺口与整改 Top5，并由人工复核备份恢复与权限相关项。
REP

echo "==== SCORE_REPORT_BEGIN ===="
cat "$WORK/score_report.md"
echo "==== SCORE_REPORT_END ===="
echo "SCORE_JSON|conn=${S_CONN}|trx=${S_TRX}|slow=${S_SLOW}|innodb=${S_INN}|size=${S_SIZE}|repl=${S_REPL}|overall=${OVERALL}|threads=${THREADS_CONNECTED}|max_conn=${MAX_CONNECTIONS}|conn_pct=${CONN_PCT}|aborted_connects=${ABORTED_CONNECTS}|aborted_clients=${ABORTED_CLIENTS}|max_trx_age=${MAX_TRX_AGE}|lock_waits=${LOCK_WAITS}|digest_max_avg=${DIGEST_MAX_AVG}|dirty_pct=${DIRTY_PCT}|history_list=${HLL}|repl_channels=${REPL_CHANNELS}"
echo "[$(ts)] DONE"
