1. 从零开始金仓 Kingbase 运维 SQL 的基石刚接触金仓 KingbaseES 那会儿我和很多朋友一样觉得数据库运维是个挺“玄学”的活儿动不动就要查文档、翻手册。后来踩过不少坑才明白高效运维的秘诀其实就藏在一系列精准、实用的 SQL 语句里。它们就像是数据库的“听诊器”和“手术刀”能让你快速了解系统状态并精准地解决问题。今天我就把自己这些年积累的、最常用也最核心的运维 SQL 实战经验分享出来希望能帮你少走弯路。金仓 KingbaseES 作为一款成熟的企业级数据库其运维逻辑与 PostgreSQL 一脉相承但又融入了不少自身特性。很多新手会觉得命令繁多无从下手。我的建议是先把最基础的“启停看”搞明白。比如你知道怎么优雅地启动和停止数据库吗很多人第一反应是去系统服务里操作但在命令行环境下sys_ctl才是更直接、更可控的工具。单机环境下你可以用sys_ctl start -D /data/kingbase/data来启动指定数据目录的实例。这个-D参数非常关键尤其是在一台服务器上部署了多个 Kingbase 实例的时候它能帮你精准定位。停止和重启也是类似的命令sys_ctl stop -D /data/kingbase/data和sys_ctl restart -D /data/kingbase/data。这里有个我亲身经历的小坑有时候修改了配置文件kingbase.conf比如调整了内存参数直接重启服务固然可以但更优雅的方式是使用sys_ctl reload命令。这个命令能让数据库在不中断现有连接的情况下重新加载配置文件。想象一下你的线上业务正在跑突然需要调整某个参数用reload就能实现“热更新”避免了服务中断的风险。我强烈建议你把start、stop、restart、reload这几个命令及其-D参数的用法刻在脑子里这是运维操作的起点。初始化实例是另一个基础但容易出错的环节。initdb命令的参数看起来很多但其实有规律可循。一个典型的初始化命令可能是这样的initdb -E UTF8 -U SYSTEM -D /home/kingbase/data -A trust。这里-E指定编码务必设为UTF8这是兼容性最好的选择-U指定初始超级用户默认为SYSTEM-D是指定数据目录的“老家”所有数据库文件都会放在这里-A指定本地连接的认证方法初期测试可以用trust信任所有本地连接但生产环境一定要改为更安全的md5或scram-sha-256。完成初始化后别忘了用show server_encoding;和show database_mode;这两个简单的 SQL 命令验证一下编码和数据库模式是 Oracle 兼容模式还是 MySQL 兼容模式确保和你的应用需求匹配。1.1 用户、库、权限构建安全围栏数据库建好了接下来就是创建用户和数据库并分配权限。这听起来简单但权限管理不当可是安全问题的重灾区。我见过太多因为权限过于宽松而导致的数据泄露或误操作案例。创建数据库的命令很简单CREATE DATABASE myapp OWNER myuser;。这里的关键是OWNER它指定了这个数据库的属主。属主天然拥有该数据库的所有权限所以这个设置要谨慎。创建用户则是CREATE USER myuser WITH PASSWORD ‘StrongPass123!’;。请注意在生产环境密码一定要复杂并且最好定期更换。权限管理是重头戏。金仓的权限体系层次分明实例级、数据库级、模式级、对象级。最粗粒度的是把整个数据库的所有权限给一个用户GRANT ALL PRIVILEGES ON DATABASE myapp TO myuser;。但通常我们不会这么做更常见的做法是在某个模式Schema内授权。比如你的应用数据都放在app_schema这个模式下你可以这样授权GRANT USAGE ON SCHEMA app_schema TO app_user;允许使用该模式然后GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app_schema TO app_user;授予对模式内所有表的增删改查权限。这里有个高级技巧ALTER DEFAULT PRIVILEGES。这条命令可以设置未来对象的默认权限。比如你希望app_user自动拥有未来在app_schema下创建的所有表的查询权限可以执行ALTER DEFAULT PRIVILEGES IN SCHEMA app_schema GRANT SELECT ON TABLES TO app_user;。这能极大减少后续的权限管理工作量。对于只读报表用户你还可以结合用户参数设置ALTER USER report_user SET default_transaction_read_only ON;这样即使用户有写权限其默认事务也是只读的多了一层防护。2. 洞察秋毫全方位监控数据库状态数据库跑起来之后你不能当“甩手掌柜”。它当前健康吗有没有性能瓶颈谁在访问这些都需要你心里有数。金仓提供了一系列强大的系统视图System Views就像给数据库装上了全方位的监控探头。首先你得知道数据库本身的基本信息。SELECT * FROM sys_database;可以列出所有数据库。SELECT * FROM v$instance;在 Oracle 兼容模式下能查看实例状态、版本、启动时间等这是快速确认数据库是否正常运行的常用语句。但最动态、最值得关注的是sys_stat_activity视图它展示了当前所有会话连接的实时快照。我经常用它来排查“数据库怎么突然慢了”这种问题。直接查SELECT * FROM sys_stat_activity;信息会很多。我通常先关注几个关键列usename用户名、application_name客户端应用名、client_addr客户端IP、state状态active表示正在执行查询idle表示空闲、query正在执行或最后执行的SQL语句、query_start查询开始时间。一个非常实用的查询是找出当前正在运行、且执行时间过长的SQL这往往是性能问题的元凶SELECT pid, usename, client_addr, application_name, now() - query_start AS duration, query, state FROM sys_stat_activity WHERE state active AND now() - query_start interval 5 minutes ORDER BY duration DESC;这条语句能帮你立刻定位到那些执行超过5分钟的“慢查询”接下来你就可以针对这些SQL进行优化或者必要时终止它们我们后面会讲如何终止。另一个重要的视图是sys_stat_database它提供了数据库级别的统计信息比如事务提交/回滚数、磁盘块读写数、冲突次数等。通过定期采样这个视图的数据你可以了解数据库的整体负载变化趋势。SELECT datname, xact_commit, xact_rollback, blks_read, blks_hit FROM sys_stat_database;是一个不错的概览查询其中blks_hit与 (blks_hitblks_read) 的比值可以粗略反映缓存命中率是衡量内存是否充足的重要指标。2.1 深入对象表、索引与空间管理知道了整体状态我们还得深入到底层对象。你的业务表有多大有没有膨胀索引用上了吗这些问题的答案都藏在系统目录表里。查看某个表的大小是最常见的需求。SELECT pg_size_pretty(pg_relation_size(‘my_table’));会以易读的格式如 MB、GB返回表的数据部分大小。如果想看表的总大小包括索引和TOAST就用pg_total_relation_size(‘my_table’)。我习惯写一个查询把库里所有表按大小排序一眼就能找出“空间大户”SELECT schemaname, relname AS table_name, pg_size_pretty(pg_total_relation_size(relid)) AS total_size, pg_size_pretty(pg_relation_size(relid)) AS table_size, pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) AS index_and_toast_size FROM pg_stat_user_tables ORDER BY pg_total_relation_size(relid) DESC LIMIT 20;索引是加速查询的利器但创建不当或维护不善也会成为负担。sys_stat_user_indexes视图可以告诉你索引的使用情况特别是idx_scan索引扫描次数。如果一个表的idx_scan很低但seq_scan全表扫描次数很高那你就得考虑是不是查询条件没用到索引或者索引建得不对。查看特定表上有哪些索引及其定义可以用SELECT schemaname, tablename, indexname, indexdef FROM sys_indexes WHERE schemaname ‘public’ AND tablename ‘my_table’;空间管理还包括表空间。金仓允许你把不同的数据库对象放到不同的磁盘目录以实现IO分流。SELECT spcname, pg_size_pretty(pg_tablespace_size(spcname)) FROM pg_tablespace;可以查看所有表空间及其大小。如果你发现某个表空间快满了就需要考虑扩容磁盘或者将部分表迁移到其他表空间ALTER TABLE my_table SET TABLESPACE new_tablespace;。这个操作会锁表需要在业务低峰期进行。3. 故障排查与性能调优实战运维工作中最刺激的部分莫过于故障排查和性能救火。这时候前面提到的监控 SQL 就是你的“侦查工具”而下面这些则是你的“手术工具”。锁阻塞排查是高频场景。用户报告“某个操作一直卡住”十有八九是锁在作祟。首先用我们之前提到的sys_stat_activity找到状态为active但长时间不动的会话。然后通过sys_locks视图查看当前的锁信息。但更直接的是使用下面这个经典的“锁等待链”查询它能清晰地展示谁阻塞了谁SELECT blocked_locks.pid AS blocked_pid, blocked_activity.usename AS blocked_user, blocking_locks.pid AS blocking_pid, blocking_activity.usename AS blocking_user, blocked_activity.query AS blocked_statement, blocking_activity.query AS blocking_statement FROM pg_catalog.pg_locks blocked_locks JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid blocked_locks.pid JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype blocked_locks.locktype AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.pid ! blocked_locks.pid JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid blocking_locks.pid WHERE NOT blocked_locks.granted;找到阻塞源头blocking_pid后如果确认其事务异常可以考虑使用SELECT pg_terminate_backend(blocking_pid);来强制终止该会话。请注意这是强制手段可能会回滚该会话正在执行的事务务必谨慎最好先与相关开发或业务人员确认。性能瓶颈分析则更需要依赖sys_stat_statements这个扩展。它堪称数据库性能分析的“神器”能记录所有执行过的SQL的统计信息包括执行次数、总耗时、平均耗时、读写IO等。要使用它首先需要在kingbase.conf配置文件中添加shared_preload_libraries ‘sys_stat_statements’然后重启数据库。之后在需要监控的数据库中执行CREATE EXTENSION sys_stat_statements;。启用后你就可以大显身手了。比如找出总耗时最长的TOP 10 SQLSELECT query, total_time, calls, mean_time FROM sys_stat_statements ORDER BY total_time DESC LIMIT 10;。找出单次调用最耗IO的SQLSELECT query, (blk_read_timeblk_write_time)/calls as avg_io_time FROM sys_stat_statements WHERE calls 0 ORDER BY avg_io_time DESC LIMIT 10;。这些数据能让你快速定位到系统的性能热点从而有针对性地进行SQL优化或索引调整。3.1 维护操作VACUUM、归档与日志管理数据库不会自我修复需要定期的维护。对于金仓以及所有基于MVCC的数据库VACUUM是关键中的关键。它负责清理那些已被删除或更新掉的旧版本数据行死亡元组回收存储空间。你可以通过SELECT n_dead_tup, n_live_tup, last_vacuum, last_autovacuum FROM pg_stat_user_tables WHERE relname ‘my_table’;来查看表的死亡元组数量。如果n_dead_tup相对于n_live_tup比例很高比如超过30%说明这个表很“臃肿”需要手动执行VACUUM ANALYZE my_table;。ANALYZE会更新表的统计信息帮助优化器生成更好的执行计划。对于重要的生产数据库开启WAL归档是保证数据安全的基础。这需要在kingbase.conf中配置几行wal_level replica archive_mode on archive_command ‘test ! -f /archive_path/%f cp %p /archive_path/%f’archive_command是个shell命令%p是WAL段的完整路径%f是文件名。配置好后重启数据库数据库就会在切换WAL段时自动将其复制到归档目录。你可以通过SELECT pg_walfile_name(pg_current_wal_lsn());查看当前正在使用的WAL文件并通过sys_archivecleanup工具需手动或由脚本调用来清理早于某个时间点的归档日志防止磁盘被撑满。日志文件管理同样重要。金仓的运行日志sys_log默认会一直增长。我习惯写一个简单的Shell脚本放到 crontab 里定期清理过期的日志比如保留最近30天的find /data/kingbase/data/sys_log -name “*.log” -mtime 30 -exec rm {} \;但更安全的方式是配置日志轮转在kingbase.conf中设置log_rotation_age 1d和log_rotation_size 100MB让数据库自动管理。4. 高阶技巧与自动化运维思路当你对基础运维驾轻就熟后可以尝试一些高阶技巧并向自动化运维迈进。这些技巧能极大提升你的工作效率和系统的稳定性。动态修改配置很多参数可以在会话或事务级别动态调整无需重启。比如临时为当前会话设置更大的 work_mem 以优化一个复杂排序SET work_mem ‘64MB’;。或者设置语句超时防止查询永远挂起SET statement_timeout ‘300s’;。你可以通过SHOW all;或查询sys_settings视图来查看所有参数及其当前值、默认值、是否需要重启等信息。查询执行计划分析遇到慢SQLEXPLAIN命令是你的最佳伙伴。在SQL语句前加上EXPLAIN ANALYZE数据库会实际执行该语句并输出详细的执行计划包括每个步骤的耗时、返回行数、循环次数等。仔细阅读执行计划重点关注是否有全表扫描Seq Scan、嵌套循环Nested Loop代价是否过高、预估行数和实际行数是否偏差巨大等这些都是优化的线索。自动化监控与告警将前面提到的诊断SQL封装起来定期执行并把结果与阈值比较就能构建简单的监控。例如你可以写一个脚本每小时检查一次是否有长时间空闲事务SELECT * FROM sys_stat_activity WHERE state ‘idle in transaction’ AND now() - state_change interval ‘1 hour’;。表空间使用率是否超过90%。是否有未完成的复制槽导致WAL堆积。 一旦发现异常就通过邮件、钉钉、企业微信等渠道发送告警。更进一步可以将这些数据采集到时序数据库如 Prometheus中配合 Grafana 制作成直观的监控大盘。备份与恢复演练再好的监控和优化也离不开可靠的备份。除了物理备份sys_basebackup逻辑备份工具sys_dump也必不可少。我建议针对不同的恢复粒度制定策略全库备份sys_dumpall、单库备份、单表备份。并且一定要定期进行恢复演练把备份文件恢复到测试环境验证其完整性和可用性。备份脚本可以这样写#!/bin/bash BACKUP_DIR“/backup/kingbase” DATE$(date %Y%m%d_%H%M%S) # 逻辑备份全库 pg_dumpall -h localhost -U system | gzip ${BACKUP_DIR}/full_backup_${DATE}.sql.gz # 物理备份需要配置复制权限 # sys_basebackup -D ${BACKUP_DIR}/physical_${DATE} -h localhost -U replica_user -P # 清理7天前的备份 find ${BACKUP_DIR} -name “*.gz” -mtime 7 -delete最后我想强调的是运维的本质是“预”和“防”。把这些SQL脚本化、自动化、常态化你就能从被动的“救火队员”转变为主动的“系统守护者”。金仓 Kingbase 提供了丰富的工具和视图关键在于你是否能熟练地运用它们。多动手实践把每条命令都自己跑一遍理解其输出你会在不知不觉中成长为一名游刃有余的数据库专家。记住最厉害的运维是让问题在发生之前就被解决掉。
如何用Line Awesome图标库让网页设计瞬间提升3个档次? 【免费下载链接】line-awesome Replace Font Awesome with modern line icons 项目地址: https://gitcode.com/gh_mirrors/li/line-awesome
你是不是曾经在设计网页时,为了寻找合适的图标而烦…
Icinga2完整教程:如何快速搭建企业级分布式监控系统 【免费下载链接】icinga2 The core of our monitoring platform with a powerful configuration language and REST API. 项目地址: https://gitcode.com/gh_mirrors/ic/icinga2
Icinga2是一款功能强大的开…