1. 项目概述为什么要在Ubuntu上部署DM8最近在帮一个做数据分析的朋友搭建测试环境他那边有个项目需要用到国产数据库。聊了一圈最后锁定了达梦数据库DM8。他那边开发机清一色都是Ubuntu所以很自然地任务就变成了在Ubuntu系统上把DM8给装起来、跑起来。你可能要问为什么是DM8又为什么是Ubuntu这其实反映了一个挺普遍的场景越来越多的开发团队尤其是那些拥抱开源技术栈的会选择Ubuntu作为主力开发或测试环境。它轻量、包管理方便、社区资源丰富。而DM8作为一款成熟的企业级国产关系型数据库在金融、政务、能源这些对数据安全、自主可控有高要求的行业里应用越来越广。当这两个需求碰撞在一起——在开源的Ubuntu上部署商业的国产数据库——就成了一道很多工程师都会遇到的“家常菜”。这活儿听起来就是执行个安装脚本但真动起手来你会发现从系统准备、用户权限、参数调整到最后的初始化配置每一步都有不少细节。网上能找到的官方文档或零散教程要么是面向CentOS/RedHat的要么步骤跳跃太大对新手不友好。今天我就把自己在Ubuntu 20.04 LTS上完整部署DM8的过程连同踩过的坑和总结的经验从头到尾捋一遍。目标很明确让你看完之后能拿着一份清晰的“操作手册”在自己的Ubuntu环境里一次搞定DM8的安装和基础部署。2. 部署前的核心准备工作兵马未动粮草先行。在真正运行安装程序之前充分的准备工作能避免至少80%的后续问题。这一部分我们分三步走检查系统环境、规划安装路径与用户、获取安装包。2.1 系统环境检查与依赖安装DM8对操作系统环境有一定要求虽然官方主要支持RedHat系列但在Ubuntu上经过适配也能稳定运行。首先用命令确认一下系统架构和版本# 查看系统版本和内核信息 lsb_release -a uname -m输出通常会显示类似Ubuntu 20.04.6 LTS和x86_64即64位系统。DM8支持x86_64和aarch64架构主流的Ubuntu桌面或服务器版都没问题。接下来是关键一步安装运行DM8所必需的系统库。Ubuntu和RedHat的包名有些差异需要手动转换。缺少这些库安装程序或数据库服务可能无法启动。# 更新软件包列表 sudo apt-get update # 安装核心依赖库 sudo apt-get install -y libaio1 libaio-dev sudo apt-get install -y libncurses5 sudo apt-get install -y libtinfo5 sudo apt-get install -y net-tools # 用于网络工具如ifconfig可选但建议这里重点说一下libaio。DM8数据库引擎在数据读写时会使用异步I/OAIO来提升性能特别是在高并发写入场景下。libaioLinux Asynchronous I/O这个库就是提供底层异步I/O支持的。如果没有安装数据库实例在启动时可能会报错或者无法启用最优的I/O模式。libncurses5和libtinfo5则是为了支持安装程序DMInstall.bin的文本图形界面TUI能正常显示。注意如果你使用的是Ubuntu 22.04或更新版本某些库的版本可能更高。如果遇到兼容性问题可以尝试安装兼容包或从旧版本仓库中获取指定版本。一个实用的技巧是先尝试安装如果报错提示找不到包可以使用apt-cache search来查找替代包名。最后检查一下系统资源。虽然测试环境要求不高但建议至少保证2GB可用内存和10GB的磁盘空间。可以用free -h和df -h命令查看。2.2 规划安装目录与专用用户在生产环境或规范的测试环境中绝不建议直接使用root用户来安装和运行数据库。最佳实践是创建一个专用的系统用户和用户组。# 创建dinstall用户组和dmdba用户 sudo groupadd dinstall sudo useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba # 为dmdba用户设置密码 sudo passwd dmdba这里dinstall是组名dmdba是用户名。-m和-d参数确保创建了家目录/home/dmdba。使用专用用户的好处是权限隔离安全且便于管理。接下来规划安装目录。我习惯将数据库软件和数据库数据文件分开存放结构清晰。假设我们准备一个大容量分区挂载在/dm8下。# 创建顶层目录如果已有其他分区如/data也可挂载在那里 sudo mkdir -p /dm8 # 在/dm8下创建软件安装目录和数据文件目录 sudo mkdir -p /dm8/install sudo mkdir -p /dm8/data # 将目录所有权赋予dmdba用户和dinstall组 sudo chown -R dmdba:dinstall /dm8 # 设置目录权限确保dmdba用户有完整权限 sudo chmod -R 755 /dm8目录结构规划如下/dm8/install 用于存放DM8安装程序和解压后的软件。安装完成后数据库的二进制文件、工具和脚本也会在这里。/dm8/data 这是后续创建数据库实例时存放所有数据文件、控制文件、重做日志文件、归档日志的核心区域。务必保证此目录有充足且稳定的磁盘空间和IO性能。2.3 获取安装包与上传从达梦官方网站下载对应你系统架构x86_64的DM8安装包。通常是一个以.iso为后缀的镜像文件例如dm8_20231011_x86_rh6_64.iso。虽然文件名带“rh6”RedHat 6但在Ubuntu上同样可用。下载后需要将安装包上传到Ubuntu服务器的/dm8/install目录。你可以使用scp命令本地操作或通过SFTP工具如FileZilla上传。# 假设你在本地终端安装包在本地当前目录 scp dm8_20231011_x86_rh6_64.iso dmdba你的服务器IP:/dm8/install/上传完成后切换到dmdba用户来执行后续所有操作避免权限混乱。# 切换用户 su - dmdba # 输入刚才为dmdba设置的密码现在我们进入/dm8/install目录挂载ISO镜像文件。cd /dm8/install # 创建挂载点 mkdir -p ./mnt # 挂载ISO文件。注意普通用户挂载需要sudo或者让root先挂载好。 sudo mount -o loop dm8_20231011_x86_rh6_64.iso ./mnt # 查看挂载内容 ls -la ./mnt/你会看到DMInstall.bin这个可执行文件这就是图形化安装程序。此外还有一些依赖包和文档。3. 图形化安装与静默安装详解DM8提供了两种安装方式图形化GUI安装和命令行静默安装。图形化安装直观适合第一次安装或在有桌面环境的系统上操作。静默安装则通过响应文件自动化完成适合批量部署或运维脚本集成。这里我们两种方式都详细说明。3.1 图形化安装步骤实操首先确保你当前是以dmdba用户身份并且位于/dm8/install目录下。图形化安装需要系统支持图形界面。如果是在纯命令行服务器上你需要配置X11转发或者直接使用静默安装。# 进入挂载目录 cd /dm8/install/mnt # 给安装程序添加执行权限 chmod x DMInstall.bin # 启动图形化安装程序 ./DMInstall.bin如果一切正常会弹出一个蓝白风格的安装向导窗口。选择语言第一步是选择安装语言中文或英文根据喜好选择即可。欢迎页面直接点击“下一步”。许可证协议必须阅读并接受协议才能继续。Key文件如果你有有效的授权Key文件.key在此处加载。如果是试用或开发可以选择“没有Key文件”通常有60天或一年的试用期。选择安装方式建议选择“典型安装”。典型安装包含了服务器、客户端、管理工具等全套组件适合绝大多数场景。“精简安装”只装最核心的服务器组件。选择安装目录这是最关键的一步点击“浏览”选择我们之前规划好的软件安装目录/dm8/install/dmdbms。注意安装程序会自动在指定路径后添加dmdbms。因此我们浏览到/dm8/install目录然后手动在路径输入框里确认最终路径是/dm8/install/dmdbms。这样所有二进制文件、库文件、脚本都会安装到这个目录下。确认安装信息安装程序会总结你的选择检查无误后点击“安装”。安装过程此时安装程序开始复制文件根据机器性能通常需要1-3分钟。初始化数据库文件复制完成后会弹出一个提示框询问“是否初始化数据库”。这里我强烈建议选择“否”。我们将安装和初始化分为两个独立的步骤。因为初始化数据库即创建初始实例需要配置大量参数端口、路径、大小等在图形化安装的最后一步进行配置界面空间有限且一旦出错不易调整。我们更倾向于使用专用的dminit工具在命令行进行更精细的控制。安装完成点击“完成”退出安装向导。安装完成后需要以root身份执行两个脚本来完成最后的配置。# 退出dmdba用户回到root或使用sudo exit # 执行root脚本 cd /dm8/install/dmdbms/script/root sudo ./root_installer.sh这个脚本会创建必要的系统服务DmService和链接。执行成功后DM8的软件安装部分就全部完成了。3.2 静默安装配置与执行对于没有图形界面或需要自动化部署的环境静默安装是唯一选择。其核心是一个dm_install.xml响应文件里面用XML格式定义了所有安装选项。首先我们需要从安装介质中提取或自己编写这个响应文件。在挂载的ISO目录的silent_install子目录下通常有模板。# 切换到dmdba用户 su - dmdba cd /dm8/install/mnt/silent_install cp dm_install.xml /tmp/dm_install_custom.xml然后编辑这个自定义的XML文件。你需要修改以下几个关键参数?xml version1.0 encodingUTF-8? DATABASE !-- 安装程序的完整路径 -- INSTALL_PATH/dm8/install/dmdbms/INSTALL_PATH !-- 选择安装类型 TYPICAL(典型), COMPACT(精简) -- INSTALL_TYPETYPICAL/INSTALL_TYPE !-- Key文件路径没有则留空 -- KEY/KEY !-- 是否创建实例我们选择否后续手动初始化 -- INIT_DB0/INIT_DB !-- 时区中国一般用08:00 -- TIME_ZONE08:00/TIME_ZONE !-- 安装语言 -- LANGUAGEzh_CN/LANGUAGE !-- 字符集通常选择UTF-8或GB18030 -- CHARSETUTF-8/CHARSET !-- 是否创建桌面快捷方式服务器环境选0 -- DESKTOP_SHORTCUT0/DESKTOP_SHORTCUT !-- 服务注册相关服务器环境选1 -- SERVICE1/SERVICE /DATABASE保存文件后使用以下命令执行静默安装cd /dm8/install/mnt ./DMInstall.bin -q /tmp/dm_install_custom.xml参数-q指定了响应文件的路径。安装程序会读取该文件自动完成所有步骤无需人工干预。安装完成后同样需要以root身份执行root_installer.sh脚本。实操心得无论用哪种方式安装完成后务必检查安装目录。进入/dm8/install/dmdbms/bin查看是否存在dmserver数据库服务程序、disql命令行工具、dminit初始化工具等关键文件。用./dmserver --version可以快速查看数据库版本确认安装成功。4. 数据库实例初始化与参数优化软件安装好比盖好了房子框架初始化数据库则是按照你的户型图进行内部装修和布置让它变成一个真正可以“住人”存储数据的家。这一步我们使用命令行工具dminit它比图形化向导更灵活、更强大。4.1 dminit工具关键参数解析切换到dmdba用户进入安装目录的bin文件夹su - dmdba cd /dm8/install/dmdbms/bin首先我们可以通过./dminit HELP查看所有参数说明。这里我挑出最核心、必填或强烈建议修改的参数来解释参数名缩写默认值含义与建议PATH无当前目录数据文件存放的根目录。这就是我们之前规划的/dm8/data。务必指定。CASE_SENSITIVECASEY标识符大小写敏感。Y表示表名、列名等区分大小写兼容Oracle习惯N表示不区分兼容MySQL习惯。根据你的应用开发习惯选择一旦初始化无法更改。CHARSET无0字符集。0代表GB18030国产标准1代表UTF-8。强烈建议选1(UTF-8)兼容性最好避免乱码。LENGTH_IN_CHARL_IN_CHAR0VARCHAR类型长度单位。0表示以字节为单位1表示以字符为单位。对于UTF-8等变长字符集设为1可以更直观。建议1。PORT_NUMPORT5236数据库监听端口。默认5236如果冲突可以修改如5237。防火墙需放行此端口。SYSDBA_PWD无SYSDBA系统管理员SYSDBA的密码。生产环境必须修改设置一个强密码。SYSAUDITOR_PWD无SYSAUDITOR系统审计员SYSAUDITOR的密码。同样需要修改。DB_NAME无DAMENG数据库名。可以自定义如TESTDB。INSTANCE_NAME无DMSERVER实例名。可以自定义通常与DB_NAME一致或相关。PAGE_SIZE无8数据页大小单位KB。可选8, 16, 32。这是极其重要的参数初始化后无法修改页大小影响单行数据最大长度、索引键长度和IO效率。常规OLTP应用选8或16即可如果表中包含超长文本如CLOB或超大字段可能需要32。LOG_SIZE无256重做日志文件大小单位MB。默认256M。对于有频繁更新的业务可以适当调大如10241G减少日志切换频率。BLANK_PAD_MODE无0空格填充模式。0表示像Oracle一样比较字符串时忽略尾部空格1表示像MySQL一样不忽略。根据应用兼容性选择。4.2 执行初始化命令与结果验证基于以上理解我们可以构造一条初始化命令。假设我们规划如下数据目录/dm8/data数据库名DMDB实例名DMSVR01端口5236字符集UTF-8大小写敏感是页大小16KBSYSDBA密码Dameng123命令如下cd /dm8/install/dmdbms/bin ./dminit PATH/dm8/data DB_NAMEDMDB INSTANCE_NAMEDMSVR01 PORT_NUM5236 CHARSET1 CASE_SENSITIVEY LENGTH_IN_CHAR1 PAGE_SIZE16 LOG_SIZE1024 SYSDBA_PWDDameng123 SYSAUDITOR_PWDAuditor123执行后如果一切顺利你会看到大段的“INFO”日志最后出现“init dm database success”。这表示初始化成功了。现在去数据目录/dm8/data下查看会发现生成了DMDB数据库名子目录里面包含了控制文件dm.ctl、数据文件SYSTEM.DBF、ROLL.DBF、重做日志文件DAMENG01.log、DAMENG02.log以及配置文件dm.ini和dmmal.ini等。这些文件共同构成了你的数据库实例。注意事项dminit命令中的PATH参数指定的目录必须为空或者不存在工具会自动创建。如果目录已存在且非空初始化会失败。因此专门规划一个干净的/dm8/data目录非常有必要。5. 注册系统服务与启动管理手动启动数据库服务需要进入目录执行命令不适合生产环境。我们需要将其注册为系统服务实现开机自启和便捷的启停管理。5.1 服务脚本生成与配置DM8安装后在script/root目录下提供了服务管理脚本模板。但更常用的方法是使用dm_service_installer.sh工具它能自动生成适配当前系统的服务脚本。首先我们需要知道数据库实例的完整路径和启动参数。关键信息都记录在数据目录下的dm.ini配置文件中。但生成服务脚本时我们主要关心以下几点DmService服务名 我们自定义例如DmServiceDMSVR01数据库实例路径/dm8/data/DMDB/dm.ini安装目录DM_HOME/dm8/install/dmdbms切换到root用户执行以下命令sudo su cd /dm8/install/dmdbms/bin ./dm_service_installer.sh -t dmserver -p DMSVR01 -dm_ini /dm8/data/DMDB/dm.ini参数解释-t dmserver: 服务类型表示数据库实例服务。-p DMSVR01: 服务名后缀。最终生成的服务名会是DmServiceDMSVR01。-dm_ini: 指定数据库实例配置文件dm.ini的绝对路径。执行成功后会输出提示信息告知服务脚本已创建到/etc/systemd/system/DmServiceDMSVR01.service对于使用systemd的Ubuntu 20.04。5.2 服务启动、停止与状态检查服务注册好后我们就可以使用标准的systemctl命令来管理它了。# 启动数据库服务 sudo systemctl start DmServiceDMSVR01 # 设置开机自启 sudo systemctl enable DmServiceDMSVR01 # 查看服务状态 sudo systemctl status DmServiceDMSVR01 # 停止数据库服务 sudo systemctl stop DmServiceDMSVR01 # 重启数据库服务 sudo systemctl restart DmServiceDMSVR01当执行status命令时如果看到active (running)的字样并且下方日志显示“DM Database Server xxxx started successfully”就说明数据库实例已经正常启动并监听在指定的端口如5236上了。5.3 防火墙与网络连通性测试服务启动后还需要确保服务器防火墙允许外部连接访问数据库端口。# 查看防火墙状态如果使用ufw sudo ufw status # 如果防火墙开启则添加规则放行5236端口 sudo ufw allow 5236/tcp sudo ufw reload然后我们可以在服务器本机使用DM8自带的命令行工具disql进行连接测试验证服务是否真的可用。# 切换回dmdba用户 su - dmdba cd /dm8/install/dmdbms/bin # 使用disql连接格式为disql 用户名/密码主机:端口 ./disql SYSDBA/Dameng123localhost:5236如果连接成功会进入SQL提示符。可以执行一条简单的测试命令SELECT Hello, DM8! FROM DUAL;如果能正确返回结果那么恭喜你一个完整的DM8数据库实例已经在你的Ubuntu系统上部署成功了。6. 基础配置与连接验证数据库服务跑起来只是第一步就像新车到手需要做一些基础设置一样我们还需要进行一些必要的配置并确保能从外部客户端顺利连接。6.1 关键配置文件dm.ini初探数据库的所有运行参数都集中在数据目录下的dm.ini文件里。作为初学者我们不需要修改所有参数但有几个关乎性能和基础功能的值得了解。# 以dmdba用户查看配置文件 su - dmdba cat /dm8/data/DMDB/dm.ini | grep -E (MEMORY|BUFFER|MAX_SESSIONS)你会看到类似这样的参数MEMORY_TARGET和MEMORY_N_POOLS: 控制数据库使用的总内存大小。在测试环境可以设置为物理内存的50%-70%。修改需要重启服务。BUFFER: 数据缓冲区大小是内存中最关键的区域用于缓存数据页。初始值可能较小可以根据系统内存调整。MAX_SESSIONS: 最大会话数即允许同时连接数据库的客户端数量。默认值可能只有100对于应用连接数较多的场景需要调大。注意修改dm.ini后必须重启数据库服务 (sudo systemctl restart DmServiceDMSVR01) 才能生效。建议初次部署时先使用默认值在压力测试或正式上线前再根据实际情况进行优化调整。6.2 使用管理工具连接DM管理工具对于不习惯命令行的开发者达梦提供了图形化的管理工具——DM管理工具相当于Oracle的SQL Developer或PL/SQL Developer。你需要在Windows或另一台有图形界面的机器上安装此客户端。获取客户端从达梦官网下载Windows版的“DM8开发版”或“DM8管理工具”安装。配置连接打开DM管理工具。点击“新建连接”。连接名自定义如Ubuntu_DM8。主机名填写Ubuntu服务器的IP地址。端口号5236与你初始化时设置的端口一致。用户名SYSDBA。密码你初始化时设置的SYSDBA密码如Dameng123。测试连接点击“测试连接”如果提示成功说明网络、服务、认证都通过了。然后就可以像使用其他数据库GUI工具一样进行建表、写SQL、数据导入导出等操作了。6.3 命令行工具disql的进阶使用disql是运维和开发中最常用的工具。除了基本的连接它还有很多实用功能。执行SQL脚本文件./disql SYSDBA/Dameng123localhost:5236 \/path/to/your_script.sql设置输出格式默认输出可能不整齐可以设置-- 在disql中执行 SET LINESHOW ON; SET PAGESIZE 100; SELECT * FROM V$VERSION;查看系统状态连接后可以查询一些动态视图来了解数据库状态。-- 查看数据库版本和状态 SELECT * FROM V$INSTANCE; -- 查看当前会话 SELECT * FROM V$SESSIONS; -- 查看表空间使用情况 SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 AS SIZE_MB FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME;7. 常见问题与故障排查实录即便按照步骤操作在实际部署中也可能遇到各种问题。这里记录几个我遇到过的典型问题及其解决方法。7.1 安装启动类问题问题1执行./DMInstall.bin时报错 “无法打开显示” 或 “No protocol specified”。原因在纯命令行服务器无图形界面上尝试启动图形化安装程序且未配置X11转发。解决首选方案改用静默安装方式如上文3.2节所述。如果必须图形化可在本地Windows使用Xming等X Server软件并在ssh连接时启用X11转发 (ssh -X userhost)但步骤繁琐不推荐。问题2初始化数据库 (dminit) 失败提示 “创建目录失败” 或 “权限不够”。原因执行dminit命令的用户dmdba对目标数据目录 (/dm8/data) 没有写权限。解决检查目录所有权和权限。ls -ld /dm8/data确保所属用户和组是dmdba:dinstall并且有写权限 (drwxr-xr-x)。如果不是用root修正sudo chown -R dmdba:dinstall /dm8/data sudo chmod -R 755 /dm8/data问题3服务启动失败 (systemctl status显示 failed)查看日志 (/dm8/data/DMDB/log/dm_xxx.log) 报错 “共享内存或信号量申请失败”。原因可能是之前数据库实例未正常关闭残留了共享内存段或信号量或者是系统内核参数设置不足。解决清理残留用ipcs -m和ipcs -s查看共享内存和信号量如果所有者是dmdba用ipcrm命令清理需谨慎最好在确认服务已停止后操作。调整内核参数编辑/etc/sysctl.conf增加或修改以下参数需root权限kernel.shmall 4294967296 kernel.shmmax 68719476736 kernel.sem 5010 641280 5010 128 fs.file-max 6815744执行sysctl -p使配置生效。这些值仅供参考具体需根据服务器内存调整。7.2 连接与访问类问题问题4本地disql可以连接但远程客户端如DM管理工具连接超时。原因最常见的是服务器防火墙未开放端口或数据库监听配置未绑定到所有IP。排查步骤检查防火墙确认Ubuntu的ufw或iptables已放行5236端口见5.3节。检查监听在服务器上使用netstat -tlnp | grep 5236查看监听状态。如果只看到127.0.0.1:5236或::1:5236说明只监听了本地回环地址。需要修改dm.ini中的LISTENER_IP参数。修改监听IP编辑/dm8/data/DMDB/dm.ini找到LISTENER_IP。默认可能是LOCALHOST或空。将其改为0.0.0.0监听所有IPv4地址或服务器的具体IP地址。修改后务必重启数据库服务。问题5连接时提示 “用户名或密码错误”但确认密码无误。原因可能开启了密码策略如失败次数限制导致账户锁定或者密码含有特殊字符在命令行中转义有问题。解决尝试用最简单的密码如全部数字在disql中连接排除特殊字符问题。以SYSDBA登录后检查用户状态SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE FROM DBA_USERS WHERE USERNAMESYSDBA;如果ACCOUNT_STATUS是LOCKED则需要解锁ALTER USER SYSDBA ACCOUNT UNLOCK;7.3 性能与运行类问题问题6数据库运行一段时间后响应变慢。可能原因与排查检查磁盘空间df -h查看/dm8/data所在分区是否已满。数据库写满会导致所有写操作挂起。检查日志文件重做日志文件过小导致频繁切换或归档日志未清理占满空间。查看dm.ini中LOG_SIZE和归档路径ARCH_INI、ARCH_DEST相关配置。检查内存使用连接数据库查看内存池状态SELECT * FROM V$MEM_POOL;如果MAX_SIZE和TOTAL_SIZE接近说明内存配置可能不足。检查锁等待执行SELECT * FROM V$LOCK;和SELECT * FROM V$TRXWAIT;查看是否有长时间未释放的锁或事务等待。问题7如何备份与还原冷备份离线停止数据库服务直接拷贝整个数据目录 (/dm8/data/DMDB) 到安全位置。恢复时停止服务用备份目录覆盖原目录再启动服务。最简单粗暴但需要停库。热备份在线使用DM8的DMRMAN恢复管理器或disql中的BACKUP DATABASE命令。例如-- 在disql中执行全量备份 BACKUP DATABASE FULL BACKUPSET /dm8/backup/full_bak_20240520;还原和恢复操作相对复杂需结合归档日志建议查阅官方文档《DM8备份与恢复》。部署DM8的过程就像组装一台精密仪器步骤环环相扣。从系统准备、规划目录、安装软件、初始化实例、注册服务到最终连接验证每一步的细节都决定着最终环境的稳定性和可用性。我个人的体会是“慢就是快”。在准备阶段多花十分钟理解每个参数的含义、规划好目录结构远比在出问题后花费数小时去排查要高效得多。尤其是PAGE_SIZE、CHARSET、CASE_SENSITIVE这些初始化后无法修改的参数一定要根据团队和项目的长期需求慎重决定。最后分享一个小技巧把所有重要的命令、参数、IP端口、密码当然密码要安全存放记录在一个部署文档里。下次再遇到类似环境这份文档就是最好的自动化脚本提纲能帮你节省大量回忆和搜索的时间。毕竟好记性不如烂笔头在运维工作中尤其如此。