小工具大体验:rlwrap加持下的Oracle/MySQL/SQL Server命令行交互

rlwrap = readline wrapper :不改你的客户端二进制,外面套一层,就能在 sqlplus/rman/dgmgrl 里用方向键、历史、Ctrl+A/ECtrl+R 搜索等"现代化"编辑体验。只对交互有用;脚本里别用。

1 为什么需要 rlwrap(痛点→收益)

  • 原生 sqlplus/rman/dgmgrl 在很多 Linux 发行版上不带 readline:方向键鬼畜、退格混乱、历史丢失。

  • DBA 日常交互多:敲错一行回天乏术,效率肉眼可见地掉。

  • rlwrap 让交互体验直线上升:可编辑、可搜索、可补全(伪字典)、可记忆

  • rlwrap 运行在你的终端目标程序之间,提供一个伪 TTY。

  • 你敲的键先到 rlwrap → 交给 GNU Readline 做行编辑/历史/快捷键 → 再把结果喂给 sqlplus 等。

  • "外套式" :目标程序不需要任何修改;rlwrap 也不解析 SQL,仅做行层面的编辑与历史管理。

2 何时该用、何时不该用

2.1 该用:

  • 你在终端里交互式 使用 sqlplusrmandgmgrlredis-clipsql 等。

  • 你想统一全家桶的交互体验(同一套快捷键、同一套历史搜索逻辑)。

2.2 不该用:

  • 脚本/cron/非交互场景(没有 TTY,rlwrap 反而会制造问题)。

  • 需要严格可重放的自动化执行(历史/别名会引入不确定性)。

  • 你要把密码写在命令行(历史记录会"抓包"到敏感信息,强烈不建议)。

3 安装 & 配置(极简)

3.1 服务器可联网

bash 复制代码
=== 一键设置 rlwrap + Oracle/MySQL/SQL Server 别名(含备份)===
建议使用具备 sudo 权限的账号执行

1) 安装 rlwrap
if command -v dnf >/dev/null 2>&1; then
  sudo dnf -y install rlwrap
else
  sudo yum -y install rlwrap || { sudo yum -y install epel-release && sudo yum -y install rlwrap; }
fi

2) 备份 .bash_profile(回滚更安心)
2.1 oracle 用户
sudo bash -lc '[ -f ~oracle/.bash_profile ] && cp -a ~oracle/.bash_profile ~oracle/.bash_profile.bak.$(date +%F-%H%M%S) || true'
2.2 当前登录用户
[ -f ~/.bash_profile ] && cp -a ~/.bash_profile ~/.bash_profile.bak.$(date +%F-%H%M%S) || true

3) 设置别名
3.1 Oracle(写入 oracle 用户)
sudo bash -lc "cat >> ~oracle/.bash_profile <<'EOF'
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias dgmgrl='rlwrap dgmgrl'
EOF
source ~oracle/.bash_profile"

3.2 MySQL/MariaDB + SQL Server(写入当前用户)
cat >> ~/.bash_profile <<'EOF'
alias mysql='rlwrap mysql'
alias mysqladmin='rlwrap mysqladmin'
alias mysqldump='rlwrap mysqldump'
alias mariadb='rlwrap mariadb'   # 如使用 MariaDB 客户端
alias sqlcmd='rlwrap sqlcmd'
alias bcp='rlwrap bcp'
alias osql='rlwrap osql'         # 如果还在用 osql
EOF
source ~/.bash_profile

4.(可选)系统级:所有用户登录 shell 生效
# sudo tee /etc/profile.d/rlwrap_aliases.sh >/dev/null <<'EOF'
# case $- in *i*) ;; *) return ;; esac
# if command -v rlwrap >/dev/null 2>&1; then
#   alias sqlplus='rlwrap sqlplus'; alias rman='rlwrap rman'; alias dgmgrl='rlwrap dgmgrl'
#   alias mysql='rlwrap mysql'; alias mysqladmin='rlwrap mysqladmin'; alias mysqldump='rlwrap mysqldump'; alias mariadb='rlwrap mariadb'
#   alias sqlcmd='rlwrap sqlcmd'; alias bcp='rlwrap bcp'; alias osql='rlwrap osql'
# fi
# EOF

3.2 服务器不可联网

内网环境分三招:有内网仓库直接装;没有就"离线打包 RPM";再不行就"源码编译"。以下三种方式和三大库别名都塞进一个框里(任选其一路径执行即可)。

bash 复制代码
# =========================
# 内网服务器安装 rlwrap + 三大数据库别名(任选其一路径)
# =========================

# ==== 路径 A:已有公司内网 YUM/DNF 仓库(最省事)====
# EL8/Oracle Linux 8+
sudo dnf -y install rlwrap || true
# EL7/CentOS7/RHEL7
sudo yum -y install rlwrap || true

