当前位置: 首页 > news >正文

PostgreSQL数据库创建删除与切换的底层原理与实操指南

1. 项目概述:为什么数据库管理不是“点几下就完事”的小事?

刚接触 PostgreSQL 的人,常把“建库、删库、连库”当成三步操作题——右键点点、填个名字、敲个\c,教程里写得轻巧,自己上手却总卡在奇怪的地方:新建的库死活不显示在 pgAdmin 左侧树里;DROP DATABASE school;报错说“database is being accessed by other users”;用psql -U postgres连上去,\l看到一堆库,可一输\c mydb就提示“FATAL: database "mydb" does not exist”,明明刚才还在 pgAdmin 里亲眼看见它……这些不是你手生,而是 PostgreSQL 的数据库管理机制比表面看到的严谨得多。它不是文件夹式管理,而是一套有状态、有权限、有连接依赖的运行时系统。我带过二十多期数据工程入门训练营,90% 的初学者第一次实操翻车,都出在对“数据库”这个概念的理解偏差上:他们以为数据库是静态容器,其实它是一个被 PostgreSQL 后台进程动态维护的、带独立事务日志和系统目录的逻辑命名空间。你创建的不是“一个空文件夹”,而是一个注册进pg_database系统表、分配了 OID、初始化了pg_catalog模式、并默认启用publicschema 的完整运行单元。这也是为什么删除前必须确保无活跃连接——不是防误删,而是 PostgreSQL 在设计上就禁止对正在服务请求的数据库执行结构变更。本篇不讲 SQL 语法,只聚焦这三件最基础却最容易踩坑的事:创建、删除、选择数据库。我会从底层原理出发,拆解 pgAdmin 图形界面背后调用了哪些系统命令,解释 psql 中每个反斜杠命令的真实含义,告诉你为什么有些操作必须用超级用户、哪些参数看似可选实则关键、以及当界面卡住或命令报错时,该去查哪张系统表、看哪个日志段。所有内容均基于 PostgreSQL 15+ 生产环境实测,配置项、错误码、日志路径全部给出真实可复现的细节。

2. 核心设计逻辑与方案选型:图形界面 vs 命令行,到底该信谁?

2.1 为什么必须同时掌握 pgAdmin 和 psql?——两种工具的本质差异

很多教程会说“用 pgAdmin 更直观,适合新手”,这话只对了一半。pgAdmin 是一个基于 Web 的客户端,它本身不执行任何数据库操作,而是通过向 PostgreSQL 后端发送标准 SQL 或调用管理函数来间接完成任务。当你在 pgAdmin 里右键“New Database…”并点击 OK,它实际发出的是一条类似这样的 SQL:

CREATE DATABASE "myapp_dev" WITH OWNER = postgres ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TABLESPACE = pg_default CONNECTION LIMIT = -1;

而 psql 是 PostgreSQL 官方提供的交互式终端客户端,它直接与数据库后端建立 TCP 连接,所有\开头的元命令(如\l,\c)都是 psql 自己解析并转换为对应 SQL 或协议指令的。比如\c mydb并非发送USE mydb;(PostgreSQL 根本没有这个语法),而是 psql 主动断开当前连接,并用新的数据库名重新发起一次连接请求。

提示:pgAdmin 的“友好”是有代价的。它会自动帮你填充大量默认参数(如LC_COLLATE),而这些参数一旦设错,后期几乎无法修改——你不能 ALTER DATABASE 修改排序规则。但 psql 不会替你做决定,它把选择权完全交给你。所以我的建议是:创建数据库时,先用 psql 手动执行 CREATE 命令,确认参数无误后再用 pgAdmin 做日常管理;删除数据库时,永远优先用 psql 配合强制终止连接,因为 pgAdmin 的“Drop”菜单项不会提示你当前有哪些连接正占用该库。

2.2 “创建数据库”背后的三重校验机制

