ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

DB2 V11.1安装实战:从下载到实例创建与Docker部署避坑指南

DB2 V11.1安装实战:从下载到实例创建与Docker部署避坑指南 简介DB2 V11.1 Linux安装包是IBM企业级关系型数据库在Linux平台上的完整发行版本面向需要在Linux服务器上搭建数据库服务、进行实例配置与日常运维的DBA和系统管理员。压缩包共405个文件、772.77MB包含gz安装包、so动态库、java/jar管理组件、多语言message/mo翻译资源以及db2setup、db2ls、db2prereqcheck等安装检测与配置脚本结构清晰便于按需提取。已有2636人学习下载。借助该包可完成从系统准备、安装类型选择、实例创建到网络监听设置的全流程部署并利用内置的db2pd、db2look等工具进行性能调优、备份恢复与跨平台迁移是Linux环境下上手DB2 V11.1的实用基础资源。1. 拿到 DB2 V11.1 下载为什么装库反而卡在第一步“DB2 V11.1 下载”这几个字在 IBM 文档页、技术论坛里被问得最多但真正卡住人的从来不是点一下下载按钮而是下完之后迷路同一个 V11.1页面上一排安装包不知道选哪个装到一半发现系统缺库启动报 SQL1032N最后只能把安装包扔到一边。这篇就是把 DB2 V11.1 下载之后的路趟一遍选对版本分支、配好运行环境、装出能连能查的实例再用 Docker Desktop 启动 DB2 作为备选路线。适合需要对齐生产环境的 DBA、做数据迁移的乙方工程师以及只想在本机验证 SQL 脚本的开发。2. 下载前把版本和平台选对V11.1 许可边界与运行环境检查2.1 XE、Express-C、企业版V11.1 该选哪一个DB2 V11.1 是 2016 年发布的一个长期支持版本后续还有 11.1.1、11.1.2、11.1.3 等 fix pack。下载时遇到的第一道选择题是同样写着 V11.1到底哪个包是你该下的。按许可和使用目的V11.1 的常见分支可以分成三类。Express-C 是免费版限制是单实例最多 2 个 CPU 核心和 16GB 内存但足够跑通开发、测试、学习以及小型生产企业版按核心付费生产环境的主流选择下载入口在 IBM Passport Advantage 里需要企业账号还有针对特定平台的 XE 版本功能和限制与 Express-C 接近。开发机、实验环境一律选 Express-C别去碰企业版的破解或共享授权文件那是给自己埋雷。选完版本分支还要看平台。V11.1 的安装介质按 Linux、Windows、AIX 分开打包而且同是 Linuxx86_64 和 s390x 的包不通用。下载页上每个安装包的文件名都带平台标识比如 x86_64、ppc64le先确认你机器的架构再点下载否则解压完会直接在安装脚本阶段报错。2.2 下载前先查这 4 项系统信息安装到一半失败最常见的原因不是包选错而是系统环境不满足。我一般在下单安装包之前先把下面几条命令跑一遍存到文本里当作环境基线uname -a cat /etc/os-release ldd --version | head -n 1 free -g df -h /opt逐条说明它的用途。uname -a确认内核版本和 CPU 架构V11.1 对 Linux 内核版本有最低要求太旧的发行版直接装不进去cat /etc/os-release能同时看到发行版名称和版本号这决定了你该用db2_install还是db2setup也决定了响应文件里的参数默认值ldd那行查的是 glibc 版本V11.1 对 glibc 版本敏感如果发行版过新而安装包里的库太老会出现libpam.so找不到一类的崩溃free -g和df -h /opt分别确认空闲内存和磁盘安装位置。DB2 实例一旦建起来/home/db2inst1和数据库路径分区都要预留空间不要把所有数据都堆在根分区。这里有个经验判断V11.1 的安装包默认会往/opt/IBM/db2写入程序文件而实例目录和数据库数据默认落在~db2inst1下。如果/opt和/home是同一个分区且空间紧张装完实例后数据库一创建就会把磁盘占满。2.3 下载介质与包名识别Linux 平台下 V11.1 的安装包通常是一个.tar.gz或.tar文件解压后里面能看到db2setup和db2_install两个可执行文件外加配套的响应文件模板。Windows 平台则是.exe自解压包解压后同样是setup.exe加若干子目录。包名里的v11.1和平台名要对上不要只看文件名带linux就双击。一个常见翻车现场下载了v11.1_linux_s390x的包在 x86 服务器上解压最后db2_install直接提示cannot execute binary file。下载下来的包先做两件事一是比对包体积与页面标注的大小是否一致二是用md5sum或sha256sum做校验。这两步看起来老生常谈但能拦掉九成下载不完整导致的解压报错。V11.1 这种体量的安装包动辄 1GB 起步断点续传的下载工具如果出了问题日志里经常只报一个笼统的gzip: invalid compressed data。提示包名里带expc或express的是 Express-C带ase的是 Advanced Enterprise Server。下载前把包名完整截图保存后面安装、报错、找 fix pack 都要用它做比照。3. 在 Linux 上装出能跑的最小实例响应文件安装与实例创建3.1 用户和组准备实例所有权不能乱DB2 不允许用 root 用户直接启动实例。安装之前要建好两个系统用户一个是实例属主比如db2inst1一个是 fenced 用户用来跑需要隔离的存储过程比如db2fenc1。两个用户分属不同组这是 IBM 文档里的标准布局。groupadd db2iadm1 groupadd db2fadm1 useradd -g db2iadm1 -m -d /home/db2inst1 db2inst1 useradd -g db2fadm1 -m -d /home/db2fenc1 db2fenc1这段命令的逻辑是先建两个组db2iadm1是实例管理组db2fadm1是 fenced 用户组然后分别建用户并指定所属组和家目录。之所以强调这些是因为后面db2icrt创建实例时会直接把实例目录的属主设为db2inst1如果用户家目录不存在或权限不对实例日志里会连续报路径错误。用户建完后可以顺手给db2inst1设置一个密码后续db2 connect和客户端连接都会用到。密码不要设置得太复杂但绝不能为空。3.2 用命令行安装绕开图形界面图形界面的db2setup在本地虚拟机里很方便但在远程服务器上经常因为 X11 转发问题卡住。我一般直接用静默安装脚本命令如下cd /data/db2_setup_v11.1 ./db2_install -b /opt/IBM/db2/V11.1 -p SERVER -l /tmp/db2_install.log-b指定安装目录这是 DB2 程序文件的最终位置-p指定安装产品类型SERVER表示客户端加服务器端完整安装-l把安装日志写进/tmp/db2_install.log。安装过程在后台跑少则五分钟多则二十分钟中途不要 CtrlC。这是一个最小但真实的安装方式不依赖 X11 和交互响应文件。日志文件是关键黑匣子——如果安装中断/tmp/db2_install.log末尾通常写着是哪一步失败最常见的报错是磁盘空间不足、glibc 版本不匹配、缺少libaio或libnuma等运行库。缺库用系统包管理器补上就行装完重跑这个脚本即可。安装完成的标准不是看到安装成功提示而是下面这条命令有输出ls -ld /opt/IBM/db2/V11.1/bin/db2如果这个二进制在再继续下一步不在的话从头查日志。3.3 创建实例、启动服务、验证端口程序文件就位后用db2icrt创建实例。它等同于给 DB2 建立一套独立的进程环境和配置文件/opt/IBM/db2/V11.1/instance/db2icrt -u db2fenc1 db2inst1 su - db2inst1 db2start db2 create database sample-u db2fenc1指定 fenced 用户db2inst1是实例名。db2icrt执行成功后会生成一套实例配置文件路径一般在~/sqllib/db2profile。切到db2inst1用户后再db2start启动成功会返回SQL1063N DB2START processing was successful。db2 create database sample会创建一个用于验证的数据库后续连接测试都用它。启动后有两个必查项。第一实例的通信端口是否注册到系统服务里默认是 50000第二实例是否能够响应本地连接。用下面两行确认db2 get dbm cfg | grep SVCENAME db2 connect to sample user db2inst1SVCENAME返回的是一串名字而不是数字端口这个名字需要能在/etc/services里查到对应端口。如果db2 connect返回SQL1032N说明实例内部的数据库管理服务没有完全起来看~/sqllib/db2dump/db2diag.log找原因。Windows 平台的安装路径不太一样setup.exe跑完向导后会在安装目录下的instance文件夹自动建实例图形界面把用户、端口、实例名全部接管这里不展开。需要留意的是 Windows 上安装完成后必须用 DB2 专属服务而非系统服务管理器启停以及防火墙里要放行 50000 端口。4. Docker Desktop 启动 DB2一条命令跑起 V11.1 的替代路线4.1 为什么要用 Docker环境隔离与后悔药不少团队的实际状态是生产环境用着 DB2 V11.1开发机却是 Windows 或 macOS。V11.1 没有官方 macOS 安装包在 Windows 上装又常和现有数据库服务端口冲突。这时候 Docker Desktop 成了最稳的路径——一个容器把 DB2 的运行环境全部圈起来不再污染宿主机出问题删掉重建秒级获得一颗后悔药。容器方案的缺点也要说明Docker 里的 DB2 不能做 VMware 级别的裸机性能调优适合开发联调和功能验证不适合拿来做压测基准。数据卷如果不挂载容器删除后数据库全部丢失这一点后面会专门讲。4.2 容器启动命令与参数拆解ibmcom/db2express-c是 IBM 官方发布的 Express-C 镜像tag 选择 11.1 系列即可。启动命令如下docker run -d --name db2v11 \ -p 50000:50000 \ -e LICENSEaccept \ -e DB2INSTANCEdb2inst1 \ -e DB2INST1_PASSWORDdb2admin123 \ -v db2data:/database \ --privileged \ ibmcom/db2express-c:11.1.4.4逐个说参数。--name db2v11给容器一个固定名字后续docker logs和docker exec都要靠它定位-p 50000:50000把宿主机端口映射到容器内 DB2 监听端口客户端用localhost:50000就能连接LICENSEaccept必须显式接受许可漏掉的话容器会在启动日志里原地等确认DB2INSTANCEdb2inst1指定实例名DB2INST1_PASSWORD设置实例用户密码会在首次初始化时生效-v db2data:/database是核心把数据库文件持久化到宿主机数据卷容器删了再起数据还在--privileged是部分镜像版本的要求不加可能出现权限不足导致的初始化失败加上虽然不安全但单机开发可接受。镜像启动不是瞬时的。初始化要跑建用户、建实例、配端口这一套流程一般需要 30 秒到两分钟。判断是否启动完成不要靠猜直接看日志docker logs -f db2v11日志末尾出现Setup complete或者类似字样后再进入下一步。很多人在日志还没刷完时就急着连接结果报SQL30081N通信错误这属于操作太快不是环境坏了。4.3 容器内建库与连接验证镜像自带一个sample数据库可以直接用来验证连接。如果容器版本没有自动建库就手动建docker exec -it db2v11 bash -c su - db2inst1 -c db2 create database sampledocker exec进入容器执行命令su - db2inst1切换到实例用户db2 create database sample建库。建库过程在容器里跑所以不需要暴露额外端口。连接验证分两个层面。容器内部先测一遍docker exec -it db2v11 bash -c su - db2inst1 -c db2 connect to sample再用宿主机工具测一遍网络路径。如果你本机装了python用ibm_db或JayDeBeApi连接localhost:50000都行如果没装客户端直接映射端口后从另一个容器里连也可以。重点是确认50000端口真的通了而不仅是容器内自测通过。5. 安装与使用避坑DB2 V11.1 最常见的 5 个问题5.1 SQL1032N实例没有启动完整现象db2start执行后提示处理成功但接着db2 connect to sample返回SQL1032N No started database manager。原因db2start只是启动了数据库管理器进程实例内部的共享内存和后台服务还要额外几秒准备。在脚本里用db2 connect紧跟着db2start很可能撞上这个空窗期。解决在db2start和db2 connect之间加db2 get instance确认当前实例名然后sleep 5再连接。如果依然报错去~/sqllib/db2dump/db2diag.log搜ERROR和SQL1032N附近的上下文最常见的情况是 fenced 用户或实例目录权限被改过。5.2 中文字符乱码现象数据库里的中文在命令行查询正常但通过 Java 应用读出来是一串????或被截断的乱码。原因V11.1 的默认代码页和客户端字符集不一致。服务器端数据库建库时继承实例代码页如果初始化时系统 locale 是C代码页会落到ISO8859-1中文自然存不进去。解决建库前先检查db2 get dbm cfg | grep -i codepage如果是 819 或 0用db2set DB2CODEPAGE1208设置成 UTF-8然后db2stop、db2start重启实例再db2 create database sample。已经建好的库要重建或导出导入不能直接在原库上改编码。这条坑在 Docker 方式部署时尤其常见容器 locale 默认不是 UTF-8。5.3 SVCENAME 端口冲突现象实例启动成功但远程客户端连接超时本地db2 get dbm cfg | grep SVCENAME看到的是一个名字而不是 50000 这个数字。原因SVCENAME是符号名实际端口在/etc/services里映射。如果/etc/services里没有这个名字连接自然无处可去如果有两个 DB2 实例写的同名不同端口也会冲突。解决在/etc/services里追加一行比如db2c_db2inst1 50000/tcp然后用db2 update dbm cfg using SVCENAME db2c_db2inst1把配置指过去最后重启实例。注意 Linux 下/etc/services被某些安全加固工具锁过权限时会写不进去临时用db2 update dbm cfg using SVCENAME 50000直接写数字也可以但不如符号名规范。5.4 db2stop 卡住或停止失败现象执行db2stop长时间不返回最后报SQL1056N或直接超时。原因还有会话连接在实例上。DB2 的db2stop默认等所有连接断开只要有一个 Java 连接池没释放它就一直在那儿挂着。解决先跑db2 force applications all把活动连接强制断开再执行db2stop。如果还是不行用db2stop force这是最后手段强制停可能会导致未完成事务回滚生产环境慎用。日常停库的顺序应该是db2 deactivate db sample先解激活单个库再db2stop最后才轮到db2stop force出场。5.5 Docker 容器重启后连不上现象docker stop再docker start容器后docker exec里db2start正常但本地 Python 客户端连接报SQL30081N有时候连容器内部db2 connect都失败。原因容器重启后 hostname 和 IP 可能变化DB2 实例初始化时把 hostname 写进了实例配置重启后对不上就拒绝通信。另一个原因是启动容器时没挂数据卷数据库文件在容器层里容器删除后一切归零。解决启动时加--hostname固定容器主机名并且用-v db2data:/database持久化。如果已经发生连不上的情况在容器里执行db2set DB2HOSTNAME容器hostname然后db2stop force db2start。这是我在本机实测过很多次的场景Docker Desktop 每次重启分配的 IP 都会变不固定 hostname 就是给自己挖坑。6. 装完先验证再交差跑通连接与几个必测 SQL6.1 验证实例状态的一串命令装完别急着收工跑一遍完整的验证链路确认交付的是一个能连能查的 DB2而不是一个“看起来在运行”的 DB2。以下命令按顺序执行su - db2inst1 db2level db2 get dbm cfg | grep -i svcename db2 connect to sample user db2inst1 using your_password db2 values 1db2level能看到 DB2 内核版本和 fix pack 号这个返回结果要贴到交付文档里get dbm cfg确认监听端口connect验证本地认证values 1是最轻量的 SQL 执行测试。如果values 1返回结果集说明实例、库、连接链路都通。6.2 数字字符串判断与常用工具函数V11.1 自带正则函数判断一个字段是否为纯数字效率比写嵌套translate高得多。下面这条 SQL 在生产数据清洗里经常用到SELECT user_id, phone FROM t_user WHERE NOT REGEXP_LIKE(phone, ^[0-9]{11}$);这句找出电话号码格式不是“11 位纯数字”的记录。REGEXP_LIKE是 DB2 11.1 内置的谓词第一个参数是待测列第二个是正则模式。注意 V11.1 的正则引擎是 ICU 风格\d这类写法在部分版本里不识别统一用[0-9]最稳。如果你更习惯传统写法用TRANSLATE(phone, , 0123456789)也能达到目的把数字字符替换成空串后如果结果为空则原串全是数字。连库验证时加一个db2 SELECT REGEXP_LIKE(12345, ^[0-9]$) FROM sysibm.sysdummy1返回 1 说明函数可用返回 0 或报 SQL 错误就要查版本和代码页配置。6.3 一个退出习惯deactivate 与 stop 的顺序最后分享一个我每台 DB2 都会遵守的操作习惯。短期不再使用数据库时按下面顺序收尾db2 deactivate db sample db2 terminate db2stopdeactivate让数据库进入未激活状态释放内存缓存terminate断开当前会话最后db2stop停下实例。只有前两步做干净了db2stop才不会动不动就挂起。有人图省事直接db2stop force次数多了你会发现日志里频繁出现异常中断记录代价不在当下而在下一次启动时的崩溃恢复。这套流程我也吃过亏早期图快永远force结果一次断电后实例起不来数据恢复花了整整半天。从那以后只要不是真的卡死我都走完整的三步。DB2 V11.1 是个老而稳的版本你给它一点耐心它基本不会给你挖坑。希望帮到你。本文还有配套的精品资源点击获取
返回列表