一、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,需要掌握以下核心技能:
- 环境准备:检查系统要求,创建专用用户
- 安装配置:安装Oracle Instant Client,配置环境变量
- 网络连接:使用EZCONNECT或配置TNSNAMES.ORA
- 运行连接:掌握本地连接、远程连接、sysdba连接等方法
- 基础操作:熟练使用SQLPlus命令、格式化查询结果、执行脚本
- 数据导出导入:使用SPOOL、expdp、impdp等工具
- 自动化运行:在Shell脚本中运行SQLPlus,定时执行任务
- 性能优化:优化查询性能、优化SQLPlus设置
- 安全加固:保护密码、限制访问、审计操作
核心要点:
– 使用EZCONNECT简化远程连接(无需配置tnsnames.ora)
– 使用SPOOL导出数据,使用expdp/impdp进行数据泵导出导入
– 设置正确的NLS_LANG环境变量解决中文乱码
– 使用Oracle Wallet保护密码,避免在命令行中暴露
– 在Shell脚本中使用Here Document执行SQLPlus命令
通过本文的指南,你可以在CentOS上熟练运行SQLPlus,进行Oracle数据库的管理和开发工作。
注:本文基于CentOS 7/8和Oracle 19c/21c编写,具体配置可能因版本差异而略有不同。