PostgreSQL 创建数据库并非简单写入磁盘,它要完成三个层面的原子性保障:

  1. 系统目录层校验:检查pg_database系统表中是否已存在同名记录,同时验证pg_authid中指定的OWNER用户是否存在且具备CREATEDB权限;
  2. 文件系统层校验:根据data_directory配置,检查目标表空间(通常是pg_default)是否有足够空间,并尝试在$PGDATA/base/目录下创建以新库 OID 命名的子目录;
  3. 模板库克隆层校验:PostgreSQL 不从零初始化库,而是以template1为蓝本进行物理复制。这意味着template1中预装的扩展、自定义函数、甚至被误删的publicschema 都会被继承。如果你曾往template1里加过东西,所有新建库都会带上——这是生产环境最常被忽视的隐患。

我去年帮一家电商公司排查慢查询问题,发现新创建的分析库比预期多出 37 张视图,追查下来竟是 DBA 早先为调试方便,在template1里创建了测试视图,却忘了清理。所以,创建数据库前的第一件事,永远是检查template1的干净程度

# 连接到 template1(需超级用户) psql -U postgres -d template1 # 查看 template1 中非系统对象 SELECT n.nspname AS schema_name, c.relname AS object_name, c.relkind FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname NOT IN ('pg_catalog', 'information_schema') AND c.relkind IN ('r', 'v', 'm', 'S', 'f', 'p') ORDER BY n.nspname, c.relname;

如果返回非空结果,说明template1已被污染,此时应重建或清空它(DROP SCHEMA public CASCADE; CREATE SCHEMA public;),否则所有后续新建库都将继承这些冗余对象。

2.3 “删除数据库”为何如此苛刻?——连接、锁、事务的三重枷锁

PostgreSQL 删除数据库的限制远比 MySQL 严格,根本原因在于其 MVCC(多版本并发控制)架构的设计哲学:数据库是事务快照的根节点,而非数据文件的集合。只要有一个后端进程(backend process)正在该库内执行查询、持有锁、或处于事务中,该库的全局状态就不可变。DROP DATABASE要求该库处于“完全静默”状态,即:

  • 无任何活跃连接(包括空闲连接idle状态也算);
  • 无任何未提交事务(即使只是BEGIN; SELECT 1;COMMIT);
  • 无任何后台进程(如pg_stat_activitybackend_type = 'client backend'之外的background workerlogical replication worker)。

pgAdmin 的“Delete/Drop”菜单项只会发送一条DROP DATABASE mydb;,如果失败,它通常只显示模糊错误:“ERROR: database "mydb" is being accessed by other users”。但它不会告诉你具体是谁、在哪、在干什么。而 psql 可以让你精准定位:

-- 查看所有连接到目标库的进程 SELECT pid, usename, application_name, client_addr, backend_start, state, state_change FROM pg_stat_activity WHERE datname = 'mydb'; -- 强制终止所有连接(超级用户权限) SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb' AND pid <> pg_backend_pid();

注意pid <> pg_backend_pid()这个条件——它排除了你当前执行这条命令的会话自身,避免自杀式操作。这是我在金融客户现场反复验证过的安全写法,漏掉它会导致你的 psql 会话被意外中断。

3. 实操全流程详解:从零开始创建、验证、删除、切换数据库

3.1 创建数据库:不止是填个名字,参数选择决定未来三年运维成本

我们以创建一个名为analytics_prod的生产分析库为例,全程使用 psql 执行,拒绝黑盒操作:

步骤 1:连接到 template1 或 postgres 库(必须是超级用户)
# 使用安装时设置的超级用户(通常是 postgres) psql -U postgres -d postgres # 输入密码后进入 psql 提示符 postgres=#
步骤 2:执行 CREATE DATABASE 命令,逐参数解析
CREATE DATABASE analytics_prod WITH OWNER = etl_user -- 指定库所有者,非超级用户也可,但该用户必须存在且有 CREATEDB 权限 ENCODING = 'UTF8' -- 强烈建议固定为 UTF8,避免中文乱码。若设为 LATIN1,后期无法更改 LC_COLLATE = 'zh_CN.UTF-8' -- 排序规则,影响 ORDER BY、索引排序。中国区推荐 zh_CN.UTF-8 LC_CTYPE = 'zh_CN.UTF-8' -- 字符分类规则,影响大小写转换、正则匹配。必须与 LC_COLLATE 一致 TABLESPACE = pg_default -- 表空间,决定数据文件存放位置。生产环境建议单独创建表空间挂载到 SSD CONNECTION LIMIT = 100 -- 连接数上限,防止应用泄漏连接拖垮整个实例。0 表示无限制(危险!) TEMPLATE = template0; -- 关键!指定 template0 而非默认 template1,确保绝对干净(无用户对象)

