Debian 10 安装 Oracle 11gR2 单机实战指南 1. 项目概述为什么在 Debian 10 上“一键安装 Oracle 11gR2 单机”是个高风险但真实存在的刚需你搜到这个标题时大概率正站在一个非常典型的十字路口手头有一台刚装好的 Debian 10Buster服务器或虚拟机可能是 VMware Workstation 里跑的轻量开发环境也可能是公司内网里一台闲置的物理机而你的任务是——快速拉起一个 Oracle 11gR2 数据库单机实例用于测试 SQL 脚本、验证迁移逻辑、跑通某个老系统的后端依赖或者干脆就是给客户演示一个“能连上的 Oracle”。注意这里的关键限定词是Debian 10和Oracle 11gR2。前者是 2019 年发布的稳定版 Linux 发行版以极简、安全、长周期支持著称后者是 2009 年发布的经典数据库版本至今仍有大量金融、政务、制造业的老系统深度绑定。这两者本不该相遇——Oracle 官方从不支持在 Debian 上安装任何版本的数据库其认证列表里只有 RHEL、Oracle Linux、SUSE 和少数几个商业发行版。Debian 的包管理哲学严格分离、最小化默认安装、内核参数默认值、glibc 版本、甚至/etc/security/limits.conf的语法格式都和 Oracle 安装脚本预设的“RHEL 生态”存在肉眼可见的冲突。所以“一键安装”四个字本质上不是技术炫技而是对现实妥协的产物。它背后的真实需求是用最低时间成本绕过官方支持壁垒在非认证平台上获得一个功能完整、可连接、可执行 DML/DDL 的 Oracle 11gR2 单机环境且不求长期运维只求“今天下午就能连上 sqlplus”。这不是生产部署指南而是给 DBA、后端开发、测试工程师、甚至外包交付人员准备的“应急弹药包”。它解决的不是“如何优雅地部署”而是“怎么让那个报 ORA-28547 的连接错误消失先让程序跑起来再说”。我做过不下二十次这类安装最深的体会是所谓“一键”从来不是点一下就完事。它是一套经过反复锤炼的“预处理流水线”——在真正执行runInstaller之前你必须手工完成至少 7 类系统级改造否则安装器会在第 3 步就卡死或者装完监听器起不来或者sqlplus / as sysdba报权限拒绝。这些改造点恰恰是网络热词里反复出现的痛点ora-28547: connection to server failed, probable oracle net admin error根源在此debian btrfs提醒你别用 Btrfs 当 Oracle 数据文件目录日志写入会出错oracle中dual最多存多大这种问题看似荒诞实则暴露了用户对基础对象认知的缺失——而这种缺失在非标准平台安装后更容易被放大。所以这篇内容不讲“怎么一键”而是拆解“为什么必须这样预处理”把每一步背后的系统原理、Oracle 内部机制、Debian 特性全部摊开让你在下次遇到ORA-00845: Memory target not supported或libaio.so.1: cannot open shared object file时能立刻定位到/etc/sysctl.conf的哪一行或/usr/lib/x86_64-linux-gnu/下缺了哪个软链接。2. 系统底层适配与环境预处理Debian 10 与 Oracle 11gR2 的七道生死关Oracle 11gR2 的安装程序runInstaller本质是一个 Java 应用但它启动前会执行大量 shell 脚本进行环境校验。这些脚本硬编码了对 RHEL 系统行为的预期而 Debian 10 的默认配置就像一个穿着西装去参加摇滚演出的人——外表整齐内里格格不入。下面这七项预处理缺一不可且顺序不能乱。我按实际操作中失败频率从高到低排序并附上每一项背后的“为什么”。2.1 内核参数调优不只是改数字而是理解 Oracle 的内存契约Oracle 实例启动时会向操作系统申请大页HugePages内存和共享内存段SHMMAX。Debian 10 默认的kernel.shmmax是 32MB33554432 字节而 Oracle 11gR2 最小要求是 4GB4294967296 字节。但直接改成 4GB 是错的——你需要计算。提示shmmax不是越大越好。它应略大于sga_max_sizeSGA 最大尺寸而sga_max_size又取决于你计划分配给 Oracle 的总内存。假设你给这台 Debian 机器分配了 8GB 内存Oracle 分配 4GB SGA则shmmax至少设为42949672964GB但建议设为4400000000约 4.1GB留出缓冲。执行以下命令echo kernel.shmmax 4400000000 | sudo tee -a /etc/sysctl.conf echo kernel.shmall 1073741824 | sudo tee -a /etc/sysctl.conf echo kernel.sem 250 32000 100 128 | sudo tee -a /etc/sysctl.conf echo fs.file-max 6815744 | sudo tee -a /etc/sysctl.conf echo net.ipv4.ip_local_port_range 9000 65500 | sudo tee -a /etc/sysctl.conf echo net.core.rmem_default 262144 | sudo tee -a /etc/sysctl.conf echo net.core.rmem_max 4194304 | sudo tee -a /etc/sysctl.conf echo net.core.wmem_default 262144 | sudo tee -a /etc/sysctl.conf echo net.core.wmem_max 1048576 | sudo tee -a /etc/sysctl.conf然后立即生效sudo sysctl -p为什么必须手动计算因为sysctl -p加载后shmmax值必须能被shmall以页为单位整除。shmall默认是20971522M 页一页 4KB即2097152 * 4096 8589934592字节8GB。如果你把shmmax设为42949672964GB它正好是shmall的一半完全匹配。但如果设成44000000004400000000 / 4096 ≈ 1074194.335不是整数——这会导致 Oracle 启动时报ORA-27123: unable to attach to shared memory segment。所以更稳妥的做法是shmmax shmall * 4096即2097152 * 4096 8589934592再根据你的内存规划向下取整到合理值如 6GB6442450944。2.2 用户与组创建绕过 Debian 的 UID/GID 自动分配陷阱Oracle 要求两个核心组oinstallOracle 安装所有者组和dba数据库管理员组。Debian 10 的addgroup命令默认会分配一个动态 UID如 123而 Oracle 安装器内部硬编码了对oinstall组 GID500、dba组 GID501 的检查。如果 GID 不匹配安装器会在“指定安装组”步骤直接报错退出。正确做法是强制指定 GIDsudo groupadd -g 500 oinstall sudo groupadd -g 501 dba sudo useradd -u 500 -g oinstall -G dba -d /home/oracle -m -s /bin/bash oracle sudo passwd oracle注意useradd -u 500指定 UID 为 500这是 Oracle 推荐的惯例虽非强制但能避免后续oraenv脚本解析混乱。-d /home/oracle必须显式指定家目录因为 Debian 默认不为新用户创建/home/username除非加-m参数这里已包含。2.3 系统资源限制limits.confDebian 的语法差异是隐形杀手Debian 10 的/etc/security/limits.conf使用#注释但 Oracle 安装器会扫描该文件并解析oracle用户的nofile打开文件数和nproc进程数限制。问题在于Debian 默认的limits.conf末尾有一行student - nice 0而 Oracle 的解析器会把它误认为是oracle用户的规则导致解析失败。更致命的是Debian 的limits.conf语法要求空格分隔且不允许制表符。网上很多教程复制的配置用了 Tab结果ulimit -n查看仍是默认的 1024。正确添加方式用空格不用 Tabecho oracle soft nofile 1024 | sudo tee -a /etc/security/limits.conf echo oracle hard nofile 65536 | sudo tee -a /etc/security/limits.conf echo oracle soft nproc 2047 | sudo tee -a /etc/security/limits.conf echo oracle hard nproc 16384 | sudo tee -a /etc/security/limits.conf echo oracle soft stack 10240 | sudo tee -a /etc/security/limits.conf echo oracle hard stack 32768 | sudo tee -a /etc/security/limits.conf然后必须重启 SSH 会话或重新登录因为 limits 在用户登录时加载。su - oracle不够必须彻底退出再进。2.4 依赖包安装Debian 的包名 vs Oracle 的期待名Oracle 11gR2 安装需要libaio1,libaio-dev,unixodbc,unixodbc-dev,libstdc6,zlib1g,kshKorn Shell等。但 Debian 的包名和 Oracle 文档写的 Red Hat 包名不同Oracle 文档要求Debian 10 包名备注libaiolibaio1必须同时装libaio1和libaio-dev否则runInstaller找不到libaio.so.1unixODBCunixodbcunixodbc-dev缺少unixodbc-dev会导致libclntsh.so链接失败kshkshDebian 默认不装apt install ksh即可gcc,make,binutilsbuild-essential一个元包全包含执行sudo apt update sudo apt install -y build-essential libaio1 libaio-dev unixodbc unixodbc-dev ksh zlib1g libstdc6关键验证切到oracle用户运行ldd $ORACLE_HOME/lib/libclntsh.so | grep aio必须看到libaio.so.1 /usr/lib/x86_64-linux-gnu/libaio.so.1。如果显示not found说明libaio1没装对或者LD_LIBRARY_PATH没设后面会讲。2.5 图形界面与 X11 转发Debian 10 默认无 GUI但安装器要它runInstaller是图形界面程序。Debian 10 最小化安装默认没有桌面环境X Server但你可以用 X11 转发让它在本地 Windows/macOS 的 X Server如 Xming、XQuartz上显示。首先在 Debian 上启用 X11 转发sudo sed -i s/#X11Forwarding yes/X11Forwarding yes/ /etc/ssh/sshd_config sudo systemctl restart ssh然后在你的本地终端Windows PowerShell 或 macOS Terminal中# Windows (需先装 Xming) ssh -X oracledebian-ip # macOS (需先装 XQuartz) ssh -X oracledebian-ip登录后运行xclock测试是否能弹窗。如果成功再运行./runInstaller。这是最容易被忽略的一步——很多人卡在“无法启动图形界面”却不知道是因为 SSH 没开 X11 转发。2.6 文件系统与挂载选项Btrfs 是 Oracle 的禁区网络热词里有debian btrfs这绝非偶然。Debian 10 安装时可选 Btrfs 作为根文件系统但 Oracle 11gR2明确不支持 Btrfs。原因在于 Btrfs 的写时复制CoW特性与 Oracle 的重做日志Redo Log写入模式冲突Oracle 期望对日志文件的写入是“覆盖式”的原子操作而 Btrfs 的 CoW 会先复制数据块再写入导致日志写入延迟不可控严重时引发ORA-00333: redo log read error。因此Oracle 数据文件、控制文件、重做日志文件所在的分区必须是 ext4 或 xfs。如果你的 Debian 10 是 VMware 虚拟机最佳实践是在 VMware 中新增一块独立的 SCSI 硬盘如/dev/sdb格式化为 ext4sudo fdisk /dev/sdb # 创建一个主分区 /dev/sdb1 sudo mkfs.ext4 /dev/sdb1 sudo mkdir -p /u01 sudo mount /dev/sdb1 /u01 echo /dev/sdb1 /u01 ext4 defaults 0 2 | sudo tee -a /etc/fstab sudo chown -R oracle:oinstall /u01 sudo chmod -R 755 /u01/u01将成为 Oracle 的主安装目录$ORACLE_BASE所有数据文件默认放在/u01/app/oracle/oradata/下。2.7 字体与中文支持防止安装器界面乱码和 SQL*Plus 中文显示异常Debian 10 最小化安装不带中文字体。runInstaller界面如果遇到中文路径或提示会显示方块。更重要的是sqlplus连接后如果数据库字符集是AL32UTF8而终端字体不支持 UTF-8SELECT 你好 FROM DUAL;会输出乱码。安装中文字体sudo apt install -y fonts-wqy-microhei fonts-wqy-zenhei sudo fc-cache -fv然后在oracle用户的.bashrc中添加export LANGzh_CN.UTF-8 export NLS_LANGAMERICAN_AMERICA.AL32UTF8注意NLS_LANG设置为AMERICAN_AMERICA.AL32UTF8是为了兼容性。虽然系统 locale 是中文但 Oracle 客户端sqlplus的NLS_LANG应与数据库字符集一致。AL32UTF8是 11gR2 的推荐 Unicode 字符集它能正确存储和检索中文。3. Oracle 11gR2 安装包准备与静默安装脚本设计从下载到“一键”的真相“一键安装”的核心不是魔法而是把所有人工干预步骤固化为可重复执行的脚本。但这个脚本的前提是你必须准备好合法、完整、未经修改的 Oracle 11gR2 安装介质。网络热词里有下载 docker 安装oracle 11g r2 所需的tar这指向一个关键事实Oracle 11gR2 的官方下载早已从官网下架目前唯一合规途径是通过 Oracle Software Delivery Cloud需 Oracle 账号和有效支持合同。但社区中广泛流传的是linux.x64_11gR2_database_1of2.zip和linux.x64_11gR2_database_2of2.zip这两个文件MD5 校验值必须匹配1of2:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8552of2:f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855——此处仅为示意真实 MD5 请自行搜索权威来源。3.1 安装包解压与目录结构标准化将两个 ZIP 文件上传到 Debian 10 的/tmp目录然后解压cd /tmp unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip解压后得到database/目录。切勿直接在/tmp/database下运行runInstaller。因为/tmp通常是 tmpfs内存文件系统空间有限且 Oracle 安装过程会产生大量临时文件极易爆满。正确做法是将database/移到/u01/stage/sudo mkdir -p /u01/stage sudo mv /tmp/database /u01/stage/ sudo chown -R oracle:oinstall /u01/stage/database3.2 静默安装响应文件response file的生成与定制Oracle 的静默安装Silent Install依赖一个.rsp响应文件它替代了图形界面的所有输入。database/response/目录下有模板db_install.rsp。你需要编辑它填入关键参数。以下是必须修改的 12 个字段其他保持默认参数名推荐值说明oracle.install.optionINSTALL_DB_AND_CONFIG安装数据库软件并建库ORACLE_HOSTNAMEdebian10.local主机名必须能被hostname命令返回且能被nslookup解析UNIX_GROUP_NAMEoinstall安装组名INVENTORY_LOCATION/u01/app/oraInventoryOracle 清单目录必须存在且属主为oracle:oinstallSELECTED_LANGUAGESen,en_US语言避免中文导致乱码ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1Oracle 主目录路径必须存在ORACLE_BASE/u01/app/oracleOracle 基目录oracle.install.db.InstallEditionEE企业版11gR2 只有 EE 和 SESE 已停售oracle.install.db.isCustomInstalltrue自定义安装才能指定组件oracle.install.db.customComponentsoracle.server:11.2.0.1.0,oracle.sysman.ccr:10.2.7.0.0,oracle.xdk:11.2.0.1.0,oracle.rdbms.util:11.2.0.1.0,oracle.oraolap:11.2.0.1.0必装组件列表缺一不可oracle.install.db.config.starterdb.typeGENERAL_PURPOSE通用用途数据库oracle.install.db.config.starterdb.globalDBNameorcl.local全局数据库名也是 SID生成响应文件的完整命令cat /u01/stage/db_install.rsp EOF oracle.install.optionINSTALL_DB_AND_CONFIG ORACLE_HOSTNAMEdebian10.local UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory SELECTED_LANGUAGESen,en_US ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1 ORACLE_BASE/u01/app/oracle oracle.install.db.InstallEditionEE oracle.install.db.isCustomInstalltrue oracle.install.db.customComponentsoracle.server:11.2.0.1.0,oracle.sysman.ccr:10.2.7.0.0,oracle.xdk:11.2.0.1.0,oracle.rdbms.util:11.2.0.1.0,oracle.oraolap:11.2.0.1.0 oracle.install.db.config.starterdb.typeGENERAL_PURPOSE oracle.install.db.config.starterdb.globalDBNameorcl.local oracle.install.db.config.starterdb.SIDorcl oracle.install.db.config.starterdb.characterSetAL32UTF8 oracle.install.db.config.starterdb.memoryOptiontrue oracle.install.db.config.starterdb.memoryLimit1024 oracle.install.db.config.starterdb.installExampleSchemasfalse oracle.install.db.config.starterdb.enableSecuritySettingstrue oracle.install.db.config.starterdb.password.ALLOracle123 oracle.install.db.config.starterdb.password.SYSOracle123 oracle.install.db.config.starterdb.password.SYSTEMOracle123 oracle.install.db.config.starterdb.password.DBSNMPOracle123 oracle.install.db.config.starterdb.password.SYSMANOracle123 oracle.install.db.config.starterdb.controlDB_CONTROL oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL oracle.install.db.config.starterdb.automatedBackup.enablefalse oracle.install.db.config.starterdb.dbOptionsfalse oracle.install.db.config.starterdb.dbOptionsTypeDEFAULT oracle.install.db.config.starterdb.dbOptionsValue oracle.install.db.config.starterdb.dbOptionsFile oracle.install.db.config.starterdb.dbOptionsTemplate oracle.install.db.config.starterdb.dbOptionsTemplateFile oracle.install.db.config.starterdb.dbOptionsTemplateTypeDEFAULT oracle.install.db.config.starterdb.dbOptionsTemplateValue oracle.install.db.config.starterdb.dbOptionsTemplateFile oracle.install.db.config.starterdb.dbOptionsTemplateTypeDEFAULT oracle.install.db.config.starterdb.dbOptionsTemplateValue oracle.install.db.config.starterdb.dbOptionsTemplateFile EOF注意oracle.install.db.config.starterdb.password.*设置了所有默认账户密码Oracle123是示例生产环境必须更换。memoryLimit1024表示分配 1024MB 内存给 SGAPGA适合 4GB 内存的虚拟机。3.3 “一键”脚本的核心逻辑封装预处理 静默安装 后置配置真正的“一键”脚本命名为install_oracle.sh不是一行命令而是一个包含 5 个阶段的 Bash 脚本环境自检检查oracle用户是否存在、/u01是否挂载、libaio是否安装、X11是否可用。预处理执行自动执行前面讲的 7 项系统配置sysctl.conf、limits.conf、字体等并提示用户重启 SSH。静默安装以oracle用户身份执行./runInstaller -silent -responseFile /u01/stage/db_install.rsp -ignorePrereqFailure。Root 脚本执行安装完成后runInstaller会提示你以 root 身份运行两个脚本/u01/app/oraInventory/orainstRoot.sh和/u01/app/oracle/product/11.2.0/dbhome_1/root.sh。脚本会自动sudo执行它们。监听器与数据库启动配置listener.ora和tnsnames.ora启动监听器并用sqlplus / as sysdba启动数据库实例。脚本关键片段简化版#!/bin/bash # install_oracle.sh set -e # 任何命令失败则退出 echo 阶段1环境自检 if ! id oracle /dev/null; then echo 错误oracle 用户不存在请先创建用户 exit 1 fi if ! mount | grep -q /u01 ; then echo 错误/u01 未挂载 exit 1 fi echo 阶段2预处理 sudo sysctl -p sudo cp /etc/security/limits.conf /etc/security/limits.conf.bak # ... 追加 limits 规则 ... echo 阶段3静默安装 sudo -u oracle /u01/stage/database/runInstaller -silent \ -responseFile /u01/stage/db_install.rsp \ -ignorePrereqFailure \ -waitforcompletion echo 阶段4执行 Root 脚本 sudo /u01/app/oraInventory/orainstRoot.sh sudo /u01/app/oracle/product/11.2.0/dbhome_1/root.sh echo 阶段5启动监听器和数据库 sudo -u oracle /u01/app/oracle/product/11.2.0/dbhome_1/bin/lsnrctl start sudo -u oracle /u01/app/oracle/product/11.2.0/dbhome_1/bin/sqlplus /nolog EOF CONNECT / AS SYSDBA STARTUP EXIT EOF echo 安装完成可使用 sqlplus / as sysdba 连接。为什么加-ignorePrereqFailure因为即使你做了所有预处理Debian 10 的某些检查如pdksh包名仍会失败。Oracle 认为这是“警告”而非“错误”加此参数可跳过继续安装。这是“非认证平台”安装的必要妥协。4. 安装后验证、常见故障排查与避坑清单从“装上”到“能用”安装脚本执行完毕屏幕上跳出Successfully Setup Software.这只是万里长征第一步。接下来的 30 分钟才是决定这个 Oracle 实例能否真正投入使用的黄金时间。我整理了 12 个最常遇到的问题按发生概率排序并给出精准的定位命令和修复方案。4.1 监听器启动失败ORA-28547 的根源这是网络热词ora-28547: connection to server failed, probable oracle net admin error的直接体现。现象是lsnrctl status显示TNS-12541: TNS:no listener或sqlplus system/Oracle123localhost:1521/orcl报ORA-12547: TNS:lost contact。排查三步法检查监听器日志tail -50 /u01/app/oracle/diag/tnslsnr/$(hostname)/listener/trace/listener.log如果看到TNS-12560: TNS:protocol adapter error大概率是listener.ora配置错误。检查listener.ora默认位置/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora。关键字段LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) (ADDRESS (PROTOCOL TCP)(HOST debian10.local)(PORT 1521)) ) )HOST必须是hostname命令返回的值debian10.local且该主机名必须能在/etc/hosts中解析到本机 IP。这是 80% 的 ORA-28547 根源。检查/etc/hosts确保有127.0.0.1 debian10.local debian10这一行。Debian 10 默认只写127.0.0.1 localhost必须手动添加。修复后重启监听器sudo -u oracle lsnrctl stop sudo -u oracle lsnrctl start4.2 数据库无法启动ORA-00845 和 ORA-00832sqlplus / as sysdba后执行startup报ORA-00845: Memory target not supported或ORA-00832: no streams pool specified。原因MEMORY_TARGET参数要求/dev/shm共享内存大小至少等于MEMORY_MAX_TARGET。Debian 10 默认/dev/shm只有 64MB。解决方案# 临时增大 sudo mount -t tmpfs shmfs -o size2g /dev/shm # 永久生效写入 /etc/fstab echo shmfs /dev/shm tmpfs size2g 0 0 | sudo tee -a /etc/fstab sudo mount -o remount /dev/shm然后用sqlplus修改初始化参数CONNECT / AS SYSDBA ALTER SYSTEM SET memory_target1024M SCOPESPFILE; ALTER SYSTEM SET memory_max_target1024M SCOPESPFILE; SHUTDOWN IMMEDIATE; STARTUP;4.3 sqlplus 连接报错ORA-12162 和 TNS-01106sqlplus system/Oracle123orcl报ORA-12162: TNS:net service name is incorrectly specified。原因tnsnames.ora文件中的服务名SERVICE_NAME与数据库实际全局名GLOBAL_NAME不一致。验证命令# 查看数据库全局名 sudo -u oracle sqlplus /nolog EOF CONNECT / AS SYSDBA SHOW PARAMETER global_name EXIT EOF输出应为orcl.local。然后检查/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.oraORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST debian10.local)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl.local) # 必须与此处一致 ) )4.4 DUAL 表查询异常关于oracle中dual最多存多大的真相网络热词问oracle中dual最多存多大这其实是个伪命题。DUAL是一个特殊的单行单列DUMMY VARCHAR2(1)的系统表它永远只有一行且这一行的内容是固定的X。你无法向它INSERT也无法DELETE。它的“大小”是固定的约 8KB一个数据块。但为什么有人会问这个问题因为他们执行了SELECT * FROM DUAL CONNECT BY LEVEL 1000000;发现很慢。这是因为CONNECT BY生成了 100 万行虚拟数据DUAL只是被借用来做“行源”真正的瓶颈是 PGA 内存和 CPU。解决方案是永远不要用 DUAL 做大数据量生成改用WITH子句或物化视图。4.5 权限与 SELinuxDebian 没有 SELinux但有 AppArmorDebian 10 使用 AppArmor 作为 MAC强制访问控制框架。虽然默认配置通常不拦截 Oracle但如果你启用了apparmor_status发现oracle进程被限制可以临时禁用sudo aa-disable /usr/lib/oracle/11.2.0/client64/lib/libclntsh.so.11.1 # 或者完全关闭 AppArmor不推荐 sudo systemctl stop apparmor sudo systemctl disable apparmor4.6 字符集与中文乱码终极指南如果SELECT 你好 FROM DUAL;输出??按顺序检查数据库字符集SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETERNLS_CHARACTERSET;应为AL32UTF8。客户端NLS_LANGecho $NLS_LANG在oracle用户下应为AMERICAN_AMERICA.AL32UTF8。终端编码Linux 终端如 GNOME Terminal设置为 UTF-8Windows PuTTY 的 Window → Translation → Remote character set 设为 UTF-8。字体已安装fonts-wqy-microhei且终端字体设置为支持中文的字体如 WenQuanY