一、oracle归档日志满了后处理操作
报错信息: ORA-00257: Archiver error. Connect AS SYSDBA only until resolved.
#dblink ,dmp文件导入数据库都会导致归档日志逐渐增加。
#注意这是全清的。 #切换oracle用户后执行。
su - oracle
cat rman_delArchiveLog.sh
#!/bin/bash
. /home/oracle/.bash_profile
echo "rman delete archiveLog starting ..."
rman target / log=/home/oracle/rman.log <<EOF
run
{
delete noprompt archivelog all;
}
exit
EOF
exit
参考: https://blog.51cto.com/u_3369545/6612790
二、oracle导出xxx用户在yyy实例下所有的表结构。
#环境信息: AIX , oracle 11g
登录的用户是nxxx , 实例是 yyyapp ,里面有10000多张表
#具体操作: 创建directory
sqlplus / as sysdba
create directory MY_DIR2408 as '/appdata/202408_dmpFile';
grant read,write on directory MY_DIR2408 to nxxx;
grant read,write on directory MY_DIR2408 to public;
###
mkdir -p /appdata/202408_dmpFile
#写成一行式 ,在AIX上能正常执行(不要带有 \ 符号) ; 切换为oracle用户
expdp "'nxxx/xxxx@10.xx.xx.xx:1521/xxxapp'" directory=MY_DIR2408 dumpfile=xxxapp2xx_2xx_structure.dmp logfile=xxxapp2xx_2xx_structure.log content=metadata_only cluster=no REUSE_DUMPFILES=YES
三、oracle 增加表空间容量
# 增加rac集群的表空间,应用库
select a.FREE_MB/1024,a.NAME,a.* from v$asm_diskgroup a;
--一次最多加30G, #这里的datafile根据实际情况填写
alter tablespace PM add datafile '+DATA01' size 31G;
四、修改db_files数量,重启rac后生效
#oracle RAC重启大致参考操作。 #环境信息:
Euler bclinux , oracle 19c RAC (两台)
增加多次表空间后,出现报错 ORA-00059:超出DB_FILES的最大值。
#修改db_files数量
alter system set db_files=8000 scope=spfile;
#查看db_files数量
show parameter db_files;
#1 重启rac集群 ,注意每个节点都要操作。 db01、 db02 ,重启
集群过程可能耗费10分钟+
#集群重启
su - root
/u01/app/19.3.0/grid/bin/crsctl stop has -f
/u01/app/19.3.0/grid/bin/crsctl start has
#观察着进程
ps -fu grid
ps -fu oracle
#进程都有了,最后登录到grid用户看看进群进程. 出现online则正常
su - grid
crsctl stat res -t
#2 启动对应的实例
oracle rac集群启停及状态检查
停止:
su - grid
srvctl stop database -d nwombak
srvctl status database -d nwombak
启动:
su - grid
srvctl start database -d nwombak
srvctl status database -d nwombak
4.2 上述小节途中报错及处理
ORA-01034 ORACLE not available
ORA-27101 shared memory realm does not exit
Linux-x86_64 Error:2 : No such file or directory
查看1521端口 , 和集群状态,是running ,端口进程PID还是在的,但还是报上述错误。
srvctl status database -d nwombak
lsof -i:1521
#继续处理:
su - oracle
sqlplus / as sysdba
startup mount;
exit ;
rman target /
delete noprompt archivelog all ;
exit ;
sqlplus / as sysdba
alter database open ;
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/19.3.0/dbhome_1/dbs/initemr
ep1.ora'
#处理。 最好两台机器都执行查看情况。
su - grid
#根据pmon显示的内容,做修改。 下面是demo语句
srvctl start instance -d emrep -i emrep1 -o mount
[grid@gxwydb01 ~]$srvctl start instance -d nwombak -i nwombak1 -o mount
PRCR-1004 : Resource ora.nwombak.db is already running
#另一台机器db02
[grid@gxwydb02 ~]$srvctl start instance -d nwombak -i nwombak2 -o mount
后面发现是SID不对头。 PRKO-3032 Invalid instance name(s): nwombak
修改 /home/oracle/.bash_profile
export ORACLE_SID=nwombak1
source /home/oracle/.bash_profile
#db02机器操作
su - grid
srvctl status database -d nwombak
srvctl start instance -d nwombak -i nwombak -o mount
#############
注意db01、db02各个用户的oracle_SID的值。
注意oracle用户 、 grid用户这两用户登录 sysdba后,他们显示的实例是不一样的。
因为oracle用户、grid用户他们各自的cat ~/.bash_profile ,里面的ORACLE_SID是不一样的。
比如grid的是export ORACLE_SID=+ASM1 ; oracle的是 export ORACLE_SID=nwombak1
select INSTANCE_NAME,STATUS FROM V$INSTANCE;
#
su - oracle
sqlplus / as sysdba
五、mysql删除3亿条log表-随记
log表占700GB ,3亿多行。 这里的索引字段为 create_time
没写存储过程。直接用shell mysql -e 来删表里面的数据。
#/bin/bash
for i in {1..300}
do
#删50万条数据,大概耗时3分钟。
/usr/local/mysql/bin/mysql -uroot -p'123456' -e "use xxdata; DELETE FROM _log_g WHERE create_time < '2024-01-01 00:00:00' limit 500000;"
sleep 30;
echo -e "$i finish clear $(date +%F_%T)" >> /tmp/clearDBInfo.txt
done
其他:
#方法1 删250万
DELETE FROM log_g WHERE create_time < '2024-01-01 00:00:00' limit 2500000
> Affected rows: 2500000
> 时间: 337.169s
#方法2 删250万 #超过800秒 还没走完。
DELETE q
FROM log_g q
JOIN (
SELECT id
FROM log_g
WHERE create_time < '2024-01-01 00:00:00'
ORDER by id DESC
limit 2500000;
) AS queryabc on q.id = queryabc.id
#### 2023年限制, 可以
DELETE FROM log_g WHERE create_time < '2023-01-01 00:00:00' limit 12500000
> Affected rows: 12500000
> 时间: 1717.663s
#### 换成2024年, 但报错失败了。
DELETE FROM log_g WHERE create_time < '2024-01-01 00:00:00' limit 12500000
> 1206 - The total number of locks exceeds the lock table size
> 时间: 943.292s
这个报错,网上说需调整innodb_buffer_pool_size的值 ()