注意:TEMPLATE = template0是生产环境黄金准则。template0是只读模板,永远不会被用户修改,保证每次新建库都是纯净起点。而template1是可写的,极易被污染。我见过太多团队因忽略此参数,导致新库上线即报“relation 'xxx' does not exist”,根源竟是template1里少了个 schema。

步骤 3:验证创建结果与底层状态

创建成功后,不要急着连,先查系统表确认:

-- 查看 pg_database 中新库记录 SELECT datname, datowner, encoding, datcollate, datctype, dattablespace, datconnlimit FROM pg_database WHERE datname = 'analytics_prod'; -- 查看其 OID(用于定位文件系统路径) SELECT oid FROM pg_database WHERE datname = 'analytics_prod'; -- 返回类似 16385,则其数据目录为 $PGDATA/base/16385/

此时,你可以用系统命令验证文件系统是否已生成:

# 假设 PGDATA=/var/lib/postgresql/15/main ls -l /var/lib/postgresql/15/main/base/16385/ # 应看到类似 112/113/114 等数字命名的文件,代表内部数据文件
步骤 4:连接并初始化 schema
-- 断开当前连接,用新库名重连 \c analytics_prod -- 创建业务 schema(避免污染 public) CREATE SCHEMA IF NOT EXISTS dw AUTHORIZATION etl_user; -- 设置搜索路径,让 dw 优先于 public ALTER DATABASE analytics_prod SET search_path TO dw, public; -- 验证 SHOW search_path; -- 返回:dw, public

实操心得:永远为生产库显式设置search_path。PostgreSQL 默认搜索路径是$user, public,意味着它会先找与用户名同名的 schema。如果etl_user没有同名 schema,就会 fallback 到public,而public是所有用户默认可写的,极易引发命名冲突和权限混乱。我经手的 7 个数据平台迁移项目,有 4 个因未设search_path导致 BI 工具报表突然找不到表,查了半天才发现是某个开发在public下建了同名临时表。

3.2 删除数据库:安全删除的四步法,杜绝“删库跑路”事故

假设analytics_prod测试完毕,需彻底删除。按以下顺序操作,缺一不可:

步骤 1:确认无任何外部连接
-- 再次检查,确保万无一失 SELECT pid, usename, application_name, client_addr, backend_start, state FROM pg_stat_activity WHERE datname = 'analytics_prod' AND state <> 'idle'; -- 若返回空集,继续;否则先终止
步骤 2:终止所有残留连接(含 idle)
-- 终止所有连接,包括 idle 状态 SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'analytics_prod';
步骤 3:执行 DROP(必须在 postgres 库下执行)
-- 不能在 analytics_prod 库内执行 DROP!必须先切回其他库 \c postgres -- 执行删除 DROP DATABASE analytics_prod;

注意:DROP DATABASE命令只能在其他数据库上下文中执行。如果你当前就在analytics_prod里,会报错ERROR: cannot drop the currently open database。这是硬性限制,不是 bug。pgAdmin 的“Drop”菜单会自动帮你切库,但 psql 不会,你必须手动\c postgres

步骤 4:清理文件系统(可选,但推荐)

虽然DROP DATABASE会自动删除$PGDATA/base/下对应 OID 的目录,但某些极端情况(如磁盘满导致删除中断)可能残留。手动清理更安心:

