二、技术栈
这几年下来沉淀了许多技术栈
在【数据库】方面:会单独安装ORACLE从11G至23C,mysql5.6到8.0版本,会静默配置安装和可视化安装与backup和expdp\impdp备份与还原。
在【中间件】方面:Weblogic、Tomcat、Nginx等,会安装、调优和集群部署。
在【操作系统】层面:会安装CentOS、Red Hat、Ubuntu等。
其它【国产软件】麒麟V10、V11,Tongweb,TDSQL,GoldenDB的安装配置和优化也会。
在数据库编程/开发中:会编写存储过程、视图、触发器、序列、DBLINK、定时器等;
在SQL语法方面会:内连接(INNER JOIN)、左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)、>\<\=\<>\价于(> and <)\AND\OR\IN(EXISTS)\not in\LIKE\is NULL\CASE\to_data\to_char\order by(asc升,desc降)\group by等等;
在Linux命令方面会:pwd、ls、ll、cd、mkdir、rm、touch、cp、scp、mv、cat、tail、grep、netstat、tar、find和管道符等
为了在实施运维便利:会一点VB.NET、PHP等编程语言来编写运维、实施工具。
1、存储过程:把需要查询、统计的源数据统计出来写到一张表中共参考。
2、视图:把需求方需要的数据按需求方的要求建一张视图表共他们查询使用。
3、包:可以把整个系统中的所有表的业务功能表写在一个包中,每个模块处理不同的内容,如电商中订单是一个模块,只处理订单作用;发货只处理发货数据。最终应用程序需要取包中的那个模块自己来取。
4、触发器:主要是验证、数据审计、数据同步功能,当程序有数据写入到某张触发器定义的表中,此时触发验证数据是否正确,如我程序输入身份号后在保存那动作要保存到A表中,触发了触发器了A表有数据进来,触发器就需要验证输入的身份证号是否合规。
5、物化视图:差不多根视图一样,也是查询、统计出数据,但是它本身就是一张表,所以可以定义索引提升别人取数效率。
6、序列:一般是在增加数据时使用的自增加序列号使用,定义好自增加规则后,在写入时调用序列函数。
7、数据库链接:是指跨库查询、取数,使用DBLINK的功能查询另外一个数据库的数据。
8、JOB:定时器,就是定时如执行某个存储过程。
============================【编写存储过程PROCEDURE(婆谁吉儿)】============================
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter1 [IN | OUT | IN OUT] datatype,
parameter2 [IN | OUT | IN OUT] datatype,
...)]
IS | AS
-- 变量声明
BEGIN
-- 执行代码
[EXCEPTION]
-- 异常处理
END [procedure_name];
============================【视图View(V友)】============================
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name
[(alias1, alias2, ...)]
AS
subquery
[WITH [CHECK OPTION [CONSTRAINT constraint_name]]
| [READ ONLY [CONSTRAINT constraint_name]]];
============================【触发器Trigger(缺哥(儿))】============================
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF column1, column2, ...]}
ON table_name
[FOR EACH ROW]
[WHEN (condition)]
DECLARE
-- 变量声明
BEGIN
-- 触发器代码
END [trigger_name];
============================【序列Sequence(涩困斯)】============================
CREATE SEQUENCE sequence_name
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
[{ORDER | NOORDER}];
INSERT INTO table_name (id, name)
VALUES (sequence_name.NEXTVAL, 'John');
============================【数据库链接DBLINK】============================
sql
-- 创建数据库链接
CREATE [PUBLIC] DATABASE LINK dblink_name
CONNECT TO username IDENTIFIED BY password
USING 'tns_name';
-- 使用数据库链接
SELECT * FROM table_name@dblink_name;
INSERT INTO remote_table@dblink_name
SELECT * FROM local_table;
-- 删除数据库链接
DROP [PUBLIC] DATABASE LINK dblink_name;
============================【定时任务DBMS_SCHEDULER(时该吉轮(儿))】============================
sql
-- 创建定时任务
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'daily_backup_job',
job_type => 'STORED_PROCEDURE',
job_action => 'backup_procedure',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2',
enabled => TRUE,
comments => '每日凌晨2点执行备份'
);
END;
-- 管理任务
BEGIN
DBMS_SCHEDULER.ENABLE('job_name');
DBMS_SCHEDULER.DISABLE('job_name');
DBMS_SCHEDULER.DROP_JOB('job_name');
DBMS_SCHEDULER.RUN_JOB('job_name');
END;
-- 查看任务状态
SELECT job_name, enabled, state, next_run_date
FROM user_scheduler_jobs;
SELECT sequence_name.CURRVAL FROM dual;
============================【创建索引INDEX】============================
CREATE INDEX 索引名
ON 表名(列名);
--创建唯一索引(UNIQUE)
CREATE UNIQUE INDEX 索引名
ON 表名(列名);
============================【Linux相关命令】============================
# 查看当前目录
pwd
# 列出文件
ls
ls -la # 详细列表(包括隐藏文件)
ls -lh # 人类可读大小
# 切换目录
cd /home/user
cd .. # 上级目录
cd ~ # 家目录
# 创建/删除目录
mkdir new_folder
rmdir empty_folder
rm -r folder # 递归删除
# 文件操作
touch file.txt # 创建空文件
cp file.txt backup/ # 复制
mv file.txt newname.txt # 移动/重命名
rm file.txt # 删除
cat file.txt # 显示全部内容
head -n 10 file.txt # 显示前10行
tail -n 20 file.txt # 显示后20行
tail -f log.txt # 实时跟踪日志
# 搜索文本
grep "error" log.txt
grep -r "pattern" /dir # 递归搜索
# 网络状态
ping google.com
ifconfig # 或 ip addr
netstat -tulpn # 端口监听情况
# 下载和传输
wget http://example.com/file.zip
curl http://example.com
# SSH连接
ssh user@192.168.1.100
scp file.txt user@host:/path/
# tar包
tar -czvf archive.tar.gz folder/ # 压缩
tar -xzvf archive.tar.gz # 解压
# zip
zip archive.zip file1 file2
unzip archive.zip
find /home -name "*.txt" # 按文件名
find /var/log -mtime -7 # 7天内修改的文件
find . -type f -size +10M # 大于10MB的文件
# 磁盘挂载
lsblk 查看新磁盘
fdisk -l
fdisk /dev/sdb
进入后按顺序操作:
n → 新建分区
p → 主分区
回车(默认分区号)
回车(默认起始扇区)
回车(默认结束扇区,使用全部 2GB)
w → 保存并退出
mkfs.ext4 /dev/sdb1 ==格式化为ext4(还有xfs格式)
mkdir /data ==创建目录
mount /dev/sdb1 /data ==挂载
df -h ==检查
正式
blkid /dev/sdb1 ==获取 UUID
vim /etc/fstab ==编辑 /etc/fstab
UUID=a1b2c3d4-xxxx-xxxx /data ext4 defaults 0 0 ==最后一行增加
mount -a ==检查
===========================【ORACLE相关命令】============================
1. 完全备份 vs 增量备份
-- 完全备份(备份所有数据块)
RMAN> BACKUP DATABASE;
-- 增量备份(只备份变化的数据块)
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE;(后续 LEVEL 1 都依赖它)
-- LEVEL 0: 基础完全备份
-- LEVEL 1: 差异增量(自上次0级或1级备份以来的变化)
-- LEVEL 1 CUMULATIVE: 累积增量(自上次0级备份以来的变化)
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;
方案一
周日:Level 0
周一~周六:Level 1 Differential
2. 恢复流程
RMAN> STARTUP MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;
# 比如误删数据,恢复到某个时间点
STARTUP MOUNT;
RUN {
SET UNTIL TIME "TO_DATE('2026-03-18 10:00:00','YYYY-MM-DD HH24:MI:SS')";
RESTORE DATABASE;
RECOVER DATABASE;
}
ALTER DATABASE OPEN RESETLOGS;
# 只恢复某个表空间
RUN {
SQL 'ALTER TABLESPACE users OFFLINE IMMEDIATE';
RESTORE TABLESPACE users;
RECOVER TABLESPACE users;
SQL 'ALTER TABLESPACE users ONLINE';
}
# 只恢复某个数据文件
RUN {
RESTORE DATAFILE 5;
RECOVER DATAFILE 5;
}
3、EXPDP/IMPDP数据泵(逻辑导出导入)
# 全库导出(需要SYSDBA权限)
expdp system/password DIRECTORY=backup_dir DUMPFILE=full_%U.dmp
LOGFILE=expdp_full.log FULL=Y PARALLEL=4
# 按用户导出
expdp system/password DIRECTORY=backup_dir DUMPFILE=user_scott.dmp
SCHEMAS=scott LOGFILE=expdp_scott.log
# 按表导出
expdp scott/tiger DIRECTORY=backup_dir DUMPFILE=emp_dept.dmp
TABLES=emp,dept LOGFILE=expdp_tables.log
# 按表空间导出
expdp system/password DIRECTORY=backup_dir DUMPFILE=tbs_users.dmp
TABLESPACES=users LOGFILE=expdp_tbs.log
#全库导入
impdp system/password DIRECTORY=backup_dir DUMPFILE=full_%U.dmp
LOGFILE=impdp_full.log FULL=Y
# 用户导入(可跨用户)
impdp system/password DIRECTORY=backup_dir DUMPFILE=user_scott.dmp
SCHEMAS=scott REMAP_SCHEMA=scott:scott_new
# 传统exp/imp备份(较老的方式,逐渐淘汰)
# 全库导出
exp system/manager file=full.dmp log=exp_full.log full=y
# 用户导出
exp scott/tiger file=scott.dmp log=exp_scott.log owner=scott
# 表导出
exp scott/tiger file=emp.dmp log=exp_emp.log tables=emp
# 导入
imp system/manager file=full.dmp log=imp_full.log full=y
===========================【Mysql相关命令】============================
# 备份单个数据库
mysqldump -u root -p 数据库名 > backup.sql
# 备份所有数据库
mysqldump -u root -p --all-databases > alldb.sql
# 备份指定表
mysqldump -u root -p 数据库名 表1 表2 > tables.sql
# 恢复整个数据库
mysql -u root -p < backup.sql
# 恢复单个数据库
mysql -u root -p db_name < db_backup.sql
# 从压缩文件恢复
gzip -d < backup.sql.gz | mysql -u root -p
===========================【Oracle Data Guard容灾】============================
❓Oracle Data Guard 原理是什么?
✅ 标准答案:
Data Guard通过传输主库产生的Redo日志到备库,在备库进行Redo Apply(重放数据块变化),实现主备数据块级一致。
加分点:
支持SYNC/ASYNC
物理备库是block级复制
❓DG的三种模式区别?
✅ 答:
Maximum Protection(婆儿泰克申):0数据丢失,主库依赖备库确认
Maximum Availability(俄韦乐必乐替):尽量不丢数据(常用)
Maximum Performance(婆儿佛门斯):异步,可能丢少量数据
❓主库误删数据,DG会怎样?
✅ 答:
误操作会通过Redo同步到备库,DG不会阻止错误传播。
👉 延伸(必须说):
用Flashback选择某个删除前的时间点恢复
或延迟Apply
❓Oracle GoldenGate 和DG区别?
✅ 标准答案:
DG是物理复制(Redo直接重放),OGG是逻辑复制(解析Redo生成行级变更再应用)。
一句话版:
DG保证一致性,OGG提供灵活性。
❓Redo / Undo区别?
✅ 答:
Redo:保证数据不丢(前滚)
Undo:回滚事务(回退)
❓数据库卡顿你怎么排查?
✅ 标准答案(必须有步骤):
看负载:
CPU / IO / 内存
查等待事件:
AWR / ASH
查SQL:
Top SQL(耗时 / IO)
查锁:
是否阻塞
查日志:
alert log
👉 关键点:
一定要有“排查顺序”
===========================【MySQL高可用】============================
❓MySQL 主从延迟怎么解决?
✅ 答:
查IO线程 / SQL线程
大事务拆分
并行复制
提升从库性能
❓MHA原理?
✅ 答:
MHA通过监控主库状态,在主库故障时自动选举最新从库提升为主库,并切换其他从库。
关键点:
自动故障转移
binlog对齐
❓MGR(Group Replication)是什么?
✅ 答:
MySQL官方提供的基于Paxos协议的高可用方案,支持多节点强一致复制。
👉 关键词:
强一致
多主/单主
❓Percona XtraDB Cluster 原理?
✅ 答:
基于Galera协议,实现多节点同步复制,事务在提交前必须所有节点确认。
👉 关键词:
强一致
写放大
===========================【故障场景】============================
❓数据库CPU 100%怎么办?
✅ 标准答案:
top看进程
查数据库session
找高CPU SQL
看执行计划
优化或kill
👉 加分:
是否有全表扫描
是否缺索引
❓IO打满怎么处理?
✅ 答:
查磁盘使用(iostat)
查慢SQL
查大事务
检查备份/归档
❓锁表怎么解决?
✅ 答:
查锁:
v$lock / show engine innodb status
找阻塞源
kill或优化SQL
👉 加分:
行锁 vs 表锁
❓主库挂了怎么办?
👉 Oracle:
DG failover
👉 MySQL:
MHA / 手动切换
👉 关键点:
优先恢复业务,再查原因
❓SQL慢怎么优化?
✅ 标准答案:
看执行计划
是否走索引
是否全表扫描
索引优化
SQL改写
👉 关键:
explain必须会