问题引出
在磐维数据库的使用过程中,参数配置至关重要。其中,lower_case_table_names 参数的设置,常常容易被新手忽视,进而引发各种问题。最近多次看到大家因为lower_case_table_names参数设置不当导致返工的问题。所以,在项目启动初期,仔细检查各项参数,确保关键参数和前置条件准确无误,是保障项目顺利推进、按时交付高质量成果的关键。接下来,我们就通过具体实验,深入了解一下这个参数的作用与影响。
lower_case_table_names参数说明
参数说明: 在 MySQL 兼容模式下,控制表名的大小写敏感特性。该参数属于 POSTMASTER 类型参数,数据库服务端参数,在数据库启动时确定,可以通过配置文件指定。
【须知】
该功能仅在数据库兼容模式为 MySQL 时能够使用(即数据库实例初始化时指定 DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。
取值范围: 0,1
- 0:对象名使用创建时的大小写样式保存,在比较判断时使用大小写敏感的方式。
- 1:对象名统一使用小写样式保存,在比较判断时使用大小写不敏感的方式。
默认值: 0
复制
实验过程
检查数据库中默认参数设置
gsql -c "show lower_case_table_names;"
复制
执行结果如下:
[omm@node1 ~]$ gsql -c "show lower_case_table_names;"
lower_case_table_names
------------------------
0
(1 row)
复制
lower_case_table_names参数默认为0,即:表名区分大小写。
构造数据并验证参数的行为
create table TEST (ID int);
\d
select * from test;
select * from "test";
select * from TEST;
select * from "TEST";
复制
执行过程如下:
#创建大写表名的TEST表
postgres=# create table TEST (ID int);
CREATE TABLE
postgres=# \d
List of relations
Schema | Name | Type | Owner | Storage
--------+-------------------------------+-------+-------+------------------------------------------------
public | TEST | table | omm | {orientation=row,compression=no,fillfactor=80}
public | pg_type_nonstrict_basic_value | view | omm |
public | pw_login_info | view | omm |
(3 rows)
可以看到,数据库中存的是大写的表名TEST。
#使用小写的表名查数据
postgres=# select * from test;
ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常
LINE 1: select * from test;
^
#使用带双引号的小写表名查数据
postgres=# select * from "test";
ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常
LINE 1: select * from "test";
^
#使用大写的表名查数据
postgres=# select * from TEST; <----------查询正常
ID
----
(0 rows)
#使用带双引号的大写表名查数据
postgres=# select * from "TEST"; <----------查询正常
ID
----
(0 rows)
复制
总结,当数据库参数lower_case_table_names=0时,表名是区分大小写的,创建表的时候使用了大写的表名,数据库中存的是大写的表名,并且使用小写的表名以及带双引号的小写表名都无法查询数据,使用大写的表名以及带双引号的大写表名都可以查询数据。
修改参数并重启数据库
gs_guc set -N all -D /data/panweidb/data -c "lower_case_table_names=1"
gs_om -t restart
复制
执行过程如下:
[omm@node1 ~]$ gs_guc set -N all -D /data/panweidb/data -c "lower_case_table_names=1"
The pw_guc run with the following arguments: [gs_guc -N all -D /data/panweidb/data -c lower_case_table_names=1 set ].
Begin to perform the total nodes: 3.
Popen count is 3, Popen success count is 3, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 3, Command success count is 3, Command failure count is 0.
Total instances: 3. Failed instances: 0.
ALL: Success to perform gs_guc!
[omm@node1 ~]$ gs_om -t restart
Stopping cluster.
=========================================
Successfully stopped cluster.
=========================================
End stop cluster.
Starting cluster.
======================================================================
Successfully started primary instance. Wait for standby instance.
======================================================================
.
Successfully started cluster.
======================================================================
cluster_state : Normal
redistributing : No
node_count : 3
Datanode State
primary : 1
standby : 2
secondary : 0
cascade_standby : 0
building : 0
abnormal : 0
down : 0
Successfully started cluster.
复制
检查数据库中的参数设置
gsql -c "show lower_case_table_names;"
复制
执行过程如下:
[omm@node1 ~]$ gsql -c "show lower_case_table_names;"
lower_case_table_names
------------------------
1
(1 row)
复制
再次构造数据并验证参数的行为
create table TESTNEW (ID int);
\d
select * from testnew;
select * from "testnew";
select * from TESTNEW;
select * from "TESTNEW";
复制
执行过程如下:
#创建大写表名的TEST表
postgres=# create table TESTNEW (ID int);
CREATE TABLE
postgres=# \d
List of relations
Schema | Name | Type | Owner | Storage
--------+-------------------------------+-------+-------+------------------------------------------------
public | TEST | table | omm | {orientation=row,compression=no,fillfactor=80}
public | pg_type_nonstrict_basic_value | view | omm |
public | pw_login_info | view | omm |
public | testnew | table | omm | {orientation=row,compression=no,fillfactor=80}
(4 rows)
可以看到,数据库中存放的是小写的表名testnew。
#使用小写的表名查数据
postgres=# select * from testnew; <----------查询正常
id
----
(0 rows)
#使用带双引号的小写表名查数据
postgres=# select * from "testnew"; <----------查询正常
id
----
(0 rows)
#使用大写的表名查数据
postgres=# select * from TESTNEW; <----------查询正常
ID
----
(0 rows)
#使用带双引号的大写表名查数据
postgres=# select * from "TESTNEW";
ERROR: relation "TESTNEW" does not exist on dn_6001_6002_6003 <----------查询异常
LINE 1: select * from "TESTNEW";
^
postgres=#
复制
总结,当数据库参数lower_case_table_names=1时,表名是不区分大小写的。创建表的时候使用了大写的表名,数据库中存的是小写的表名,并且使用小写的表名、带双引号的小写表名、大写表名都可以查询数据,使用带双引号的大写表名不可以查询数据。
修改参数后再查询修改参数前创建的表
select * from test;
select * from "test";
select * from TEST;
select * from "TEST";
复制
#使用小写的表名查数据
postgres=# select * from test;
ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常
LINE 1: select * from test;
^
#使用带双引号的小写表名查数据
postgres=# select * from "test";
ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常
LINE 1: select * from "test";
^
#使用大写的表名查数据
postgres=# select * from TEST;
ERROR: relation "test" does not exist on dn_6001_6002_6003 <----------查询异常
LINE 1: select * from TEST;
^
#使用带双引号的大写表名查数据
postgres=# select * from "TEST"; <----------查询正常
id
----
(0 rows)
postgres=#
复制
总结,当把数据库参数lower_case_table_names修改为1后,再查询修改参数之前(lower_case_table_names为0时)创建的大写表名的表,只能用带双引号的大写表名来访问,也可以这么说,数据库参数lower_case_table_names修改为1后,只会对后面新创建的表生效。
总结
通过以上实验,我们对磐维数据库的 lower_case_table_names 参数有了全面的了解:
- 当数据库参数lower_case_table_names=0时,表名是区分大小写的,创建表的时候使用了大写的表名,数据库中存的是大写的表名,并且使用小写的表名以及带双引号的小写表名都无法查询数据,使用大写的表名以及带双引号的大写表名都可以查询数据。
- 当数据库参数lower_case_table_names=1时,表名是不区分大小写的。创建表的时候使用了大写的表名,数据库中存的是小写的表名,并且使用小写的表名、带双引号的小写表名、大写表名都可以查询数据,使用带双引号的大写表名不可以查询数据。
- 当把数据库参数lower_case_table_names修改为1后,再查询修改参数之前(lower_case_table_names为0时)创建的大写表名的表,只能用带双引号的大写表名来访问,也可以这么说,数据库参数lower_case_table_names修改为1后,只会对后面新创建的表生效。
希望大家在使用磐维数据库时,能够充分重视这个参数的设置,避免因参数问题导致不必要的麻烦。
关于作者:
网名:飞天,墨天轮2024年度优秀原创作者,拥有 Oracle 10g OCM 认证、PGCE认证以及OBCA、KCP、ACP、磐维等众多国产数据库认证证书,目前从事Oracle、Mysql、PostgresSQL、磐维数据库管理运维工作,喜欢结交更多志同道合的朋友,热衷于研究、分享数据库技术。
微信公众号:飞天online
墨天轮:https://www.modb.pro/u/15197
如有任何疑问,欢迎大家留言,共同探讨~~~