# 获取 OID SELECT oid FROM pg_database WHERE datname = 'analytics_prod'; # 删除对应目录(需 postgres 系统用户权限) sudo rm -rf /var/lib/postgresql/15/main/base/16385/ # 清理 pg_tablespace(如果用了非默认表空间) SELECT spcname, pg_tablespace_location(oid) FROM pg_tablespace;
步骤 5:验证删除彻底性
-- 查询 pg_database SELECT datname FROM pg_database WHERE datname = 'analytics_prod'; -- 应返回空 -- 尝试连接(应失败) \c analytics_prod -- 返回 FATAL: database "analytics_prod" does not exist

实操心得:我坚持在删除后执行一次VACUUM FULL pg_database;。虽然pg_database表很小,但DROP DATABASE只是标记删除,VACUUM才真正回收空间并更新统计信息。这能避免后续SELECT * FROM pg_database返回陈旧数据(极罕见但存在)。这不是官方要求,而是我十年 DBA 养成的肌肉记忆。

3.3 选择(连接)数据库:\c命令的隐藏参数与连接池陷阱

psql中的\c看似简单,实则暗藏玄机。它的完整语法是:

\c [dbname] [username] [host] [port] [options]
场景 1:基础连接(最常用)
\c analytics_prod -- 等价于 \c analytics_prod postgres localhost 5432 -- 使用当前 psql 启动时的用户、主机、端口
场景 2:跨用户连接(权限调试必备)
\c analytics_prod report_user -- 以 report_user 身份连接 analytics_prod 库,验证其权限是否正确 -- 如果 report_user 没有 CONNECT 权限,会报错:FATAL: permission denied for database "analytics_prod"
场景 3:指定主机/端口(多实例调试)
# 连接本地另一个 PostgreSQL 实例(端口 5433) psql -U postgres -p 5433 # 在 psql 内切换到该实例的库 \c - - localhost 5433 -- 第一个 - 表示保持当前 dbname,第二个 - 表示保持当前 username
场景 4:连接字符串方式(绕过 .pgpass 限制)
\c "host=localhost port=5432 dbname=analytics_prod user=etl_user password=mypass sslmode=disable"

注意:密码明文写在命令里不安全,仅用于调试。生产环境务必用.pgpass文件。

最致命的陷阱:连接池导致的\c失效

很多开发者用psql连接了应用使用的连接池(如 PgBouncer),然后执行\c,发现库名变了但数据没变——因为 PgBouncer 的pool_mode = transaction会将多个\c请求路由到同一个后端连接,而 PostgreSQL 后端连接一旦建立,其current_database()就固定了。此时\c只是 psql 的本地状态切换,后端实际没换库。

验证方法:

-- 执行 \c 后,立即查当前库 SELECT current_database(), pg_backend_pid(); -- 如果 pid 不变,但 current_database() 显示新库名,说明是连接池代理 -- 此时需直连 PostgreSQL 后端(绕过 PgBouncer)才能真正切换

4. 常见问题与实战排障:那些文档里不会写的血泪教训

4.1 创建失败十大原因及精准定位法

错误现象根本原因快速诊断命令解决方案
ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)模板库编码与目标不兼容SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = 'template1';创建时显式指定TEMPLATE = template0
ERROR: database "xxx" already exists库名重复\l查看所有库\c连上后DROP DATABASE xxx;或改名
ERROR: permission denied to create database当前用户无 CREATEDB 权限SELECT rolcreatedb FROM pg_roles WHERE rolname = current_user;用超级用户执行ALTER USER username CREATEDB;
ERROR: invalid locale name: "zh_CN.UTF-8"系统未安装对应 locale`locale -agrep "zh_CN.utf8"`
ERROR: could not access file "$share_directory/extension/plpgsql.control": No such file or directorytemplate0 损坏SELECT * FROM pg_available_extensions WHERE name = 'plpgsql';重装 PostgreSQL 或从备份恢复 template0
FATAL: remaining connection slots are reserved for non-replication superuser connections连接数超限SHOW max_connections; SELECT count(*) FROM pg_stat_activity;增大max_connections或终止闲置连接
ERROR: database "xxx" is being accessed by other users有活跃连接SELECT * FROM pg_stat_activity WHERE datname='xxx';SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='xxx';
ERROR: permission denied for tablespace "fast_ssd"表空间权限不足SELECT spcname, pg_get_userbyid(spcowner) FROM pg_tablespace;ALTER TABLESPACE fast_ssd OWNER TO postgres;
ERROR: new collation (zh_CN.UTF-8) is incompatible with the collation of the template database (en_US.UTF-8)模板库 collate 与目标不一致SELECT datcollate FROM pg_database WHERE datname = 'template1';CREATE DATABASE ... TEMPLATE = template0 LC_COLLATE = 'zh_CN.UTF-8';
ERROR: could not change permissions of directory "/var/lib/postgresql/15/main/base/16385": Permission denied文件系统权限错误ls -ld /var/lib/postgresql/15/main/base/sudo chown -R postgres:postgres /var/lib/postgresql/15/main/

