2026年如何在CentOS上运行SQLPlus完全指南:从安装到实战(2026)

一、SQLPlus运行环境准备

1.1 系统要求检查

在CentOS上运行SQLPlus前,需要确认系统满足以下要求:

# 1. 检查操作系统版本
cat /etc/centos-release
uname -r

# 2. 检查内存(建议至少1GB)
free -h

# 3. 检查磁盘空间(建议至少2GB可用空间)
df -h

# 4. 检查依赖库
ldd --version
rpm -qa | grep libaio

最低系统要求
– CentOS 7/8 64位
– 内存:1GB以上(运行Oracle客户端)
– 磁盘:2GB以上可用空间
– 依赖:libaio、bc、flex

1.2 创建专用用户(推荐)

# 1. 创建oracle用户组
sudo groupadd oinstall
sudo groupadd dba

# 2. 创建oracle用户
sudo useradd -g oinstall -G dba -m -d /home/oracle oracle

# 3. 设置密码
sudo passwd oracle

# 4. 切换到oracle用户
su - oracle

二、安装Oracle Instant Client

2.1 下载Oracle Instant Client

# 1. 创建下载目录
mkdir -p /tmp/oracle_client
cd /tmp/oracle_client

# 2. 下载Oracle Instant Client RPM包(以21c为例)
wget https://download.oracle.com/otn_software/linux/instantclient/2115000/oracle-instantclient-basic-21.15.0.0.0-1.el8.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/2115000/oracle-instantclient-sqlplus-21.15.0.0.0-1.el8.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/2115000/oracle-instantclient-devel-21.15.0.0.0-1.el8.x86_64.rpm

# 3. 如果无法下载,可以手动从Oracle官网下载后上传

2.2 安装RPM包

# 1. 安装必要依赖
sudo yum install -y libaio bc flex

# 2. 安装Oracle Instant Client RPM包
sudo yum localinstall -y oracle-instantclient-*.rpm

# 3. 检查安装位置
rpm -ql oracle-instantclient-basic | head -20

2.3 配置环境变量

# 1. 编辑oracle用户的环境变量
nano ~/.bashrc

# 2. 在文件末尾添加:
export ORACLE_HOME=/usr/lib/oracle/21/client64
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"

# 3. 使配置生效
source ~/.bashrc

# 4. 验证安装
sqlplus -version

三、配置网络连接

3.1 使用EZCONNECT(最简单)

Oracle 10g+支持EZCONNECT方式连接,无需配置tnsnames.ora:

# 连接格式:sqlplus 用户名/密码@//主机:端口/服务名

# 示例1:连接本地数据库
sqlplus system/password@//localhost:1521/orcl

# 示例2:连接远程数据库
sqlplus system/password@//192.168.1.100:1521/orcl

# 示例3:使用EZCONNECT连接PDB
sqlplus system/password@//localhost:1521/pdb1

3.2 配置TNSNAMES.ORA(传统方式)

如果需要使用TNS别名连接,需要配置tnsnames.ora:

# 1. 创建network/admin目录
sudo mkdir -p $ORACLE_HOME/network/admin

# 2. 编辑tnsnames.ora
sudo nano $ORACLE_HOME/network/admin/tnsnames.ora

# 3. 添加以下内容(根据实际情况修改):
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

PDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

# 4. 测试TNS解析
tnsping ORCL

# 5. 使用TNS别名连接
sqlplus system/password@ORCL

3.3 配置SQLNET.ORA(可选)

# 1. 编辑sqlnet.ora
sudo nano $ORACLE_HOME/network/admin/sqlnet.ora

# 2. 添加以下内容:
# 设置认证方式
SQLNET.AUTHENTICATION_SERVICES = (NTS, BEQ)

# 设置默认域名(可选)
# NAMES.DEFAULT_DOMAIN = example.com

# 设置TNS解析顺序
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT, HOSTNAME)

# 设置超时(秒)
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 30
SQLNET.INBOUND_CONNECT_TIMEOUT = 30

# 3. 验证配置
tnsping ORCL

四、运行SQLPlus连接数据库

4.1 连接本地数据库(操作系统认证)

# 1. 切换到oracle用户
su - oracle

