MySQL数据join不走索引问题排查

【问题场景】

有个30多行的大SQL执行效率特别慢,问题集中在一个子查询上,开始没有建索引,可是发现索引都创建了,不走索引,大SQL简化一下,提出不走索引的部分,如下图所示

简单点,有三张表需要关联查询,关联关系如下

A表

B表 关联 A.col = B.id

C表 关联 B.col = C.id

问题出在 B表 关联 A.col = B.id,为啥?执行计划就是不走id主键,C表 关联 B.col = C.id都可以正常走

【解决思路】

1、尝试单表查询,验证索引是否正常 试了一下单表查询B是可以走主键索引,正常,排出索引问题

2、尝试优化SQL 修改了一下SQL,将left join 分别改为inner join,join和子查询,几种方式都不能走索引,排出优化可能

3、尝试在其他环境执行

发现在其他环境下可以正常,走索引,说明不是SQL的问题,排出SQL问题。

TMD !!! 到底哪出问题

既然有环境可以,肯定是哪里配置有问题,慢慢对比一下,于是从表结构,索引创建方式,逐一排查,还是没有发现问题。

没有思路了,困意来袭,下班回家,明日再战


新的一天开始,没办法,在baidu继续搜搜,“SQL 不走索引”

忽然间发现了一篇文章 https://www.cnblogs.com/jarjune/articles/7912722.html

启发了我,是不是两张表的编码方式不一样呢,有思路来,开搞,哈哈 ……

先看表的编码,哇塞,uft8mb4

再看字段的编码,神马,uft8mb4

我们默认都是uft8,谁干的,我的刀呢 …… 修改了表的编码和字段的编码方式,终于可以正常走索引了

【总结】

  • 对于大SQL,不要抱着大西瓜跑步,轻装上路。精确定位问题,简化问题,逐步缩小范围
  • 在一两个人开发的时候,大家都熟悉规范,使用默认的编码方式,一般会忽略编码方式不同的问题,所以团队开发要注意遵守规范
  • 在使用join连接查询的时候,如果编码不一致,就不走索引了

Oracle RAC 集群环境搭建问题

安装前注意事项
1、最好找一个网段的window系统的服务器,我们要通过台电脑做跳板安装grid和oracle以防中途网络掉线,重新安装
2、安装对系统做好备份,最好能够做到如果有有问题能够通过软件还原的方式,还原到安装前某一时刻

 

对于多路径问题
【解决方法】
1、通过mutipath -ll 校验两台服务上对应的磁盘名称以及 wwid是否都相同
参考http://rootking.blog.51cto.com/2619611/476212
2、使用asmlib或者udev都可以,建议使用asmlib

 

安装grid之前确认系统已安装软件列表
【解决方法】

* oracleasm-support-2.1.3-1.el5x86_64.rpm
* oracleasmlib-2.0.4-1.el5.x86_64.rpm
* oracleasm-2.6.18-92.1.17.0.2.el5-2.0.5-1.el5.x86_64.rpm
* libaio
* compat-libcap
* cvuqdisk
* gcc-4.4.4-13.el6 (x86_64)
* gcc-c++-4.4.4-13.el6 (x86_64)

 

ins-41112问题
【解决方法】
使用vdb1-priv和vdb2-priv时需要确认,在2个节点间互信确认后,该步骤任然未通过验证。
节点2 防火墙没有关闭 date 统一时间

 

INS-30507错误:Empty ASM disk group,在安装grid过程中选择配置asm group时候总是找不到问题
【解决方法】
删除以前的重新配置
/etc/init.d/oracleasm deletedisk VOTE_CRS1

 

install的时候调用图形界面异常

【解决方法】

* 首先who看一下当前本机在登陆时候的ip
* export DISPLAY=who中的ip地址:0.0
* xhost+
* 然后可以使用xclock测试是否能够调用图形画界面

 

ins-20802问题 如果没有对scanIP配置 DNS在安装到80%左右会出现报错,问题可以跳过
【解决方法】
log日志中会有如下信息
INFO: Checking Single Client Access Name (SCAN)…
INFO: Checking name resolution setup for “SCAN”…
INFO: ERROR:
INFO: PRVF-4664 : Found inconsistent name resolution entries for SCAN name “SCAN”
INFO: ERROR:
INFO: PRVF-4657 : Name resolution setup check for “SCAN” (IP address: 172.16.9.150) failed
INFO: ERROR:
INFO: PRVF-4664 : Found inconsistent name resolution entries for SCAN name “SCAN”
INFO: Verification of SCAN VIP and Listener setup failed
参考Metalink[ID 887471]文章:
由于配置了/etc/hosts来解析SCAN,导致未走DNS来进行SCAN的解析,爆出此错误,可以考虑忽略掉,或者删除/etc/hosts文件中的SCAN解析部分,并且再次通过nslookup验证DNS的解析是否正常即可。

gird安装检查报os kernel parameter: panic_on_oops问题