实操心得:我把这张表打印出来贴在工位旁。每次创建失败,不看报错文字,直接按表第一列“错误现象”快速匹配,30 秒内定位根因。比反复 Google 报错信息高效十倍。其中第 4 条(locale 问题)在 macOS 上尤其高频,因为 Homebrew 安装的 PostgreSQL 默认 locale 是C,而zh_CN.UTF-8需要额外配置。

4.2 删除卡死的五种状态及对应解法

DROP DATABASE卡住不动,不是命令错了,而是 PostgreSQL 正在等待某个资源释放。用以下命令组合诊断:

状态 1:state = 'active'wait_event = 'ClientRead'
  • 含义:有客户端连接发来请求,但还没读完(网络延迟或客户端崩溃)
  • 解法SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='xxx' AND state='active';
状态 2:state = 'idle in transaction'backend_xid IS NOT NULL
  • 含义:有事务开启但未提交/回滚,持有行锁或表锁
  • 解法:先查锁SELECT * FROM pg_locks WHERE database = (SELECT oid FROM pg_database WHERE datname='xxx');,再终止pg_terminate_backend(pid)
状态 3:backend_type = 'background worker'state = 'active'
  • 含义:逻辑复制、并行查询等后台进程占用
  • 解法SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE datname='xxx' AND backend_type='background worker';
状态 4:wait_event = 'Lock'locktype = 'object'
  • 含义:被其他库的对象锁阻塞(如ANALYZE正在扫描该库的系统表)
  • 解法:查阻塞源SELECT blocked_locks.pid AS blocked_pid, blocking_locks.pid AS blocking_pid FROM pg_catalog.pg_locks blocked_locks 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.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid != blocked_locks.pid WHERE NOT blocked_locks.granted;,再终止阻塞进程。
状态 5:state = 'disabled'backend_type = 'client backend'
  • 含义:连接被pg_hba.conf规则拒绝,但进程未退出
  • 解法:重启 PostgreSQL 服务sudo systemctl restart postgresql,或修改pg_hba.confSELECT pg_reload_conf();

实操心得:我写了一个一键诊断脚本db_drop_diag.sh,把上述所有查询封装成函数,输入库名自动输出所有阻塞源和终止命令。它救了我至少 37 次线上紧急删库需求。脚本核心逻辑就是循环调用pg_stat_activitypg_locks,绝不依赖任何第三方工具。

4.3 连接切换失效的三大幻觉及破除方法

幻觉 1:“\c 成功了,但 SELECT * FROM pg_tables 返回的还是旧库的表”
  • 真相:你连接的是连接池(PgBouncer),\c只是 psql 本地状态,后端连接未变
  • 破除SELECT inet_server_addr(), inet_server_port();查后端地址,若与psql启动地址不同,说明走了代理。直连后端:psql -h 127.0.0.1 -p 5432 -U postgres -d newdb
幻觉 2:“\c 新库后,\dt 显示 no relations,但我知道里面有表”
  • 真相search_path未包含该库的 schema,或表在非publicschema 下
  • 破除SHOW search_path;+SELECT current_schema();+SELECT nspname FROM pg_namespace;,然后\dt dw.*显式指定 schema
幻觉 3:“\c 一直卡住,光标不动”
  • 真相:DNS 解析失败或网络防火墙拦截
  • 破除time psql -h localhost -U postgres -d postgres -c '\q'测试基础连通性;若超时,改用127.0.0.1替代localhost(绕过 DNS);检查pg_hba.conf是否允许127.0.0.1/32md5认证