# 2. 设置ORACLE_SID(如果连接本地数据库)
export ORACLE_SID=orcl

# 3. 使用操作系统认证连接(sysdba权限)
sqlplus / as sysdba

# 4. 查看实例状态
SQL> select status from v$instance;

# 5. 查看数据库版本
SQL> select * from v$version;

4.2 连接本地数据库(用户名密码)

# 1. 连接普通用户
sqlplus system/password

# 2. 连接指定服务名
sqlplus system/password@orcl

# 3. 使用EZCONNECT连接
sqlplus system/password@//localhost:1521/orcl

# 4. 查看当前用户
SQL> show user;

4.3 连接远程数据库

# 1. 使用EZCONNECT连接远程数据库
sqlplus system/password@//192.168.1.100:1521/orcl

# 2. 使用TNS别名连接(需配置tnsnames.ora)
sqlplus system/password@ORCL

# 3. 连接远程PDB
sqlplus system/password@//192.168.1.100:1521/pdb1

# 4. 测试连接
SQL> select name from v$database;

4.4 解决连接常见问题

问题1:sqlplus: command not found

# 1. 检查SQLPlus是否安装
rpm -qa | grep sqlplus

# 2. 检查PATH环境变量
echo $PATH
which sqlplus

# 3. 创建符号链接
sudo ln -s /usr/lib/oracle/21/client64/bin/sqlplus /usr/local/bin/sqlplus

# 4. 重新加载环境变量
source ~/.bashrc

问题2:ORA-12154 – TNS:无法解析指定的连接标识符

# 1. 检查TNS_ADMIN环境变量
echo $TNS_ADMIN

# 2. 检查tnsnames.ora文件
cat $ORACLE_HOME/network/admin/tnsnames.ora

# 3. 测试TNS解析
tnsping ORCL

# 4. 使用EZCONNECT代替(无需tnsnames.ora)
sqlplus system/password@//192.168.1.100:1521/orcl

问题3:ORA-12541 – TNS:无监听程序

# 1. 检查数据库监听器状态(在数据库服务器上)
lsnrctl status

# 2. 启动监听器
lsnrctl start

# 3. 检查端口是否监听
netstat -tulnp | grep 1521

# 4. 测试网络连接
ping 192.168.1.100
telnet 192.168.1.100 1521

五、SQLPlus基础操作

5.1 常用SQLPlus命令

-- 查看当前用户
SHOW USER;

-- 查看所有用户
SELECT username, account_status FROM dba_users;

-- 查看数据文件
SELECT name FROM v$datafile;

-- 查看表空间使用率
SELECT tablespace_name, 
       ROUND(used_space * 100 / total_space, 2) AS used_pct
FROM (
    SELECT a.tablespace_name,
           a.bytes_alloc / 1024 / 1024 AS total_space,
           NVL(b.bytes_free, 0) / 1024 / 1024 AS free_space,
           (a.bytes_alloc - NVL(b.bytes_free, 0)) / 1024 / 1024 AS used_space
    FROM (SELECT tablespace_name, SUM(bytes) AS bytes_alloc
          FROM dba_data_files GROUP BY tablespace_name) a,
         (SELECT tablespace_name, SUM(bytes) AS bytes_free
          FROM dba_free_space GROUP BY tablespace_name) b
    WHERE a.tablespace_name = b.tablespace_name(+)
  );

-- 查看当前会话
SELECT sid, serial#, username, status FROM v$session WHERE username IS NOT NULL;

5.2 格式化查询结果

-- 设置行宽(防止一行显示不全)
SET LINESIZE 200;

-- 设置页面大小
SET PAGESIZE 50;

-- 设置列宽
COLUMN username FORMAT A20;
COLUMN tablespace_name FORMAT A20;
COLUMN file_name FORMAT A50;

-- 设置数字格式
COLUMN used_pct FORMAT 999.99;

-- 关闭重复行显示
BREAK ON tablespace_name;

-- 计算小计
COMPUTE SUM OF used_space ON tablespace_name;

5.3 执行SQL脚本

# 方法1:在sqlplus中执行脚本
sqlplus system/password@orcl
SQL> @/tmp/query.sql

