国庆节2号 PostgreSQL 停机罢工 协助 解决问题得 66.66元的红包
❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3300人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群近400 9群 200+,开10群PolarDB专业学习群100+)
回顾一下2025年哪里也没有出去玩的国庆节,除了单位值班,还和另外的一个同学抢救了一次PostgreSQL 急速冻结炸弹的问题。假期期间,10月2日下午接到一条私信,信息下方截图。最近单位忙,业务多假期虽说有8天但是值班,且还的负责整体的各个业务线整体的数据库稳定,还的安排其他人员的值班工作。当天下午拜完菩萨,望菩萨保佑,刚跨出寺庙这微信就来了。
当时要回去所以一边走路一边回复,期间里面还有一些事情,最后问题应该是解决了,同学还给了66.66的红包。从开始问问题的下午2点多,到收到红包的10月3日凌晨3点多,14个小时的抢救。
这里想梳理一下如果遇到这样的情况,应该怎么处理,总结一篇帖子,方便后续有人遇到这样的情况,能快速处理。
首先第一个问题,为什么会出现这个问题,可以简单进行总结
1 Autovacuum 对于表的规律vaccum工作实效了,可能是针对某张表,当然也可能是全部失效。
2 数据库存在没有commit的事务
3 逻辑复制槽对方无法消费数据,或逻辑复制槽失效,但没有清理导致无法进行事务ID的回收。
但最终我们归结于一个问题,我们没有做好事务TXID的监控,也就是我们俗称的age老化。
1 查看当前的数据库中的表,哪些表超过3天没有autovacuum 过
postgres=# SELECT
postgres-# schemaname AS "模式名",
postgres-# relname AS "表名",
postgres-# pg_size_pretty(pg_relation_size(relid)) AS "表大小",
postgres-# n_dead_tup AS "死元组数量",
postgres-# last_autovacuum AS "最后一次 Autovacuum 完成时间",
postgres-# CASE
postgres-# WHEN last_autovacuum IS NULL THEN '从未运行'
postgres-# ELSE (now() - last_autovacuum)::interval(0) || ' 前'
postgres-# END AS "距离上次运行间隔"
postgres-# FROM
postgres-# pg_stat_user_tables
postgres-# WHERE
postgres-# last_autovacuum IS NULL
postgres-# OR last_autovacuum < (now() - interval '3 days')
postgres-# ORDER BY
postgres-# last_autovacuum NULLS FIRST, n_dead_tup DESC;
模式名 | 表名 | 表大小 | 死元组数量 | 最后一次 Autovacuum 完成时间 | 距离上次运行间隔
--------+------+--------+------------+------------------------------+------------------
(0 rows)
postgres=#
同时我们可以查阅当前PG中那个数据库的age最大,然后进入后,扫描其中age最大的10个表是那些
SELECT
n.nspname AS schema_name,
c.relname AS table_name,
c.relfrozenxid AS oldest_unfrozen_txid,
age(c.relfrozenxid) AS txid_distance_to_current,
(SELECT setting FROM pg_settings WHERE name = 'autovacuum_freeze_max_age') AS freeze_max_age_limit
FROM
pg_class c
JOIN
pg_namespace n ON n.oid = c.relnamespace
WHERE
c.relkind = 'r' -- 只查找常规表
AND n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') -- 排除系统自带的模式
ORDER BY
age(c.relfrozenxid) DESC -- 距离当前事务 ID 越远,值越大
LIMIT 10;
这里我们模拟一下,让数据库进入单用户模式,通过单用户模式来模拟一些操作,在你进入单用户模式中,请注意两点。
1 请在启动数据库前,物理备份你的数据库目录下的数据文件。 2 在进入到单用户模式,进行回收操作的时候,不能人为进行停止操作
backend> cuum IS NULL THEN '从未运行'
ELSE (now() - last_autovacuum)::interval(0) || ' 前'
END AS "距离上次运行间隔"
FROM
pg_stat_user_tables
WHERE
last_autovacuum IS NULL
OR last_autovacuum < (now() - interval '3 days')
ORDER B2025-06-02 05:56:58.405 EDT [4150] ERROR: syntax error at or near "WHEN" at character 9
2025-06-02 05:56:58.405 EDT [4150] STATEMENT: WHEN last_autovacuum IS NULL THEN '从未运行'
backend> 2025-06-02 05:56:58.405 EDT [4150] ERROR: syntax error at or near "ELSE" at character 9
2025-06-02 05:56:58.405 EDT [4150] STATEMENT: ELSE (now() - last_autovacuum)::interval(0) || ' 前'
backend> 2025-06-02 05:56:58.405 EDT [4150] ERROR: syntax error at or near "AS" at character 9
2025-06-02 05:56:58.405 EDT [4150] STATEMENT: END AS "距离上次运行间隔"
backend> 2025-06-02 05:56:58.405 EDT [4150] ERROR: syntax error at or near "FROM" at character 1
2025-06-02 05:56:58.405 EDT [4150] STATEMENT: FROM
backend> 2025-06-02 05:56:58.405 EDT [4150] ERROR: syntax error at or near "pg_stat_user_tables" at character 5
2025-06-02 05:56:58.405 EDT [4150] STATEMENT: pg_stat_user_tables
backend> 2025-06-02 05:56:58.405 EDT [4150] ERROR: syntax error at or near "WHERE" at character 1
2025-06-02 05:56:58.405 EDT [4150] STATEMENT: WHERE
backend> 2025-06-02 05:56:58.405 EDT [4150] ERROR: syntax error at or near "last_autovacuum" at character 5
2025-06-02 05:56:58.405 EDT [4150] STATEMENT: last_autovacuum IS NULL
backend> 2025-06-02 05:56:58.406 EDT [4150] ERROR: syntax error at or near "OR" at character 5
2025-06-02 05:56:58.406 EDT [4150] STATEMENT: OR last_autovacuum < (now() - interval '3 days')
backend> Y
last_autovacuum NULLS FIRST, n_dead_tup DESC;2025-06-02 05:56:58.423 EDT [4150] ERROR: syntax error at or near "ORDER" at character 1
2025-06-02 05:56:58.423 EDT [4150] STATEMENT: ORDER BY
这里一些情况需要告知客户或者领导,不要因为等的时间太长,而正在进行vacuum操作又kill他。语句在单用户模式执行时,不能直接带着tab 回车等符号粘贴,否则会被认为是多个单条语句
1 如何进入单用户模式
[postgres@postgresql17 ~]$
[postgres@postgresql17 ~]$
[postgres@postgresql17 ~]$
[postgres@postgresql17 ~]$ /usr/local/postgres/bin/postgres --single -D /pgdata/data/ postgres -P
PostgreSQL stand-alone backend 17.4
backend>
backend>
backend>
backend>
backend>
在登录到单用户模式后,有几个问题
1 单用户模式直接就进入到了backend模式,这里进入后并不能像之前操作Postgres中一样,通过简短的快捷操作,获得数据库系统的信息,这里仅仅只能通过对表的一些操作获得系统中的你需要的信息。 如 \l 查看当前数据库的信息,是不可以的,只能通过 select * from pg_database;来获取信息
backend> select * from pg_database;
1: oid (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname (typeid = 19, len = 64, typmod = -1, byval = f)
3: datdba (typeid = 26, len = 4, typmod = -1, byval = t)
4: encoding (typeid = 23, len = 4, typmod = -1, byval = t)
5: datlocprovider (typeid = 18, len = 1, typmod = -1, byval = t)
6: datistemplate (typeid = 16, len = 1, typmod = -1, byval = t)
7: datallowconn (typeid = 16, len = 1, typmod = -1, byval = t)
8: dathasloginevt (typeid = 16, len = 1, typmod = -1, byval = t)
9: datconnlimit (typeid = 23, len = 4, typmod = -1, byval = t)
10: datfrozenxid (typeid = 28, len = 4, typmod = -1, byval = t)
11: datminmxid (typeid = 28, len = 4, typmod = -1, byval = t)
12: dattablespace (typeid = 26, len = 4, typmod = -1, byval = t)
13: datcollate (typeid = 25, len = -1, typmod = -1, byval = f)
14: datctype (typeid = 25, len = -1, typmod = -1, byval = f)
15: datlocale (typeid = 25, len = -1, typmod = -1, byval = f)
16: daticurules (typeid = 25, len = -1, typmod = -1, byval = f)
17: datcollversion (typeid = 25, len = -1, typmod = -1, byval = f)
18: datacl (typeid = 1034, len = -1, typmod = -1, byval = f)
----
1: oid = "5" (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname = "postgres" (typeid = 19, len = 64, typmod = -1, byval = f)
3: datdba = "10" (typeid = 26, len = 4, typmod = -1, byval = t)
4: encoding = "6" (typeid = 23, len = 4, typmod = -1, byval = t)
5: datlocprovider = "c" (typeid = 18, len = 1, typmod = -1, byval = t)
6: datistemplate = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
7: datallowconn = "t" (typeid = 16, len = 1, typmod = -1, byval = t)
8: dathasloginevt = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
9: datconnlimit = "-1" (typeid = 23, len = 4, typmod = -1, byval = t)
10: datfrozenxid = "1395194" (typeid = 28, len = 4, typmod = -1, byval = t)
11: datminmxid = "1" (typeid = 28, len = 4, typmod = -1, byval = t)
12: dattablespace = "1663" (typeid = 26, len = 4, typmod = -1, byval = t)
13: datcollate = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
14: datctype = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
17: datcollversion = "2.28" (typeid = 25, len = -1, typmod = -1, byval = f)
----
1: oid = "16384" (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname = "my_pgbench_db" (typeid = 19, len = 64, typmod = -1, byval = f)
3: datdba = "10" (typeid = 26, len = 4, typmod = -1, byval = t)
4: encoding = "6" (typeid = 23, len = 4, typmod = -1, byval = t)
5: datlocprovider = "c" (typeid = 18, len = 1, typmod = -1, byval = t)
6: datistemplate = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
7: datallowconn = "t" (typeid = 16, len = 1, typmod = -1, byval = t)
8: dathasloginevt = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
9: datconnlimit = "-1" (typeid = 23, len = 4, typmod = -1, byval = t)
10: datfrozenxid = "730" (typeid = 28, len = 4, typmod = -1, byval = t)
11: datminmxid = "1" (typeid = 28, len = 4, typmod = -1, byval = t)
12: dattablespace = "1663" (typeid = 26, len = 4, typmod = -1, byval = t)
13: datcollate = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
14: datctype = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
17: datcollversion = "2.28" (typeid = 25, len = -1, typmod = -1, byval = f)
----
1: oid = "1" (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname = "template1" (typeid = 19, len = 64, typmod = -1, byval = f)
3: datdba = "10" (typeid = 26, len = 4, typmod = -1, byval = t)
4: encoding = "6" (typeid = 23, len = 4, typmod = -1, byval = t)
5: datlocprovider = "c" (typeid = 18, len = 1, typmod = -1, byval = t)
6: datistemplate = "t" (typeid = 16, len = 1, typmod = -1, byval = t)
7: datallowconn = "t" (typeid = 16, len = 1, typmod = -1, byval = t)
8: dathasloginevt = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
9: datconnlimit = "-1" (typeid = 23, len = 4, typmod = -1, byval = t)
10: datfrozenxid = "730" (typeid = 28, len = 4, typmod = -1, byval = t)
11: datminmxid = "1" (typeid = 28, len = 4, typmod = -1, byval = t)
12: dattablespace = "1663" (typeid = 26, len = 4, typmod = -1, byval = t)
13: datcollate = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
14: datctype = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
17: datcollversion = "2.28" (typeid = 25, len = -1, typmod = -1, byval = f)
18: datacl = "{=c/postgres,postgres=CTc/postgres}" (typeid = 1034, len = -1, typmod = -1, byval = f)
----
1: oid = "4" (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname = "template0" (typeid = 19, len = 64, typmod = -1, byval = f)
3: datdba = "10" (typeid = 26, len = 4, typmod = -1, byval = t)
4: encoding = "6" (typeid = 23, len = 4, typmod = -1, byval = t)
5: datlocprovider = "c" (typeid = 18, len = 1, typmod = -1, byval = t)
6: datistemplate = "t" (typeid = 16, len = 1, typmod = -1, byval = t)
7: datallowconn = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
8: dathasloginevt = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
9: datconnlimit = "-1" (typeid = 23, len = 4, typmod = -1, byval = t)
10: datfrozenxid = "730" (typeid = 28, len = 4, typmod = -1, byval = t)
11: datminmxid = "1" (typeid = 28, len = 4, typmod = -1, byval = t)
12: dattablespace = "1663" (typeid = 26, len = 4, typmod = -1, byval = t)
13: datcollate = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
14: datctype = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
18: datacl = "{=c/postgres,postgres=CTc/postgres}" (typeid = 1034, len = -1, typmod = -1, byval = f)
----
1: oid = "16591" (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname = "wrapdb" (typeid = 19, len = 64, typmod = -1, byval = f)
3: datdba = "10" (typeid = 26, len = 4, typmod = -1, byval = t)
4: encoding = "6" (typeid = 23, len = 4, typmod = -1, byval = t)
5: datlocprovider = "c" (typeid = 18, len = 1, typmod = -1, byval = t)
6: datistemplate = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
7: datallowconn = "t" (typeid = 16, len = 1, typmod = -1, byval = t)
8: dathasloginevt = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
9: datconnlimit = "-1" (typeid = 23, len = 4, typmod = -1, byval = t)
10: datfrozenxid = "730" (typeid = 28, len = 4, typmod = -1, byval = t)
11: datminmxid = "1" (typeid = 28, len = 4, typmod = -1, byval = t)
12: dattablespace = "1663" (typeid = 26, len = 4, typmod = -1, byval = t)
13: datcollate = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
14: datctype = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
17: datcollversion = "2.28" (typeid = 25, len = -1, typmod = -1, byval = f)
----
backend>
我们下面做一个练习
postgres=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
---------------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------
my_pgbench_db | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | |
postgres | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | |
template0 | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
wrapdb | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | |
(5 rows)
postgres=# \c wrapdb
You are now connected to database "wrapdb" as user "postgres".
wrapdb=# \d
List of relations
Schema | Name | Type | Owner
--------+---------------+----------+----------
public | bigtbl | table | postgres
public | bigtbl_id_seq | sequence | postgres
(2 rows)
wrapdb=# \d bigtbl
Table "public.bigtbl"
Column | Type | Collation | Nullable | Default
---------+---------+-----------+----------+------------------------------------
id | integer | | not null | nextval('bigtbl_id_seq'::regclass)
payload | text | | |
Indexes:
"bigtbl_pkey" PRIMARY KEY, btree (id)
wrapdb=#
我们假设我们的autovacuum 的进程掉了,系统不在进行autovacuum
postgres=# SELECT
datname AS "数据库名",
age(datfrozenxid) AS "XID 年龄 (已消耗的 ID 数量)",
current_setting('autovacuum_freeze_max_age') AS "Autovacuum 冻结阈值",
(age(datfrozenxid) / current_setting('autovacuum_freeze_max_age')::float) * 100 AS "接近阈值的百分比"
FROM
pg_database
ORDER BY
age(datfrozenxid) DESC;
数据库名 | XID 年龄 (已消耗的 ID 数量) | Autovacuum 冻结阈值 | 接近阈值的百分比
-----------+-----------------------------+---------------------+--------------------
wrapdb | 1188 | 100001 | 1.1879881201187987
postgres | 1137 | 100001 | 1.1369886301136989
template1 | 1135 | 100001 | 1.134988650113499
template0 | 1132 | 100001 | 1.1319886801131989
然后我们进入到单用户模式,这里注意我们要对数据库进行vacuum freeze 的工作,对整个数据库进行相关的操作,如果你明确是某个表导致的问题,也可以针对这个表进行vacuum freeze的操作。
----
1: oid = "16384" (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname = "wrapdb" (typeid = 19, len = 64, typmod = -1, byval = f)
3: datdba = "10" (typeid = 26, len = 4, typmod = -1, byval = t)
4: encoding = "6" (typeid = 23, len = 4, typmod = -1, byval = t)
5: datlocprovider = "c" (typeid = 18, len = 1, typmod = -1, byval = t)
6: datistemplate = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
7: datallowconn = "t" (typeid = 16, len = 1, typmod = -1, byval = t)
8: dathasloginevt = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
9: datconnlimit = "-1" (typeid = 23, len = 4, typmod = -1, byval = t)
10: datfrozenxid = "579675" (typeid = 28, len = 4, typmod = -1, byval = t)
11: datminmxid = "1" (typeid = 28, len = 4, typmod = -1, byval = t)
12: dattablespace = "1663" (typeid = 26, len = 4, typmod = -1, byval = t)
13: datcollate = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
14: datctype = "en_US.UTF-8" (typeid = 25, len = -1, typmod = -1, byval = f)
17: datcollversion = "2.28" (typeid = 25, len = -1, typmod = -1, byval = f)
----
这里我们要针对wrapdb的表进行处理,所以我们登录单用户模式。
[postgres@postgresql17 ~]$
[postgres@postgresql17 ~]$ /usr/local/postgres/bin/postgres --single -D /pgdata/data/ wrapdb -P
PostgreSQL stand-alone backend 17.4
backend> sel3e^H^H
2025-06-02 07:50:43.686 EDT [1904650] ERROR: syntax error at or near "sel3e" at character 1
2025-06-02 07:50:43.686 EDT [1904650] STATEMENT: sel3e
backend> select * from pg_tables;
2025-06-02 07:50:51.000 EDT [1904650] WARNING: using index "pg_toast_2618_index" despite IgnoreSystemIndexes at character 15
1: schemaname (typeid = 19, len = 64, typmod = -1, byval = f)
2: tablename (typeid = 19, len = 64, typmod = -1, byval = f)
3: tableowner (typeid = 19, len = 64, typmod = -1, byval = f)
4: tablespace (typeid = 19, len = 64, typmod = -1, byval = f)
5: hasindexes (typeid = 16, len = 1, typmod = -1, byval = t)
6: hasrules (typeid = 16, len = 1, typmod = -1, byval = t)
7: hastriggers (typeid = 16, len = 1, typmod = -1, byval = t)
8: rowsecurity (typeid = 16, len = 1, typmod = -1, byval = t)
----
1: schemaname = "public" (typeid = 19, len = 64, typmod = -1, byval = f)
2: tablename = "test_xid_table" (typeid = 19, len = 64, typmod = -1, byval = f)
3: tableowner = "postgres" (typeid = 19, len = 64, typmod = -1, byval = f)
5: hasindexes = "t" (typeid = 16, len = 1, typmod = -1, byval = t)
6: hasrules = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
7: hastriggers = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
8: rowsecurity = "f" (typeid = 16, len = 1, typmod = -1, byval = t)
这里需要注意,在单用户模式下,对整个库进行操作 vacuum freeze; 或如图下,对相关表进行vacuum freeze.
backend> vacuum freeze test_xid_table;
backend> ^[[A
2025-06-02 07:52:11.290 EDT [1904650] ERROR: syntax error at or near "t character 1
2025-06-02 07:52:11.290 EDT [1904650] STATEMENT:
backend> vacuum freeze test_xid_table;
backend> vacuum freeze verbose test ^H
2025-06-02 07:52:38.098 EDT [1904650] ERROR: syntax error at or near " at character 28
2025-06-02 07:52:38.098 EDT [1904650] STATEMENT: vacuum freeze verbose test
backend> vacuum freeze verbose test_xid_table;
backend>
backend> vacuum freeze test_xid_table;
然后我们在真正的启动数据库,看数据库是否进入正常,并检查到底什么原因导致数据库进入冷冻期。
最后我们在强调单用户模式下的一些注意事项;
在 backend> 下:
❌ 不能使用 \l、\c、\d、\dt 等 psql 内部命令(这些命令是 psql 客户端解释的,单用户模式下并没有 psql);
✅ 只能执行标准 SQL 语句;
❌ 不支持多行编辑或自动补全(回车就是立即执行);
⚠️ 不能直接把带 TAB 或回车的脚本粘贴进去,否则 PostgreSQL 会把它拆成多条语句分别执行,容易报错。
👉 所以要注意输入的 SQL 要是一行完整的语句。
和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?
OceanBase Hybrid search 能力测试,平换MySQL的好选择
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究
OceanBase 6大学习法--OBCA视频学习总结第六章
OceanBase 6大学习法--OBCA视频学习总结第五章--索引与表设计
OceanBase 6大学习法--OBCA视频学习总结第五章--开发与库表设计
OceanBase 6大学习法--OBCA视频学习总结第四章 --数据库安装
OceanBase 6大学习法--OBCA视频学习总结第三章--数据库引擎
OceanBase 架构学习--OB上手视频学习总结第二章 (OBCA)
OceanBase 6大学习法--OB上手视频学习总结第一章
没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
“合体吧兄弟们!”——从浪浪山小妖怪看OceanBase国产芯片优化《OceanBase “重如尘埃”之歌》
MongoDB “升级项目” 大型连续剧(3)-- 自动校对代码与注意事项
MongoDB “升级项目” 大型连续剧(2)-- 到底谁是"der"
MongoDB “升级项目” 大型连续剧(1)-- 可“生”可不升
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL
免费PolarDB云原生课程,听课“争”礼品,重塑云上知识,提高专业能力
非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星
“当复杂的SQL不再需要特别的优化”,邪修研究PolarDB for PG 列式索引加速复杂SQL运行
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火
PostgreSQL 新版本就一定好--由培训现象让我做的实验
说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意
PostgreSQL 无服务 Neon and Aurora 新技术下的新经济模式 (翻译)
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!
MySQL相关文章
一篇为MySQL用户,分析版本核心差异的文章--8.028-8.4的差异
那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师
数据库优化系列
微软动手了,联合OpenAI + Azure 云争夺AI服务市场
HyBrid Search 实现价值落地,从真实企业的需求角度分析 !不只谈技术!
从“小偷”开始,不会从“强盗”结束 -- IvorySQL 2025 PostgreSQL 生态大会
被骂后的文字--技术人不脱离思维困局,终局是个 “死” ? ! ......
个群2025上半年总结,OB、PolarDB, DBdoctor、爱可生、pigsty、osyun、工作岗位等
从MySQL不行了,到乙方DBA 给狗,狗都不干? 我干呀!
SQL SERVER 2025发布了, China幸亏有信创!
删除数据“八扇屏” 之 锦门英豪 --我去-BigData!
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》