# ==== 路径 B:离线 RPM 安装(推荐通用)====
# 步骤 B1(在一台"可上网且与目标机同发行版/同大版本"的机器上):
#   EL8:
#     sudo dnf -y install epel-release dnf-plugins-core
#     dnf download --resolve rlwrap
#   EL7:
#     sudo yum -y install epel-release yum-utils
#     yumdownloader --resolve rlwrap
#   然后把当前目录下的 *.rpm 打包并拷到内网服务器:
#     tar czf rlwrap-offline.tgz *.rpm
#     scp rlwrap-offline.tgz user@<内网服务器>:/tmp/

# 步骤 B2(在内网服务器上解包并安装):
#   cd /tmp && tar xzf rlwrap-offline.tgz
#   EL8 优先:
sudo dnf -y localinstall /tmp/*.rpm || \
#   EL7 其次:
sudo yum -y localinstall /tmp/*.rpm || \
#   兜底:
sudo rpm -Uvh /tmp/*.rpm --nodeps

# ==== 路径 C:源码编译(万不得已)====
# 1) 准备依赖(按发行版选一组):
#   EL8:
sudo dnf -y install gcc make readline-devel ncurses-devel || true
#   EL7:
sudo yum -y install gcc make readline-devel ncurses-devel || true
# 2) 将 rlwrap-<version>.tar.gz 复制到内网机并编译安装:
#   tar xzf rlwrap-*.tar.gz && cd rlwrap-*
#   ./configure && make
#   sudo make install
# 3) 验证路径(通常在 /usr/local/bin):
which rlwrap || echo "rlwrap 未在 PATH 中,考虑将 /usr/local/bin 加入 PATH"

# ==== 验证安装(任一安装路径完成后执行)====
rlwrap -v | head -n1 || echo "rlwrap 未安装成功,请改用其他路径重试"

# ==== 起别名前,建议备份 .bash_profile(可回滚)====
# 备份 oracle 用户
sudo bash -lc '[ -f ~oracle/.bash_profile ] && cp -a ~oracle/.bash_profile ~oracle/.bash_profile.bak.$(date +%F-%H%M%S) || true'
# 备份当前登录用户
[ -f ~/.bash_profile ] && cp -a ~/.bash_profile ~/.bash_profile.bak.$(date +%F-%H%M%S) || true

# ==== Oracle:写到 oracle 用户 ====
sudo bash -lc "grep -q 'rlwrap sqlplus' ~oracle/.bash_profile 2>/dev/null || cat >> ~oracle/.bash_profile <<'EOF'
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias dgmgrl='rlwrap dgmgrl'
EOF
source ~oracle/.bash_profile"

# ==== MySQL/MariaDB:写到"你平时登录的账号" ====
grep -q "rlwrap mysql" ~/.bash_profile 2>/dev/null || cat >> ~/.bash_profile <<'EOF'
alias mysql='rlwrap mysql'
alias mysqladmin='rlwrap mysqladmin'
alias mysqldump='rlwrap mysqldump'
alias mariadb='rlwrap mariadb'   # 若用 MariaDB 客户端
EOF

# ==== SQL Server(Linux 终端):仍写当前账号 ====
grep -q "rlwrap sqlcmd" ~/.bash_profile 2>/dev/null || cat >> ~/.bash_profile <<'EOF'
alias sqlcmd='rlwrap sqlcmd'
alias bcp='rlwrap bcp'
alias osql='rlwrap osql'
EOF

# 让当前账号的别名生效
source ~/.bash_profile 2>/dev/null || true

# ==== 使用与提示 ====
echo "✅ 完成:交互使用时通过别名启动(sqlplus/mysql/sqlcmd 等);脚本/cron 请直接调用原始二进制,勿用 rlwrap。"
echo "🔙 回滚:用备份文件覆盖回去,再 source 对应的 .bash_profile 即可。"
相关推荐
阿巴~阿巴~3 小时前
使用 C 语言连接 MySQL 客户端(重点)
服务器·数据库·sql·mysql·ubuntu
清水加冰3 小时前
【MySQL】SQL调优-如何分析SQL性能
数据库·sql·mysql
知其然亦知其所以然3 小时前
MySQL性能暴涨100倍?其实只差一个“垂直分区”!
后端·mysql·面试
风跟我说过她3 小时前
CentOS 7 环境下 MySQL 5.7 深度指南:从安装、配置到基础 SQL 操作
sql·mysql·centos
白水先森3 小时前
Python 字符串与布尔值详解
java·服务器·前端
is08153 小时前
全志 H3 armbian 备份
linux·服务器·网络
倔强的石头1063 小时前
【金仓数据库】ksql 指南(二) —— 创建与管理本地数据库
数据库·kingbasees·金仓数据库
编程充电站pro3 小时前
SQL 面试题解析:如何用多表查询写用户订单统计?
数据库·sql
iconball4 小时前
个人用云计算学习笔记 --18(NFS 服务器、iSCSI 服务器)
linux·运维·笔记·学习·云计算