当前位置:网站首页 > 数据科学与大数据 > 正文

db2数据库创建(db2数据库创建、恢复及常用命令)



目录

1.在服务器中,登录DB2用户,并连接DB

2.Local命令行启动,连接DB

3.查询各种一览(Table一览,Column一览)

・查看Schema中,表一览

・查了表中,Column一览

・查看表空间List

4.SQL

4.1.执行查询SQL

★★★tvf的含义★★★

4.2.创建表时,指定表空间

4.3.创建表空间

4.4. ★★★★★★常用SQL操作★★★★★★

5.存储过程创建・执行

・定義

・作成

・実行

・実行 (单独执行)

・查看 所有的 存储过程

・删除存储过程

6.其他操作 (普通操作)

6.0.导出数据

6.1.导入数据

6.2.常用SQL文

6.3.伪表  【sysibm.sysdummy1】 (从伪表中,查看当前时间)

6.4.左外连接

6.5.db2 date 数据类型 查询条件时 是否需要使用日期转换函数

6.6.唯一约束(ユニーク制約)

6.7.xxx

6.8.xxx

6.9.xxx

7.其他知识点,其他操作 (调查时需要的操作)

7.1.DB2 用户

7.2.DB2 控制中心

7.3.查看DB编码信息

7.4.本地的exe执行程序的目录,cmd运行设置

7.5.本地(windows)要启动的服务

7.6.使用A5连接

7.7.查看 与 数据库  连接 的 进程、关闭进程、重新启动数据库

7.8.表空间:默认4K

7.9.db2检索,按照空格补齐原则进行检索的。

7.10.DB2创建临时表空间

7.11.支持 !=

7.12.创建数据库

7.13.创建表空间

7.14.创建表 (创建时,指定表空间)

7.15.创建 BufferPool

7.16.创建  Gupup

7.17.DB2 更改表名

7.18.查看数据库表的索引

7.19.查看表空间

7.20.【Data】与【TimeStamp】

7.21.AIX服务器 DB2 log 在什么位置

7.22.DB2 数据库 导出 整个数据库定义 的 ddl

7.23.备份数据

7.24.坑 null,<>null

7.25.删除表中所有数据

7.26.索引项目的值,可不可以重复

7.27.创建 唯一索引 与 非唯一索引的语句一样吗

7.28.在DB2中,什么是 HADR database

7.29.db2 如何通过命令确认, 何区分那个数据库是主数据库,那个数据库是 备用数据库

7.30.A5 2.14.X 无权限修改,本地表中数据时(不使用SQL,直接在查询的表中修改)

7.31.xxx

8.查看数据库配置信息---Select SQL文 

8.1.查看Schema

8.2.查看所有的表

8.3.查看表中所有的字段

8.4.查看用户--拥有的---表的操作权限

8.5.查看表的索引

8.6.要查看 DB2 数据库中的索引【列】信息,你可以使用以下 SQL 查询

8.7.XXX

8.8.XXX

9.DB2命令参数

10.注意点

10.1.修改表结构时,修改之后,要执行下面的语句

10.2.XXX

10.3.XXX

10.4.XXX

11.★★★错误分析调查★★★

11.01.各种错误整理

11.02.查看表的状态,是否是【load pending】 // 表无法使用时,查看

11.03.常见错误(没有【REORG】造成【SQLCODE=-668】)

11.04.直接使用【REORG table schema.tableName】时报错

11.05.【权限问题】SQLCODE: -552, SQLSTATE: 42502

11.06.【权限问题】SQL1092N

11.07.SQLCODE=-803, SQLSTATE=23505

11.08.SQLSTATE=08001

11.09.★★★【22001】★★★SQLCODE=-302, SQLSTATE=22001  超长

11.10.★★★【23502】★★★10.SQLCODE: -407, SQLSTATE: 23502, SQLERRMC: TBSPACEID=2, TABLEID=640, COLNO=55   插入非空字段

11.11.DB2 SQLCODE=-206, SQLSTATE=42703 定义表字段问题

11.12.SQLCODE=-104, SQLSTATE=42601 SQL语法错误

11.13.SQLCODE=-911, SQLSTATE=40001,SQLERRMC=68 乐观锁

11.14.SQLCODE=-952, SQLSTATE=57014   

11.15.SQLSTATE=57019

11.16.SQL1776N

11.17.ERRORCODE=-4214 // 密码过期,或 密码被锁

11.18.ERRORCODE=-4461, SQLSTATE=42815 (JPA 主键)

11.19.XXX

11.20.XXX

11.21.XXX

11.22.XXX

11.23.XXX

12.事务

12.1.事务隔离

12.2.查看未提交的事务

12.3.查看锁表信息

12.4.断掉连接

12.5.xxx

13.函数

0.IBM官网查询

13.1.NVL

13.2.字符串拼接 ||

13.3.trim

13.4.substr

13.5.length

13.6.case when

13.7.xxx

13.8.xxx

13.9.xxx

13.10.xxx

13.11.xxx

14.存储过程与Package