# 方法2:直接执行脚本
sqlplus system/password@orcl @/tmp/query.sql

# 方法3:在shell脚本中使用
cat > query.sql << 'EOF'
SELECT username, created FROM dba_users WHERE account_status='OPEN';
EXIT;
EOF

sqlplus system/password@orcl @query.sql

六、SQLPlus数据导出导入

6.1 使用SPOOL导出数据

-- 使用SPOOL导出查询结果
SPOOL /tmp/output.csv

-- 设置导出格式
SET PAGESIZE 0
SET FEEDBACK OFF
SET HEADING ON
SET ECHO OFF
SET TERMOUT OFF
SET COLSEP ","

-- 执行查询
SELECT username, created, account_status FROM dba_users;

-- 关闭SPOOL
SPOOL OFF

-- 查看导出文件
HOST cat /tmp/output.csv

6.2 使用expdp导出数据

# 1. 创建目录对象(在sqlplus中)
sqlplus system/password@orcl
SQL> CREATE DIRECTORY backup_dir AS '/backup';
SQL> GRANT READ, WRITE ON DIRECTORY backup_dir TO system;

# 2. 使用expdp导出
expdp system/password@orcl directory=backup_dir dumpfile=export.dmp logfile=export.log schemas=scott

# 3. 导出整库
expdp system/password@orcl directory=backup_dir dumpfile=full_export.dmp logfile=full_export.log full=y

# 4. 查看导出文件
ls -lh /backup/

6.3 使用impdp导入数据

# 1. 导入指定schema
impdp system/password@orcl directory=backup_dir dumpfile=export.dmp logfile=import.log schemas=scott

# 2. 导入时重命名schema
impdp system/password@orcl directory=backup_dir dumpfile=export.dmp logfile=import.log REMAP_SCHEMA=scott:hr

# 3. 导入整库
impdp system/password@orcl directory=backup_dir dumpfile=full_export.dmp logfile=full_import.log full=y

# 4. 查看导入日志
cat /backup/import.log

七、SQLPlus自动化运行

7.1 在Shell脚本中运行SQLPlus

#!/bin/bash
# backup_script.sh

# 定义变量
ORACLE_SID=orcl
DB_USER=system
DB_PASS=password
DB_SID=orcl
BACKUP_DIR=/backup
DATE=$(date +%Y%m%d)

# 执行SQL
sqlplus $DB_USER/$DB_PASS@$DB_SID << EOF
  SPOOL $BACKUP_DIR/backup_$DATE.log

  -- 查询用户信息
  SELECT username, created, profile FROM dba_users WHERE account_status='OPEN';

  -- 查询表空间使用率
  SELECT tablespace_name, 
         ROUND(used_space * 100 / total_space, 2) AS used_pct
  FROM (
    SELECT a.tablespace_name,
           a.bytes_alloc / 1024 / 1024 AS total_space,
           NVL(b.bytes_free, 0) / 1024 / 1024 AS free_space,
           (a.bytes_alloc - NVL(b.bytes_free, 0)) / 1024 / 1024 AS used_space
    FROM (SELECT tablespace_name, SUM(bytes) AS bytes_alloc
          FROM dba_data_files GROUP BY tablespace_name) a,
         (SELECT tablespace_name, SUM(bytes) AS bytes_free
          FROM dba_free_space GROUP BY tablespace_name) b
    WHERE a.tablespace_name = b.tablespace_name(+)
  );

  SPOOL OFF
  EXIT
EOF

echo "Backup completed at $(date)"

7.2 定时执行SQLPlus脚本

# 1. 编辑crontab
crontab -e

# 2. 添加以下行(每天凌晨2点执行备份)
0 2 * * * /home/oracle/scripts/backup_script.sh > /tmp/backup.log 2>&1

# 3. 查看crontab
crontab -l

# 4. 检查cron日志
tail -f /var/log/cron

7.3 使用Oracle Wallet存储密码

# 1. 创建Wallet
mkstore -wrl /u01/app/oracle/wallet -create
# 输入Wallet密码:WalletPass123!

# 2. 添加数据库凭证
mkstore -wrl /u01/app/oracle/wallet -createCredential ORCL system "Password123!"

