暂无图片
暂无图片
8
暂无图片
暂无图片
3
暂无图片

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

600

前 言

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

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

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

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

SQL> set line 45
SQL> 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 off
SQL> 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_logon
NAME                                 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)。

图片.png

三、跳过 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 但也能正常进入,执行其他的操作命令,影响不是很大。具体如下图所示:

图片.png

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

grid@xxxxxx-b2 /home/grid> asmcmd
kgfnGetFacility: facility=1119a2c28
kgfnInitDiag: diagctx=11198d4b0
kgfz_getFacility: facility=1119a2c28
Error 4 querying length of attr ASM_DISCOVERY_ADDRESS
Error 4 querying length of attr ASM_STATIC_DISCOVERY_ADDRESS
Error 4 opening dom grid in 111a10090
kgfn_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 file
ORA-01110: data file 18: '/u01/app/oracle/product/11.2.0.4/db_1/dbs/UNNAMED00018'
ORA-01157: cannot identify/lock data file 18 - see DBWR trace file
ORA-01111: name for data file 18 is unknown - rename to correct file
ORA-01110: data file 18: '/u01/app/oracle/product/11.2.0.4/db_1/dbs/UNNAMED00018'
复制

那么,这个问题的原因也是由于备库 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之路】,一起学习新知识!
——————————————————————————
公众号: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
——————————————————————————

facebook_pro_light_1920 × 1080  副本.png

最后修改时间:2024-09-27 10:17:34
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

星星之火
暂无图片
3月前
评论
暂无图片 0
再好的记忆力也不如将事情记录下来可靠。通过书写,不仅可以帮助记忆,还能随时查阅,避免遗忘。
3月前
暂无图片 点赞
评论
A
admin@@
暂无图片
3月前
评论
暂无图片 0
大佬
3月前
暂无图片 点赞
评论
鲁鲁
暂无图片
5月前
评论
暂无图片 0
好记性不如烂笔头,感谢记录分享
5月前
暂无图片 点赞
评论