最后分享一个小技巧:我所有的生产环境服务器,都在/etc/profile.d/pgenv.sh里定义了别名:

alias psql-prod='psql -h 10.10.20.5 -p 5432 -U prod_admin -d postgres' alias psql-staging='psql -h 10.10.20.6 -p 5432 -U staging_admin -d postgres'

这样输入psql-prod就直连生产库,psql-staging直连预发库,永不手抖输错-h。这个习惯让我连续五年没发生过“连错库删错表”的事故。

http://www.rkmt.cn/news/1535227.html

相关文章:

  • Hermes Agent:开源可进化的AI工作伙伴操作系统
  • 聚焦F4星环保与人性化设计 松盛优住为长三角家庭提供专业适老化装修方案 - 博客万
  • 3分钟搞定Figma中文界面!设计师必备的界面汉化神器
  • Gemini CLI:面向开发者的上下文感知工程代理
  • 2026年6月16日海安车灯维修本地走访记:灯罩老化程度和处理方式先核对哪几项 - Ayu8888
  • 2026年中山企业老板力荐专利申请与无效律师 5位实战精选 - 本地品牌推荐
  • 一文讲清,MES系统是什么意思?全面解析MES系统的核心功能
  • 2026:郫都专业除甲醛公司深度测评,甲醛检测治理怎么选?多项实测对比推荐成都肃醛环保科技有限公司 - 专注室内空气检测治理
  • 本地 RAG 检索器:加载 FAISS 索引并实现语义搜索
  • Debian滚动更新实践:Rolling Ridley混合发布架构
  • 2026年 木托盘厂家推荐榜单:松木/免熏蒸/出口木托盘与IPPC热处理实力品牌大全 - 品牌发掘
  • 榆林黄金回收怎么选靠谱商家 避坑实操干货 - 余生黄金回收
  • Gemini 3.5 Flash API 实测指南:绕过UI限制的工程化接入方法
  • 2026年6月马鞍山机械刀片厂家推荐:锯齿刀片/包装机/印刷机刀片优选指南 - 海棠依旧大
  • 2026昆明卖黄金避坑全指南 教你分辨正规回收商家与套路 - 润富黄金回收
  • 2026年6月贵州包车游旅行社推荐:十大排名家庭包车防套路评测专业价格 - 品牌推荐
  • 榆林旧黄金回收避坑指南 看懂行情不被乱扣费 - 余生黄金回收
  • Product Group Reference Article 在 SAP Retail 商品主数据中的设计逻辑与落地边界
  • GPT-5.5 Instant:大模型事实对齐与幻觉抑制的工程化实践
  • 2026年取暖炉具加工厂推荐:煤炉/柴炉/电炉/回风炉/电暖炉家用商用全覆盖 - 海棠依旧大
  • 2026:温江室内除异味、甲醛治理专业度横向测评,多家服务商技术与落地能力比拼,优先选择成都肃醛环保 - 专注室内空气检测治理
  • 2026.6 南宁润滑油、轴承批发商家实力排行榜(权威测评版) - 星际AI
  • 2026年承插法兰、承插弯头、承插三通、承插隔膜阀厂家推荐榜:承插焊不锈钢球阀/锻钢止回阀/高压球阀/管件品牌优选 - 品牌发掘
  • 2026年6月邢台黄金回收行情解读与商家筛选技巧 - 余生黄金回收
  • Steam创意工坊下载神器WorkshopDL:无需Steam账号轻松获取游戏模组
  • Python性能验证利器:timeit模块原理与工程实践
  • Mac窗口置顶终极指南:Topit如何3分钟提升你的工作效率
  • 2026年沈阳建筑器材租赁服务商推荐:脚手架/钢管/围挡/钢支撑租赁 - 海棠依旧大
  • [论文学习]LLM 代理长程记忆安全调查:迈向记忆主权(Mnemonic Sovereignty)-攻击、防御与全生命週期治理框架
  • 从BabyRSA到RSA安全:小素数攻击原理与实战防御