最近遇到的几个数据库小问题

科技   2024-09-29 07:48   中国  
作者 | JiekeXu
来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)
如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)
大家好,我是 JiekeXu,江湖人称“强哥”,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle 11g OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看最近遇到的几个数据库小问题欢迎点击最上方蓝字“JiekeXu DBA之路”关注我的微信公众号,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

前  言

“好记性不如烂笔头”这句谚语强调了记录信息的重要性。它提醒我们,再好的记忆力也不如将事情记录下来可靠。通过书写,不仅可以帮助记忆,还能随时查阅,避免遗忘。无论是学习还是工作,养成做笔记的习惯都是十分有益的。今天打算将近期遇到的几个数据库小问题记录下来分享给大家。

一、insert 执行遇到“&”字符的问题

这个小问题则是发生在 insert、update 时 SQL 语句中包含了“&”字符,这样当我们去执行此 SQL 时默认会当做变量需要传入新值,这是不对的,例如:

在 Oracle SQLPLUS 中插入数据时,insert into t(ENAME) values (‘name&addr’);

SQL> set line 45SQL> desc t Name                 Null?    Type -------------------- -------- -------------- EMPNO                         NUMBER(4) ENAME                         VARCHAR2(10) JOB                           VARCHAR2(9) MGR                           NUMBER(4) HIREDATE                      DATE SAL                           NUMBER(7,2) COMM                          NUMBER(7,2) DEPTNO                        NUMBER(2)
SQL> insert into t(ENAME) values('name&addr');Enter value for addr: old 1: insert into t(ENAME) values('name&addr')new 1: insert into t(ENAME) values('name')
1 row created.
SQL> set define offSQL> insert into t(ENAME) values('name&addr');
1 row created.

插入值有特殊字符 & 导致插入引入变量,这个是 Oracle 里面用来识别自定义变量的设置,现在我们在 SQLPLUS下 将其关闭:

  • 方法一:在命令行前执行 define off

SQL> Set define OFF;

然后再次执行导入脚本,OK!问题搞定。

注意:如果是在 TOAD 中执行,建议在每一个要导入的脚本第一行加上前面那句关闭 define 的话,否则当你导入第二个含有特殊字符的脚本的时候,又会出错。
如果是在 SQLPLUS 中执行,则只需要设置一次 define OFF,后面就可以连续导入了。直到你重新设置 define ON 为止。

  • 方法二:在 SQL 语句中将’&'替换成 chr(38),因为 chr(38) 是‘&’的 ASCII 码

 SQL> Select 'Tom' || chr(38) || 'Jerry' from dual;
  • 方法三:分拆原来的字符串

SQL> Select 'Tom' || '&' || 'Jerry' from dual;

我们可以看到,方法一最为简便,而且效率也最高。方法二因为有一个调用函数的过程,所以性能稍差。方法三需要两次连接字符串,效率最差!

那么如果字段的内容中包含了单引号要怎么插入呢?例如:It’s fine。方法同样有三

  • 方法一:使用转义字符

SQL > Select 'test' || '''' from dual;

注意:这里的’’’'四个单引号是什么意思呢?首先第一个和最后一个都是 Oracle 中的字符串连接符,这个没有异议。那么第二个’和第三’又表示什么意思呢?第二个’是一个转义字符,第三个’才是我们真正的内容

  • 方法二:同样是使用转义字符,只不过方式不同而已

 SQL > Select 'test ''' from dual;

注意:这里的第二个,第三个’就是我们上面方法一中提到的转义符和真正的内容

  • 方法三:在 SQL 中将’替换成 chr(39),因为chr(39)是’的ASCII码

SQL > Select 'It' || chr(39) || 'fine' from dual;

二、搭建 ADG 备库时密码文件问题

搭建 ADG 备库时因密码文件问题导致的各种失败,需要检查参数 remote_login_passwordfile、sec_case_sensitive_logon 等。

SQL> show parameter remote_login_passwordfile
NAME TYPE VALUE------------------------------------ ----------- ------------------------------remote_login_passwordfile string EXCLUSIVE
SQL> show parameter sec_case_sensitive_logonNAME TYPE VALUE------------------------------------ --------------------------------- ------------------------------sec_case_sensitive_logon boolean TRUE
SQL> select * from v$pwfile_users where username = 'SYS';
USERNAME SYSDB SYSOP SYSAS------------------------------ ----- ----- -----SYS TRUE TRUE FALSE-- SYSDBA 应显示“TRUE”,否则密码文件设置存在问题。

参考 18c and above : All user connections fail with ORA-01017 except SYS when SEC_CASE_SENSITIVE_LOGON=FALSE (Doc ID 2502204.1)。

三、跳过 offline 数据文件备份

因数据库中存在 offline 的数据文件,但不影响正常业务,正常的备份会报错,我们需要 skip inaccessible 跳过有问题的数据文件发起备份。脚本如下:

run{allocate channel ch1 type disk;allocate channel ch2 type disk;allocate channel ch3 type disk;allocate channel ch4 type disk;crosscheck backup;crosscheck archivelog all;delete noprompt backup completed  before 'sysdate-7';delete noprompt archivelog all completed before 'sysdate-5';delete noprompt expired backup;backup as compressed backupset incremental level $BAK_LEVEL format '/data/backup/inc$BAK_LEVEL-%U_%T'  skip inaccessible filesperset 8 database;sql 'alter system archive log current';backup as compressed backupset format '/data/backup/arch_%U_%T' archivelog all not backed up;backup current controlfile tag='bak_ctlfile' format='/data/backup/ctl_file_%U_%T';backup spfile tag='spfile' format='/data/backup/spfile_%U_%T';release channel ch1;release channel ch2;release channel ch3;release channel ch4;}

