自己写:写出恢复前必须先做的那一步
这份备份里没有建库语句。把 TODO 补完,让它打出恢复之前必须先做的那件事(备份里有建库语句就打"不用管",没有就打"先建库")。
题面里已经准备好四份**真实形状**的运维文本(都是字符串) GRANTS 5 行 SHOW GRANTS 的输出(app / root / ro / bak 四个账号) DUMP 一份 mysqldump 的产物(两张表 goods 和 orders) SLOW 5 条慢查询记录,每条两行:一行统计、一行语句 MYCNF 一份 my.cnf 的 [mysqld] 段 两个现成的工具函数 slow_rows() → 把慢日志拆成 (用了几秒, 等锁几秒, 扫了多少行, 语句) 的列表 cnf(key) → my.cnf 里某一项现在配的是什么(找不到返回"没配")
GRANTS = """GRANT USAGE ON *.* TO `app`@`10.0.%`
GRANT SELECT, INSERT, UPDATE ON `shop`.* TO `app`@`10.0.%`
GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` WITH GRANT OPTION
GRANT SELECT ON `shop`.`orders` TO `ro`@`%`
GRANT SELECT, INSERT, UPDATE, DELETE ON `shop`.* TO `bak`@`10.0.5.7`"""
DUMP = """-- MySQL dump 10.13 Distrib 8.0.36
-- Host: db-1 Database: shop
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`price` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `goods` VALUES (1,'a',10),(2,'b',20),(3,'c',30);
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`id` int NOT NULL AUTO_INCREMENT,
`gid` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `orders` VALUES (1,1),(2,1),(3,2),(4,3),(5,3);
-- Dump completed"""
SLOW = """# Query_time: 0.80 Lock_time: 0.00 Rows_sent: 12 Rows_examined: 1200
SELECT * FROM goods WHERE price > 5;
# Query_time: 12.40 Lock_time: 12.10 Rows_sent: 1 Rows_examined: 3
UPDATE goods SET price = 99 WHERE id = 1;
# Query_time: 7.60 Lock_time: 0.00 Rows_sent: 250 Rows_examined: 480000
SELECT * FROM orders WHERE gid = 7;
# Query_time: 3.10 Lock_time: 0.02 Rows_sent: 40 Rows_examined: 9000
SELECT * FROM goods WHERE name = 'x';
# Query_time: 0.50 Lock_time: 0.00 Rows_sent: 5 Rows_examined: 300
SELECT COUNT(*) FROM orders;"""
MYCNF = """[mysqld]
bind-address = 0.0.0.0
skip-name-resolve = ON
max_connections = 500
slow_query_log = ON
long_query_time = 10
local_infile = ON
sql_mode = STRICT_TRANS_TABLES"""
def slow_rows():
"""把慢日志拆成一条一条:(用了几秒, 等锁几秒, 扫了多少行, 语句)。"""
out = []
ls = SLOW.split("\n")
for i in range(0, len(ls), 2):
f = ls[i].replace(":", " ").split()
out.append((float(f[2]), float(f[4]), int(f[8]), ls[i + 1]))
return out
def cnf(key):
"""my.cnf 里某一项现在配的是什么(找不到返回"没配")。"""
for line in MYCNF.split("\n"):
if line.startswith(key):
return line.split("=")[1].strip()
return "没配"
# TODO:看 DUMP 里有没有建库语句,按上面的规则打出来
print("")
全部评论