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

3a76f6c16db5f20508510e2c2cbfb399.gif

作者 | 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之路”关注我的微信公众号,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

前  言

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

420dce3658a6ceafa2ad0b2cf2319f0f.png

一、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)。

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

9c54f937a73f0861150292ec56a37bcc.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/UNNAMED'
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/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之路】,一起学习新知识!

1fe245fd2c938b7b5ab150c739a3837c.gif

分享几个数据库备份脚本

一文搞懂 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
——————————————————————————5612cd72e8675e1768160dba5cf1812a.png

数据库小型MIS开发中,常遇到问题有以下几个: 1. 数据库性能问题:当数据量较大时,查询和插入数据的速度会变慢,导致系统变得不稳定。 解决方法:可以通过优化数据库结构、使用索引、缓存等方式来提高数据库性能。另外,可以使用一些性能监控工具来定位问题所在,如MySQL的slow query日志、Percona Toolkit等。 2. 数据库安全问题数据库中存储着大量的敏感数据,如用户信息、密码等,如果不加以保护,可能会引发数据泄露、数据丢失等安全问题。 解决方法:可以通过加密存储、访问控制、备份恢复等方式来保护数据库的安全。同时,还需要定期对数据库进行漏洞扫描、安全审计等操作,及时发现并修复安全漏洞。 3. 数据库设计问题数据库结构设计不合理,可能会导致数据冗余、数据不一致等问题,影响系统的正常运行。 解决方法:需要在设计数据库结构时,遵循一些设计原则,如避免冗余、保证数据一致性、选择合适的数据类型等。在实际操作过程中,需要不断进行优化和调整,保证数据库的正常运行。 4. 数据库扩展问题:随着业务的扩大,数据库的数据量也会不断增加,需要及时扩展数据库的能力,否则会影响系统的稳定性。 解决方法:可以采用数据分片、读写分离、集群等方式来扩展数据库的能力。同时,还需要考虑数据迁移等问题,保证扩展过程的顺利进行。 以上是常见的数据库小型MIS开发中遇到问题及相对应的解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值