# 3. 配置sqlnet.ora
echo "WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/wallet)))" >> $ORACLE_HOME/network/admin/sqlnet.ora
echo "SQLNET.WALLET_OVERRIDE=TRUE" >> $ORACLE_HOME/network/admin/sqlnet.ora

# 4. 使用Wallet连接(无需密码)
sqlplus /@ORCL

八、SQLPlus性能优化

8.1 优化查询性能

-- 1. 增大ARRAYSIZE(减少网络往返)
SET ARRAYSIZE 500;

-- 2. 使用并行查询
SELECT /*+ PARALLEL(emp, 4) */ COUNT(*) FROM emp;

-- 3. 查看执行计划
EXPLAIN PLAN FOR
SELECT * FROM emp WHERE deptno = 10;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

-- 4. 收集表统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP');

8.2 优化SQLPlus设置

-- 1. 关闭不必要的输出
SET TERMOUT OFF
SET ECHO OFF
SET FEEDBACK OFF

-- 2. 使用直接路径读取(如果支持)
ALTER SESSION SET "_SERIAL_DIRECT_READ" = TRUE;

-- 3. 增加排序区大小
ALTER SESSION SET SORT_AREA_SIZE = 1048576;

-- 4. 使用绑定变量(减少硬解析)
VARIABLE b_deptno NUMBER
EXEC :b_deptno := 10;
SELECT * FROM emp WHERE deptno = :b_deptno;

九、SQLPlus安全加固

9.1 避免在命令行中暴露密码

# 不安全的方式(密码可见)
sqlplus system/password@orcl

# 安全方式1:使用提示输入密码
sqlplus system@orcl
# 然后输入密码

# 安全方式2:使用Oracle Wallet(参见第七章第3节)

# 安全方式3:使用操作系统认证
sqlplus / as sysdba

9.2 限制SQLPlus访问

-- 1. 创建仅必要权限的用户
CREATE USER app_user IDENTIFIED BY "AppPass123!";
GRANT CREATE SESSION TO app_user;
GRANT SELECT ON scott.emp TO app_user;

-- 2. 使用数据库 Vault(Oracle 10g+)
BEGIN
  DBMS_MACADM.ENABLE_DATABASE_VAULT;
END;
/

-- 3. 创建IP限制触发器
CREATE OR REPLACE TRIGGER check_client_ip
  AFTER LOGON ON DATABASE
DECLARE
  v_ip VARCHAR2(50);
BEGIN
  SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS') INTO v_ip FROM DUAL;
  IF v_ip NOT IN ('192.168.1.100', '192.168.1.101') THEN
    RAISE_APPLICATION_ERROR(-20001, 'Access denied from this IP');
  END IF;
END;
/

-- 4. 使用防火墙限制访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="1521" accept'
sudo firewall-cmd --reload

十、总结

在CentOS上运行SQLPlus,需要掌握以下核心技能:

  1. 环境准备:检查系统要求,创建专用用户
  2. 安装配置:安装Oracle Instant Client,配置环境变量
  3. 网络连接:使用EZCONNECT或配置TNSNAMES.ORA
  4. 运行连接:掌握本地连接、远程连接、sysdba连接等方法
  5. 基础操作:熟练使用SQLPlus命令、格式化查询结果、执行脚本
  6. 数据导出导入:使用SPOOL、expdp、impdp等工具
  7. 自动化运行:在Shell脚本中运行SQLPlus,定时执行任务
  8. 性能优化:优化查询性能、优化SQLPlus设置
  9. 安全加固:保护密码、限制访问、审计操作

核心要点
– 使用EZCONNECT简化远程连接(无需配置tnsnames.ora)
– 使用SPOOL导出数据,使用expdp/impdp进行数据泵导出导入
– 设置正确的NLS_LANG环境变量解决中文乱码
– 使用Oracle Wallet保护密码,避免在命令行中暴露
– 在Shell脚本中使用Here Document执行SQLPlus命令

通过本文的指南,你可以在CentOS上熟练运行SQLPlus,进行Oracle数据库的管理和开发工作。

注:本文基于CentOS 7/8和Oracle 19c/21c编写,具体配置可能因版本差异而略有不同。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注