【解决方法】
# grep panic_on_oops /etc/sysctl.conf
# sysctl -a | grep panic_on_oops
kernel.panic_on_oops = 1

安装grid过程中出现maximum locked memory check oracle 系统limits.conf配置问题
【解决方法】
Edit the memlock setting in the /etc/security/limits.conf file. The memlock setting is specified in KB, and the maximum locked memory limit should be set to at least 90 percent of the current RAM when HugePages memory is enabled and at least 3145728 KB (3 GB) when HugePages memory is disabled. For example, if you have 64 GB RAM installed, then add the following entries to increase the maximum locked-in-memory address space:
* soft memlock 60397977
* hard memlock 60397977
配置完成之后 需要重新登陆才能生效
ulimit -a 查看配置
也可通过官网中一种解决方法
http://www.oracle.com/technetwork/articles/hunter-rac11gr2-iscsi-3-088680.html

ins-32091 确认跳过问题
【解决方法】

点击yes

安装oralce是时候文件权限问题
【解决方法】
# mkdir -p /u01/app/oracle
# mkdir /u01/app/oracle/cfgtoollogs –needed to ensure that dbca is able to run after the rdbms
installation.
# chown -R oracle:oinstall /u01/app/oracle
# chmod -R 775 /u01/app/oracle

 

官方参考网站
https://docs.oracle.com/database/121/UNXAR/appi_vlm.htm#UNXAR401
https://docs.oracle.com/cd/E11882_01/install.112/e41961/trouble.htm#CWLIN355
https://docs.oracle.com/cd/E11882_01/install.112/e48194/trouble.htm#CWWIN394
http://blog.ronnyegner-consulting.de/2009/09/14/oracle-11g-release-2-install-guide-%E2%80%93-grid-infrastructure-installation/

修改oralce中的pga和sga大小

create pfile=/tmp/pfile.txt from spfile
alter system set sga_max_size=ag scope=spfile;
alter system set sga_target=ag scope=spfile;
alter system set pga_aggregate_target=bg scope=spfile;

 

【问题现象】
在重启的时候有可能会报
ORA-27102: out of memory
Error: 28: No space left on device

 

【原因分析】
这个问题在linux到64位中比较常见,当SGA的值大于共享内存就会报这个错
共享内存在shmall这个参数中设置,shmall单位为页,换算成内存大小还需要把两个值相乘,如shmall=4194304,那么共享内存的大小就是(4194304*4096)/(1024*1024*1024)=16G

方案一:
出现ORA-27102错误,这是我们可以使用备分的参数文件启动数据库;
startup pfile=’/opt/oracle/product/11.1/db_1/dbs/initorcl.ora’;
问题到这里,虽然库可以启动,但参数还是没有改。

方案二:

[root@localhost ~]# vi /etc/sysctl.conf
这是我们可以修改一下系统参数/etc/sysctl.conf文件中的kernel.shmall参数
改之前
——————————————————————————-
fs.file-max = 6553600
kernel.shmall=2097152
kernel.shmmax=2147483648
kernel.shmmni=4096

改之后
——————————————————————————-
fs.file-max = 6553600
kernel.shmall = 4194304
kernel.shmmax = 2147483648
kernel.shmmni = 4096

修改完之后没忘记让它立即生效并确认
# sysctl -p
# cat /proc/sys/kernel/shmall
修改完这些参数后,我们就可以正常启动了

 

Kettle 学习知识总结(三)

接kettle学习知识总结(一)

【注意事项】

1、  如果kettle 转化过程中,要将一张表中数据转化到另一张不同的数据结构表中,最好在进行“表输入”或者“插入/更新”前加入字段选择插件,通过字段选择中的“列映射”,将A表中同类型字段映射到B表中。

2、如果要在SQL语句中引用系统变量使用${xxx}形式,此外还要将“替换SQL语句中里的变量”复选框勾选上,这样在执行的过程中才能正确替换系统变量。

3、  如果在js脚本中系统自带函数不会使用,可以通过鼠标右键点击“Sample”产看函数实例。

4、在kettle开发过程中,尽量使用相对路径,而不是用绝对路径,并将路径参数设置到系统的变量中,这样即便后期对目录结构造成较大的改动,只会对kettle代码产生较小的影响。

5、如果相对已经设置好的表输出——Database field进行设置,首先要将“Specify database fields”复选框进行选中。才能修改。

6、  表输出中“剪裁表”复选框,作用相对先将表中原有内容全部清除,然后重新添加数据。

7、  如果想将日志输出到kettle日志控制台中,要使用utility中的“write to log”工具。否者将不能打印各个步骤执行过程中的步骤。

8、  对于“插入/更新”插件

如果不填写查询关键字参数,既可以实现插入操作

如果填写查询关键字插件,实现的根据查询条件更新数据(注:必须将“update”属性设置为“Y”)

9、  对于kettle中定时插件,在执行时会一直占用某个shell,只有当执行完成之后kettle的定时器才会退出。所以我们在项目中使用linux 定时插件Crontab。