四、asmcmd 命令执行报错但也能正常使用

这个问题就是当执行 asmcmd 进入命令行时会报 error 但也能正常进入,执行其他的操作命令,影响不是很大。具体如下图所示:

根据 Doc ID 2171853.1 介绍,该警告仅在运行 “asmcmd ”命令时报告一次,此后将不再显示错误。属于 BUG 19178517 - CRSCTL COMMAND SHOW ADDITIONAL TRACE LOGS ( KGFN) IN OUTPUT。

grid@xxxxxx-b2 /home/grid> asmcmdkgfnGetFacility: facility=1119a2c28kgfnInitDiag: diagctx=11198d4b0kgfz_getFacility: facility=1119a2c28Error 4 querying length of attr ASM_DISCOVERY_ADDRESSError 4 querying length of attr ASM_STATIC_DISCOVERY_ADDRESSError 4 opening dom grid in 111a10090kgfn_get_beqinfo: publen=85, vlen=16
ASMCMD>

那么解决办法也就是打这个 BUG 对应的补丁 Patch 19178517: CRSCTL COMMAND SHOW ADDITIONAL TRACE LOGS ( KGFN) IN OUTPUT。

当然,使用以下解决方法也可避免额外的跟踪信息

1- 从 sqlnet.ora 中移除 DIAG_ADR_ENABLED=off

2- 设置变量 ORA_CLIENTTRACE_DIR
例如
export ORA_CLIENTTRACE_DIR=/tmp
然后运行 “asmcmd ”命令

五、当 ADG 主库新增数据文件时,备库 MRP0 宕

这个问题一般发生在 Oracle ADG 环境中,当 ADG 主库因为表空间使用率告警时新增数据文件,用以消除表空间使用率的告警,但是不一会儿 ADG 备库的 MRP0 进程突然就宕了,导致主备库出现 GAP。报错如下:

/u01/app/oracle/diag/rdbms/jiekedg/jiekedg/trace/jiekedg_pr00_36109.trc:ORA-01111: name for data file 18 is unknown - rename to correct fileORA-01110: data file 18: '/u01/app/oracle/product/11.2.0.4/db_1/dbs/UNNAMED'ORA-01157: cannot identify/lock data file 18 - see DBWR trace fileORA-01111: name for data file 18 is unknown - rename to correct fileORA-01110data file 18'/u01/app/oracle/product/11.2.0.4/db_1/dbs/UNNAMED'

那么,这个问题的原因也是由于备库 standby_file_management 参数设置为“MANUAL”导致的,搭建 DG 的管理人员在环境搭建后没有及时改回为“AUTO”,当下一次添加数据文件时无法自动创建相应的数据文件就会出现这样的问题,导致 MRP0 进程宕机。

那么,现在就算将 “standby_file_management” 参数值改回 “AUTO”,重新应用日志 MRP0 也没法启动,主库添加的数据文件也没有同步到备库来。

alter system set standby_file_management=auto;
alter database recover managed standby database using current logfile disconnect from session;
select file_id,file_name from dba_data_files where file_id=18;
no rows selected

但是控制文件中已经记录了 unknown 的这个数据文件在 $ORACLE_HOME/dbs 目录下,实际上本地磁盘上也没有创建成功,这个在前一篇文章 ADG 切换中其实也说过了,解决方案也是一样的。

--执行此命令则可实际在 datafile 目录下创建原大小的数据文件,归档日志全部都传到备库的情况下alter database create datafile '/u01/app/oracle/product/11.2.0.4/db_1/dbs/UNNAMED' as '/data/jiekexuadg/datafile/jiekexu_data18.dbf';
alter system set standby_file_management=AUTO;
--启动 MRP0 进程ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!



分享几个数据库备份脚本

一文搞懂 Oracle 统计信息

我的 Oracle ACE 心路历程

MOP 系列|MOP 三种主流数据库索引简介

Oracle 主流版本不同架构下的静默安装指南

关机重启导致 ASM 磁盘丢失数据库无法启动

Oracle SQL 性能分析(SPA)原理与实战演练

Oracle 11g 升级到 19c 需要关注的几个问题

Windows 10 环境下 MySQL 8.0.33 安装指南

SQL 大全(四)|数据库迁移升级时常用 SQL 语句

OGG|使用 OGG19c 迁移 Oracle11g 到 19C(第二版)

Oracle 大数据量导出工具——sqluldr2 的安装与使用

从国产数据库调研报告中你都能了解哪些信息及我的总结建议

使用数据泵利用 rowid 分片导出导入 lob 大表及最佳实践

在归档模式下直接 rm dbf 数据文件并重启数据库还有救吗?

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347

CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————

JiekeXu DBA之路
JiekeXu:Oracle ACE-Pro,获 Oracle OCP/OCM 及 MySQL OCP 认证,墨天轮 MVP,利用闲时间记录菜鸟 DBA 学习成长之路,所发布文字属于个人观点和学习笔记,如有错误及不当之处,敬请批评指正!
 最新文章