查看存储过程有无错误 (每一个存储过程,会生成一个对应的package)

【DB2 存储过程 和 Package 之间有什么关系】

【DB2 Package 的 VALID 是什么意思】

【存储过程 VALID 的值是 N的原因】

15.数据库进程

介绍一下 db2 相关的两个进程 db2fmcd 和 db2sysc

db2除了进程 db2fmcd 和 db2sysc,还有什么其它的进程

16.IBM 官方 DB2 帮助文档

1.事务隔离级别

2.XXX

17.特殊处理

17.1.模拟INSERT FOR UPDATE

18.更多命令操作

19.DB2数据类型


==========

=================================

sudo su -

su - DBUser

db2 connect to XXXDB

db2 set schema SchemaName

或者 (db2 set current schema = SchemaName

查看切换后,当前的Schema的状态 (db2 values current schema)

 
   

===

 
   

===

・查看Schema中,表一览

 
   

・查了表中,Column一览

 
   

查看表空间List

 
   

===

4.1.执行查询SQL

cd /XXXXXX/XXX/   补足说明,一般DB Server会指定一个「DBUserXXX」可以访问的目录,用于执行SQL文

db2 -tvf "/XXXXXX/XXX/xxx.sql"

db2 -tvf /XXXXXX/XXX/xxx.sql  -z XXX.log

或者 (db2 -stvf /XXXXXX/XXX/xxx.sql)

 
   

★★★tvf的含义★★★

  • "t" 代表 "terminate",表示在执行 SQL 脚本后自动终止数据库连接。
  • "v" 代表 "verbose",表示以详细模式运行 SQL 脚本,输出更多的执行信息。
  • "f" 代表 "file",表示 xxx.sql 是一个包含 SQL 命令的文件。

    "t" 代表?:
    还是下面的含义?  (好像不是这个含义)
    -t:设置命令行界面中查询结果的格式。使用 -t 参数可以在结果中去掉标题(column names)以及以竖线分隔每个字段的空白字符。这样可以使得结果更加紧凑,适合于导出数据或将结果传递给其他命令进行进一步处理。









===

4.2.创建表时,指定表空间

create table 名字 (属性)in 表空间

4.3.创建表空间

create tablespace 表空间名字 pagesize 16k managed by database using (FILE ‘D:/tablespacename/cont1’ 1000)

===

DB2的SQL操作:update、fetch、left join、alter 等等_db2 fetch-CSDN博客

===

・定義

test2.sql

 
   

test2.sql 

====最简单的存储过程 (没有参数)

 
   

==== 稍微复杂的存储过程,有参数,有循环,有变量定义

 
   

====

・作成

 
   

====

・実行

 
   

・実行 (单独执行)

 
   

・查看 所有的 存储过程

 
   

・删除存储过程

 
   

===

6.0.导出数据

执行下面的命令

db2 -tvf https://blog.csdn.net/sxzlc/article/details/export.sql

===

export.sql

!!!注意!!!:文件的换行要是Linux换行,不然回出错。

===

 
   

==========或者(全量导出)

EXPORT TO filename.csv OF DEL SELECT * from schemaName.yourTableName ordey by xxx with cs

会在当前目录下,生成【filename.csv】文件

======

扩展1:【DEL】 的含义:文本格式

在Db2中,导出数据时的"DEL"意味着将数据以分隔符(delimiter)分隔的文本文件格式进行导出。默认的分隔符是逗号(","),但也可以使用其他字符作为分隔符。

在Db2中,"OF"是指定导出数据文件的输出格式的关键词。在导出数据时,可以使用不同的输出格式来控制导出的文件类型和结构。当使用"OF DEL"时,表示输出的文件格式为以分隔符(delimiter)分隔的文本文件。

例如:

扩展2:如何显示列名

EXPORT TO ...
 SELECT 1 as id, 'COL1', 'COL2', 'COL3' FROM sysibm.sysdummy1
 UNION ALL
 (SELECT 2 as id, COL1, COL2, COL3 FROM myTable)
 ORDER BY id










================================

6.1.导入数据

XXX.sql

 
   

6.2.常用SQL文

DB2的SQL操作:update、fetch、left join、alter 等等_db2判断字段是否包含某个字符串_sun0322的博客-CSDN博客

6.3.伪表  【sysibm.sysdummy1】 (从伪表中,查看当前时间)

 
   

6.4.左外连接

 
   

===

6.5.db2 date 数据类型 查询条件时 是否需要使用日期转换函数

xxx

对于DB2数据库中的DATE数据类型,一般不需要使用日期转换函数作为查询条件。DB2数据库在处理日期数据类型时,会自动将字符串类型的日期值转换为DATE类型,以便进行比较和计算

例如,假设有一个名为"table1"的表,其中一个列名为"date_column",其数据类型为DATE。我们想要查询该表中某个日期范围内的数据,可以直接使用日期值作为查询条件,无需使用日期转换函数。

示例查询: SELECT * FROM table1 WHERE date_column >= '2021-01-01' AND date_column <= '2021-12-31';

上述查询语句中,我们直接使用字符串类型的日期值作为查询条件,DB2数据库会自动将其转换为DATE类型,然后进行比较操作。因此,在查询DATE数据类型时,通常不需要使用日期转换函数

xxx

在DB2数据库中,对于DATE数据类型的查询条件,通常不需要在日期前面补零。DB2数据库会自动识别并解析日期值。

例如,如果要查询某一天的数据,可以直接使用日期格式"YYYY-MM-DD",无需在月份和日期前面补零。DB2数据库会正确识别并处理。

示例查询: SELECT * FROM table1 WHERE date_column = '2021-01-01';

上述查询语句中,我们直接使用字符串类型的日期值"2021-01-01"作为查询条件,无需在月份和日期前面补零。DB2数据库会自动解析该日期,并进行比较操作。

需要补零的情况通常是在字符串拼接或者动态生成查询条件时,为了保证日期格式的统一。但在直接写查询语句时,通常不需要补零。

xxx

6.6.唯一约束(ユニーク制約)

enforced   英[ɪnˈfɔːst]   强迫的

添加

 
   

×

 
   

删除

 
   

xxx

6.7.xxx

xxx

6.8.xxx

xxx

6.9.xxx

xxx

7.1.DB2 用户

DB2依赖操作系统的安全性,自身没有用户,直接看操作系统中有哪些用户就行

 既,你只要手动添加一个db2user,就可以使用这个用户连接数据库。

7.2.DB2 控制中心

7.3.查看DB编码信息

db2 get db cfg for DBName

或者连接DB后「db2 connect to XXXDB」,再执行「db2 get db cfg

 
   

===

7.4.本地的exe执行程序的目录,cmd运行设置

其中【db2cmd】是在以下目录下,并且在环境变量中有设置

C:IBMSQLLIBBINdb2cmd.exe

如果在环境变量中没有设定,要像下面这么写

runas /user:du2user "C:IBMSQLLIBBINdb2cmd cd /D %~dp0"

7.5.本地(windows)要启动的服务

【DB2 -DB2COPY1-DB2】

实际文件保存目录

C:IBMSQLLIBBINdb2syscs.exe

7.6.使用A5连接

直接server连接

serverName:50000

DBName

7.7.查看 与 数据库  连接 的 进程、关闭进程、重新启动数据库

su - xxxUser

db2 connect to XXXDB

db2 set schema SchemaName

db2 values current schema

----

db2 list applications

db2 "force application(xxxAppl Handle)"

db2stop

db2start

====

7.8.表空间:默认4K

   超出长度时,会报如下错误

   SQL0670N 表的行长度超过 "4005" 字节的限制。 SQLSTATE=54010
 

7.9.db2检索,按照空格补齐原则进行检索的。

db2检索,按照空格补齐原则进行检索的。  statement和prepareStatement都一样,找一方长度长的,把另一方后边空格补齐。  

7.10.DB2创建临时表空间

create temporary tablespace "xxx" IN DATABASE yourDatabase

DB2配置临时表空间_db2 临时表空间_shhcodelife的博客-CSDN博客

7.11.支持 !=

ANSI标准中是用<>(所以建议用<>),但为了跟大部分数据库保持一致,数据库中一般都提供了 !=(高级语言一般用来表示不等于) 与 <> 来表示不等于:

7.12.创建数据库

7.13.创建表空间

create temporary tablespace "TS_yourTableSpaceNameXXX" IN DATABASE PARTITION GROUP IBMTEMPGROUP
    PAGESIZE 8092 MANAGED BY AUTOMATIC STORAGE
    USING STOGROUP "IBMTEMPGROUP"
    EXTENSIZE 32
    PREEFFTCHSIZE AUTOMATIC
    BUFFERPOLL "BP_yourBufferPollName"
    OVERHEAD INHRIT
    NO FILE SYSTEM CACHING
    DROPPED TABLE RECOVERY OFF;






















7.14.创建表 (创建时,指定表空间)

create table yourSchemaName.yourTableName (

...

) IN "TS_yourTableSpaseName"  INDEX IN "yourIndexName"

xxx

7.15.创建 BufferPool

db2 "CREATE BUFFERPOOL BP_XXXXX PAGESIZE 8K"

7.16.创建  Gupup

xxx

7.17.DB2 更改表名

rename table testtable to testtable1

7.18.查看数据库表的索引

select * from syscat.indexes where tabname='YourTableName' and tabschema='YourSchemaName';

7.19.查看表空间

===

。。。。

7.20.【Data】与【TimeStamp】

create table Schema1.testTable(

   id Character(11) not null

   , testDate Date default Null

   , testTimeStamp TIMESTAMP default NULL

   , primary key(id)

)

 
   

===

使用命令行查看,显示的值如下

2023-10-10

2023-10-10 12:12:12.000000

使用A5查看,显示的值如下

2023/10/10

2023/10/10 12:12:12

java代码,使用JPA,从数据库里面取出的值如下

2023-10-10

2023-10-10 12:12:12.0

7.21.AIX服务器 DB2 log 在什么位置

====

7.22.DB2 数据库 导出 整个数据库定义 的 ddl

db2look -d database_name -a -e -l -x -o /AAAA/BBBB/CCCC/output_file.sql

7.23.备份数据

export to /DB/tmp//XXXTable.CSV OF DEL SELECT * FROM XXXTable ORDER BY XXX with cs;

xxx

上面的SQL语句,可以写到【bakupXXXTable.sql】文件中,在使用下面命令执行

db2 -stvf /DB/tmp//bakupXXXTable.sql > bakup_result.txt

===

7.24.坑 null,<>null

MySQL,DB2  都存在此问题

场景1:mysql不等值查询 name<>'张三' ,但是查询不出name 为null的值。

场景2:mysql 不等值查询 name<>null ,但是查询不出name 为null的值。

【分析】

这个问题很坑,一直以为null值能查询出来,<> 属于算术运算符,因此null值不能参入运算。

xxx

7.25.删除表中所有数据

 
   

--

 
   

---

  1. 清空表数据(Truncate Table): 这个方法会立即删除表中的所有数据,并释放表所占用的存储空间。语法中的关键字用于指示立即执行该操作。
     

    使用可以快速清空表数据,但要注意的是,这个操作不会激活触发器,并且不会记录在事务日志中,因此无法回滚。

  2. 分批删除数据(Delete in Batches): 这种方法通过循环分批次删除数据,每次删除一定数量的行,以避免一次性删除大量数据可能带来的性能问题。在每个批次中,会删除符合条件的一定数量的行,并提交事务,以确保删除操作的原子性和数据一致性。
     

    这个语句会从表中选择满足条件的前5000行数据,并将其删除。通过循环调用这个语句,可以逐步删除表中的数据。需要注意的是,这个方法可能会引起数据库锁定和性能问题,特别是在大型表中操作时,因此需要谨慎使用。

根据你的需求和具体情况,选择合适的方法来删除表中的数据。

==

7.26.索引项目的值,可不可以重复

在数据库中,索引的值可以重复也可以不重复,这取决于索引的类型。主要有以下两种类型的索引:

  1. 唯一索引(Unique Index):唯一索引要求索引列中的值都是唯一的,即不允许重复值。当你尝试在唯一索引列中插入已经存在的值时,数据库会报错并拒绝操作。唯一索引通常用于确保数据完整性和避免重复数据。
  2. 非唯一索引(Non-Unique Index):非唯一索引允许索引列中存在重复的值。这意味着你可以在非唯一索引列中插入任意值,即使已经存在相同的值。非唯一索引常用于加快查询速度,但不要求索引列中的值唯一。

因此,索引项目的值可以重复,也可以不重复,具体取决于索引的定义。

xxx

7.27.创建 唯一索引 与 非唯一索引的语句一样吗

创建唯一索引和非唯一索引的语句在某些方面相似,但在关键部分有所不同。下面是一些通用的数据库管理系统(如MySQL、PostgreSQL、Oracle等)中创建唯一索引和非唯一索引的基本语法示例:

创建非唯一索引的语法示例:

 
   

创建唯一索引的语法示例:

 
   

关键区别在于在创建唯一索引时,在语句之后使用了关键字来确保索引中的值是唯一的。这意味着在插入或更新数据时,数据库系统会检查索引中的值是否已经存在,如果已经存在,则会触发错误。而创建非唯一索引时则没有这个限制,允许索引中存在重复的值。

请注意,是索引的名称,是表的名称,是要创建索引的列的名称。

7.28.在DB2中,什么是 HADR database

在DB2中,HADR(High Availability Disaster Recovery)是一种数据库复制和故障转移解决方案,用于提供高可用性和灾难恢复能力。HADR主要针对主数据库和备用数据库之间的复制和故障转移功能。

具体来说,在DB2中,HADR database是指配置了HADR功能的数据库。一般情况下,HADR是通过设置主数据库和备用数据库之间的同步复制来实现的,以确保备用数据库保持与主数据库的同步。在HADR配置中,主数据库负责处理所有的写操作,并将这些写操作发生到备用数据库,同时备用数据库也是可读的。当主数据库发生故障或不可访问时,备用数据库可以接管并成为主数据库,从而实现无缝的故障转移和高可用性。

HADR数据库提供了对数据库故障的快速恢复功能,能够帮助组织提高数据库系统的可用性并减少业务中断时间。在DB2中配置和管理HADR数据库需要特定的权限和技能,需要确保在使用HADR功能时遵循最佳实践和安全性要求。

xxx

7.29.db2 如何通过命令确认, 何区分那个数据库是主数据库,那个数据库是 备用数据库

 
   

在DB2数据库中,可以使用以下命令来确认主数据库和备用数据库,并区分它们的角色:

  1. 查看数据库状态:
     

    这个命令会返回数据库的详细信息,包括它们的角色,以及与高可用性和灾难恢复相关的信息。在输出结果中,可以查看以下字段来确定数据库的角色:

    • Primary(主数据库)
    • Standby(备用数据库)

xxx

7.30.A5 2.14.X 无权限修改,本地表中数据时(不使用SQL,直接在查询的表中修改)

xxx

7.31.xxx

xxx

8.1.查看Schema

db2 "select schemaname from syscat.schemata"

8.2.查看所有的表

db2 "select name from sysibm.systables where type='T' and creator=''schemaName"

8.3.查看表中所有的字段

db2 "select name from sysibm.syscolumns where tbname='tableName' and tbcreator=''schemaName"

8.4.查看用户--拥有的---表的操作权限

db2 "select * from syscat.tabauth where TABSCHEMA='yourSchemaName';"

xxx

8.5.查看表的索引

 
   

上面查询到的是索引的名字等信息,并没有索引是关联表中哪个字段(【列】)的信息

8.6.要查看 DB2 数据库中的索引【列】信息,你可以使用以下 SQL 查询

这里面可以显示和索引相关的【列】

 
   

==

将 替换为表所在的模式名称,将 替换为表的名称。

这个查询会返回指定表的所有索引的信息,包括索引名称 ()、模式名称 ()、表名称 ()、索引列 () 和唯一规则 ()。

xxx

xxx

8.7.XXX

xxx

8.8.XXX

xxx

====

10.1.修改表结构时,修改之后,要执行下面的语句

    REORG TABLE yourSchema.YourTableName

 A、 reorg  table   .   通过重构行来消除“碎片”数据并压缩信息,对表进行重组。表名必须是用     全限定的。

 B、reorg还有一个功能就是可以将表中的数据按照某个索引关键字的顺序排列,从而可以减少某些查询I/O的数量。

10.2.XXX

xxx

10.3.XXX

xxx

10.4.XXX

xxx

11.01.各种错误整理

DB2的ErrorCode 以及各种错误调查_db2 error code_sun0322的博客-CSDN博客

11.02.查看表的状态,是否是【load pending】 // 表无法使用时,查看

【load pending】时,此表无法使用!

 
   

===

11.03.常见错误(没有【REORG】造成【SQLCODE=-668】)

建议在每次使用完alter 操作后都执行一次reorg。

如果不执行,大概率会,报错这个问题:

DB2 SQL Error: SQLCODE=-668, SQLSTATE=57016

11.04.直接使用【REORG table schema.tableName】时报错

因为在某些  图形界面的数据库连接软件中(比如A5),不支持直接这么使用,按照下面方式使用即可成功。

CALL SYSPROC.ADMIN_CMD('REORG  table schema.tableName') 

在命令行中,可以直接使用,但是注意,要带上双引号,不然提示 SQL2211N 表不存在

db2 "REORG  table schema.tableName"

11.05.【权限问题】SQLCODE: -552, SQLSTATE: 42502

11.06.【权限问题】SQL1092N

创建数据库,需要管理员权限

db2 create db yourDB on 'C:' USING CODESET IBM-943 TERRITORY JP

db2 connect to yourDB

territory  英 [ˈtɛrɪtərɪ] n. 领土;地区;范围;领域

11.07.SQLCODE=-803, SQLSTATE=23505

违反唯一约束。

(解决:查看主键採番的【值】、有唯一约束的字段的【值】,在现有的数据中是否存在)

发生原因:数据不整合。(不是实际环境跑出来的数据,手动投入数据,造成不整合。)

11.08.SQLSTATE=08001

AIX db2 User 登录时异常USERID DISABLED or  RESTRICTED

SQL30082N  Security processing failed with reason "19" ("USERID DISABLED or RESTRICTED").  SQLSTATE=08001

===

===

将锁定用户对应的unsuccessful_login_count=xxx改成=0后保存退出就行

11.09.★★★【22001】★★★SQLCODE=-302, SQLSTATE=22001  超长

插入时报错

插入数据时,某个字段超出了  数据库中 定义的 该字段 的长度。

预编译查询时报错(包括JPA的预编译查询)

当使用PreparedStatement的预编译的模式,即:PreparedStatement ps = conn.prepareStatement("select * from A where a=?");ps.setString(1, "x");时,

如果位数超长,也会报出上述的异常;

=============

★★★★★★★  ↑ 这个错误,无法确认出到底那个字段超长,只能一个个的确认。。。。。★★★★★★★

===========

11.10.★★★【23502】★★★10.SQLCODE: -407, SQLSTATE: 23502, SQLERRMC: TBSPACEID=2, TABLEID=640, COLNO=55   插入非空字段

11.11.DB2 SQLCODE=-206, SQLSTATE=42703 定义表字段问题

要查询的字段不存在时,便会出现这个错误

xxx

11.12.SQLCODE=-104, SQLSTATE=42601 SQL语法错误

SQL语法错误时,出现如下错误提示

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601

11.13.SQLCODE=-911, SQLSTATE=40001,SQLERRMC=68 乐观锁

JPA:理由コード(SQLERRMC)68

乐观锁

乐观锁错误通常发生在第一个用户提交事务时。当第一个用户在读取数据后,另一个用户修改了同样的数据并提交了修改,此时第一个用户提交事务时会发现数据已经被修改,导致乐观锁错误。乐观锁的实现通常是在更新数据时先检查数据版本号或者时间戳,如果当前的数据版本号比预期的要旧,就会出现乐观锁错误。

org.apache.openjpa.persistence.OptimisticLockException

====

【问】:在查询的时候竟然也会报这个错误!!!??

     查询时,使用的是默认的事务隔离级别【with cs】  游标稳定性 

                        stability  英 [stəˈbɪlɪtɪ] n. 稳定(性);坚定

在数据库操作中,乐观锁(optimistic lock)通常用于处理并发访问的问题。当多个用户同时对同一条数据进行读取和修改操作时,可能会出现乐观锁错误。在单纯查询处理时,通常不会触发乐观锁错误,因为查询操作本身不涉及对数据的修改。

乐观锁通常发生在涉及数据修改的操作中,例如更新或删除操作。当多个用户同时对同一条数据进行更新或删除时,系统会检测到数据的版本冲突,从而引发乐观锁错误。在这种情况下,数据库系统会根据设定的乐观锁策略(如版本号、时间戳等)来判断哪个操作应该被允许执行,哪个操作应该被阻塞或回滚。

因此,在单纯查询处理时,不会发生乐观锁错误。乐观锁主要用于处理并发数据修改操作时的冲突,以确保数据的一致性和完整性。

今天一位同学,更新数据库后,没有提交事务,然后程序运行时,在一处检索处理中,报了这个错误。。。

【答】:OpenJAP 查询的时候,会先取得锁,所以会报乐观锁的错。

====

查看未提交的事务(数据库被锁的情况) SQL

 
   

xxx

解决1

db2 list aplications

db2 "force application(XXXX)"

db2stoop

db2start

解决2

找到死锁数据库的人(事务一直没有提交的人)

  上面【查看未提交事务】时,会得到一个  ID(AGENT_ID),这个ID和【db2 list aplications中某条记录的(appl.handle)是可以对应的,db2 list aplications中每条记录都有IP (Application ID : IP.xxxxx),找到那个IP对应的人。让他把事务提交,问题即可解决。

           ↑ 这里面还可以看到应用程序信息,比如本地连接数据库时,显示 A5M2.exe

            ↑ 本地每次连接时,都会创建(分配)一个(appl.handle),只要不断开连接,这个ID一直保持不变。

解决3

===

11.14.SQLCODE=-952, SQLSTATE=57014   

等待另外一个事务终了超时

系统动作:SQL语句已终止,并且对该语句所做的任何更改都已撤消。如果SQL游标与中断的SQL语句相关联,则该游标将关闭。

xxx

11.15.SQLSTATE=57019

数据库服务没有启动成功。(电脑右下角的数据库图标上,有一个红色的方块。)

xxx

11.16.SQL1776N

有主副DB服务器,连接副(备用数据库(standby))时,出现此错误

SQL1776N The command cannot be issued on an HADR database. Reason code = "1".

错误代码 SQL1776N 告诉你无法在 HADR database 上执行该命令,原因码为 "1"。这个错误通常发生在试图在 HADR(高可用性和灾难恢复)数据库上执行不允许的操作时。

在 HADR 配置中,有一个主数据库(primary)和一个或多个备用数据库(standby)。主数据库用于处理写操作和大部分读操作,而备用数据库则用于复制主数据库的数据以提供冗余和故障转移。

由于备用数据库是被动的,不接受写操作,所以在备用数据库上执行一些更改操作是不允许的。常见的一些不允许的操作包括插入、更新、删除数据等。

如果你需要在 HADR 数据库上执行某些操作,你可以先将数据库角色切换为主数据库,然后再执行操作。切换数据库角色的具体步骤取决于你的数据库管理系统和配置。

请注意,执行操作时要谨慎,尽量避免在备用数据库上执行写操作,以确保数据的一致性和可用性。如果你需要进一步理解和解决这个问题,可以提供更多相关信息,我将尽力帮助你。

xxx

11.17.ERRORCODE=-4214 // 密码过期,或 密码被锁

lsuser -f userName | grep maxage

===

xxx

11.18.ERRORCODE=-4461, SQLSTATE=42815 (JPA 主键)

JPA、EJB、事务管理、WebSphere ---相关内容整理_ejb jpa-CSDN博客

===

org.apache.openjpa.persistence.PersistenceException:[jcc][t4][10145][10897][4.28.11]パラメーター 0 が無効:パラメーター索引が範囲外です。ERRORCODE=-4461, SQLSTATE=42815

==

xxx

11.19.XXX

xxx

11.20.XXX

xxx

11.21.XXX

xxx

11.22.XXX

xxx

11.23.XXX

xxx

===

 
   

===

※:  在使用第三方 DB 工具中, 验证事务时,比如A5,要打开两个窗口进行检证。
(同一个窗口,使用的是共同的事务,使用两个窗口,可以开启两个不同的事务)

db2 list applications show detail

该命令显示所有正在运行的应用程序的相信信息,

包括事物ID,状态,开始时间和SQL语句。

未提交的事物,状态为“UOW Waiting”

如果想查看特定 未提交的事务,使用下面命令,可以显示事物的详细信息

db2 get snapshot for application

命令

db2 get snapshot for locks on databasename

或者

db2 list application for database yourDatabaseName show detail

命令

force application all // 强行终止所有lianjie

terminate // 清除所有db2的后台进程

或者

force application 进程ID  // 选择特定的进程ID,Kill掉

xxx

TIMESTAMP_FORMAT scalar function - IBM 文档

==

NVL(字段,如果为NULL则为值)

如果为 NULL 时,显示的值 (空串不作为NULL判断

使用【||】即可实现字符串拼接

trim(字段)

去掉空格

length(字段)

xxx

xxx

xxx

xxx

xxx

查看存储过程有无错误 (每一个存储过程,会生成一个对应的package)

db2 "select substr(PKGNAME,1,20), VALID, CREATE_TIME from syscat.packages where PKGSCHEMA='yourSchema'"

删除存储过程时,对应的记录也会被删除掉 !!!

 
   

===

【DB2 存储过程 和 Package 之间有什么关系】

DB2存储过程和Package是DB2数据库中的两个不同的对象,但它们之间有一定的关系。

・存储过程是一组经过预编译和优化的SQL语句,可以重复调用,用于完成特定的任务。存储过程可以包含标准SQL语句和控制语句,以及一些特定于DB2的扩展语句。

・Package是一个编译单元,它包含预编译SQL语句的信息和执行计划。当存储过程被创建时,DB2会自动创建一个与该存储过程相关的Package,并将其存储在数据库中。当存储过程被调用时,DB2会自动检查相应的Package是否存在,如果存在,则执行相应的SQL语句。

【DB2 Package 的 VALID 是什么意思】

DB2 Package 的 VALID 表示该 Package 已经被验证过。在 DB2 中,Package 是一个编译好的 SQL 程序的二进制形式,它可以被多次执行,而不需要重新编译。在执行 Package 之前,DB2 会对其进行验证,以确保其语法正确、权限合法等方面的问题。如果 Package 通过验证,则可以被执行,否则将会报错。因此,Package 的 VALID 状态非常重要,它表示该 Package 已经可以被安全地执行。

【存储过程 VALID 的值是 N的原因】

存储过程的 VALID 值为 N 可能有以下原因:

・存储过程的语法错误或逻辑错误:如果存储过程中存在语法错误或逻辑错误,可能导致该存储过程无法被正确编译或执行,从而导致 VALID 值为 N。

===

・存储过程依赖的对象不存在或被修改:如果存储过程依赖的表、视图、函数等对象不存在或被修改,可能会导致存储过程无法被正确执行,从而导致 VALID 值为 N。

====

・存储过程权限不足:如果存储过程所在的用户没有执行该存储过程的权限,或者存储过程依赖的对象所在的用户没有被授予执行权限,也可能导致 VALID 值为 N。

====

・存储过程被禁用:如果存储过程被管理员或数据库管理系统禁用,可能会导致 VALID 值为 N。

===

・存储过程未被正确创建:如果存储过程未被正确创建,或者存储过程所在的数据库或表空间不存在,也可能导致 VALID 值为 N。

注意!!! 每个用户都有自己的进程

介绍一下 db2 相关的两个进程 db2fmcd 和 db2sysc

和是与IBM Db2数据库相关的两个进程。

  • :Db2 Fault Monitor进程。它是一个系统级的守护进程,负责监控Db2数据库引擎的运行状况。如果引擎意外关闭或发生故障,会启动自愈功能,尝试恢复引擎的正常运行状态。它还负责收集运行状况和诊断数据,以供后续故障分析和调试。
  • :Db2系统服务进程。它是Db2数据库引擎的核心组成部分,负责处理来自客户端的请求,并执行数据库的各种操作。进程通常会有多个实例运行,每个实例对应一个Db2数据库。它提供了多线程、并发处理、数据缓存、日志管理等核心功能,以实现高性能的数据库操作。

这两个进程在Db2数据库的运行过程中起到重要的作用:

  • 保证了数据库引擎的高可用性和自愈能力,能够自动尝试修复引擎出现的故障。
  • 处理来自客户端的请求,负责管理和操作数据库的各个方面,如查询、修改、事务管理等。

需要注意的是,进程名称可能在不同版本和配置的Db2数据库中有所不同,上述介绍是基于一般情况下的命名约定和功能。详细的信息可以参考Db2文档。

db2除了进程 db2fmcd 和 db2sysc,还有什么其它的进程

除了和,IBM Db2数据库还有其他一些重要进程。以下是其中一些常见的进程:

  • :Db2 Administration Server进程。该进程是一个守护进程,负责管理和监控Db2数据库实例的系统资源、配置和访问控制,以及处理来自的指令和事件。
  • :Db2 Agent进程。每个客户端应用程序连接到Db2数据库时,都会有一个相应的进程。它负责处理来自应用程序的请求,执行查询,管理事务,并与数据库实例进行通信。
  • :Db2 Gateway进程。该进程是在数据库的分布式环境中使用的,连接远程数据库实例。它负责接收来自本地Db2实例的请求,并将这些请求发送到远程Db2实例,并将结果返回给本地实例。
  • :Db2 Check Password进程。该进程在进行用户身份验证时起作用。当用户尝试进行身份验证时,会将用户提供的密码与存储在Db2数据库中的密码进行比较,以验证用户的身份。
  • :Db2 Data Sharing Advisor进程。该进程负责收集和分析数据库的统计信息,并根据这些信息提供性能优化和调优建议。
  • :Db2 Function Monitor Program进程。该进程用于加载和执行用户定义的SQL函数和存储过程。每个用户定义的函数都会有一个相应的进程来执行相关的逻辑。

除了上述进程外,还有一些其他的Db2进程,用于不同的管理、监控和执行任务。具体的进程名称和功能可能会根据不同的Db2版本和配置而有所变化。

xxx

11.1

Isolation levels - IBM Documentation

Regardless of the isolation level, the database manager places exclusive locks on every row that is inserted, updated, or deleted. Thus, all isolation levels ensure that any row that is changed by an application process during a unit of work is not changed by any other application process. The database manager releases the exclusive lock when the unit of work is complete.

The database manager supports four isolation levels.

  • Repeatable read (RR)
  • Read stability (RS)
  • Cursor stability (CS)
  • Uncommitted read (UR)

11.5

Isolation levels - IBM Documentation

===

再度整理:

隔离级别 脏读 不可重复读 幻读 未提交读(Uncommitted Read) 游标稳定性(Cursor Stability) 读稳定性(Read Stability) 可重复读(Repeatable Read)

===

Stability 英 [stəˈbɪlɪtɪ]   n. 稳定(性);坚定

=============================================
・游标稳定性(Cursor Stability):如果一行正在更新但未提交,它不会等待X行的S锁,直接读取更新前的行,读完了就释放了,这时候就出现不稳定读了,等同一事务下次再读的时候发现
        同一行读出来的数据不一样了。




游标稳定性隔离级别锁定在事务期间访问的任何行,而游标位于该行上。此锁将一直有效,直到读取下一行或事务结束。但是,如果行中的任何数据被更改,则锁定将保持,直到提交更改。

在此隔离级别下,当可更新游标位于该行上时,任何其他应用程序都无法更新或删除该行。在 CS 下,无法访问其他应用程序的未提交数据。但是,不可重复读取和幻像读取是可能的。

CS 是默认隔离级别。

==================================

但是,

       由于with rs 一直等待事务提交,有可能造成事务死锁,并且等待时间过长时,出现如下错误:

[DB2NT]SQL0952N由于中断,处理被取消 SQLSTATE=57014 DB2被中断,报错: [DB2/NT] SQL0952N 由于中断,处理被取消 SQLSTATE=57014 在DB2的开发过程中

【注意!!!】虽然容易造成死锁,但是,有的时候我们在 select 时,必须使用with rs,比如,某一个表中存在一个「採番用の番号」,在数据库中,100xxxx1-100xxxxx,每次使用一个,并且有对应的是否使用flg,此时查询,就需要使用 with rs,等待上一个事务更新完了,取得其它事务完了后的数据。保证数据的最新化!!!

  

===

===

==

xxx

17.1.模拟INSERT FOR UPDATE

====

 
   

可以参照上面的 MERGE INTO 语法来实现想要的效果

想要的效果:如果存在ID是1001的数据,更新;不存在,插入

实现代码如下

 
   

====

JPA执行

 
   

====

JPA的API

EntityManager (Java(TM) EE 7 Specification APIs)

====

DB2常用命令总结_db2 list application show detail-CSDN博客

==

DB2数据类型总结_db2 clob最大长度-CSDN博客

===

==

===

==

到此这篇db2数据库创建(db2数据库创建、恢复及常用命令)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 中文全文数据库有哪些类型(中文全文数据库有哪些类型图片)2026-05-06 12:36:10
  • redis-cli连接(redis-cli连接远程服务器查询不到数据)2026-05-06 12:36:10
  • 广度优先搜索树怎么画(广度优先搜索用什么数据结构)2026-05-06 12:36:10
  • Pymysql快速读取全部数据(pymysql获取字段和数据)2026-05-06 12:36:10
  • 中文全文数据库的优势有哪些(中文全文数据库的特点)2026-05-06 12:36:10
  • 数据中台建设方案规划(数据中台设计方案)2026-05-06 12:36:10
  • 数据中台建设方案规划(数据中台技术方案)2026-05-06 12:36:10
  • 学术数据库没有购买就不能检索的有(中国学术期刊全文数据库不提供的文献外表特征的途径有)2026-05-06 12:36:10
  • 大数据培训哪些课程(大数据培训哪些课程好)2026-05-06 12:36:10
  • spss23.0数据分析教程(spss22数据分析教程)2026-05-06 12:36:10
  • 全屏图片