Db2 简明教程
DB2 Introduction
本章介绍了 DB2 的历史、版本、版本及其各自的功能。
Overview
DB2 是 IBM 的一项数据库产品,也是一款关系数据库管理系统 (RDBMS)。DB2 旨在高效存储、分析和检索数据。DB2 产品在 XML 的支持下扩展了面向对象特征和非关系结构。
History
最初,IBM 为其特定平台开发了 DB2 产品。自 1990 年以来,IBM 决定开发通用数据库 (UDB) DB2 服务器,可以在任何权威操作系统(如 Linux、UNIX 和 Windows)上运行。
Versions
对于 IBM DB2,UDB 当前版本 10.5 同时具有 BLU 加速的功能,其代号为“开普勒”。迄今为止,所有版本的 DB2 如下所示:
Version |
Code Name |
3.4 |
Cobweb |
8.1, 8.2 |
Stinger |
9.1 |
Viper |
9.5 |
Viper 2 |
9.7 |
Cobra |
9.8 |
它增加了仅 PureScale 的功能 |
10.1 |
Galileo |
10.5 |
Kepler |
Data server editions and features
根据 DB2 必需功能的要求,组织可以选择适当的 DB2 版本。下表显示了 DB2 Server 版本及其功能:
Editions |
Features |
高级企业服务器版本和企业服务器版本 (AESE/ESE) |
专为中型到大型企业组织而设计。平台 - Linux,UNIX 和 Windows。表分区高可用性灾难恢复 (HARD) 物化查询表 (MQTs) 多维集群 (MDC) 连接集中器纯 XML 备份压缩同构联合 |
Workgroup Server Edition (WSE) |
适用于工作组或中型企业组织。通过使用此 WSE,您可以使用 - 高可用性灾难恢复 (HARD) 在线重组纯 XML Web 服务联合支持 DB2 同构联合同构 SQL 复制备份压缩 |
Express -C |
它免费提供 DB2 的所有功能。它可以在任何物理或虚拟系统上运行,配置大小不限。 |
Express Edition |
专为入门级和中型企业组织而设计。它是一款功能齐全的 DB2 数据服务器。它只提供有限的服务。本版本包含 - Web 服务联合 DB2 同构联合同构 SQL 复制备份压缩 |
Enterprise Developer Edition |
它只提供单个应用程序开发人员。用于设计、构建和制作原型,将应用程序部署到任何 IBM 服务器。该软件无法用于开发应用程序。 |
DB2 Server Installation
本章介绍了 DB2 服务器的安装步骤。
Introduction
您可以从 www.ibm.com 下载 DB2 服务器试用版或购买产品许可证。有两种独立的 DB2 服务器可供下载,具体取决于计划在其上执行操作的操作系统的规模。例如,如果您想下载适用于 32 位 Linux 或 UNIX 操作系统的 DB2 服务器,则需要下载 32 位 DB2 服务器。64 位 DB2 服务器也适用此规则。
Checking system compatibility
在安装 DB2 服务器之前,您需要验证您的系统是否与 DB2 服务器兼容。若要确认兼容性,您需要在命令控制台上调用“db2prereqcheck”命令。
Installing DB2 on Linux operating system
打开终端并在控制台上使用“CD <DB2 安装文件夹>”命令设置 db2 安装映像文件夹路径。然后键入“./db2prereqcheck”命令,该命令会确认您的系统与 DB2 服务器的兼容性。
./db2prereqcheck
图 1 显示了 Linux 操作系统和硬件系统的兼容性要求。
按照给定的步骤在您的 Linux 系统上安装 DB2:
-
Open the terminal.
-
Login as root user.
-
Open DB2 Installation folder.
-
键入“./db2setup”并按 Enter 键。
该进程将启动 DB2 服务器设置的执行。
在根终端键入“./db2setup”并按 Enter 键以启动 DB2 服务器的设置流程。
执行此操作后,将出现“设置 LaunchPad”屏幕。[图 2]
在设置 LaunchPad 页面上,从左侧菜单中选择“安装产品”选项。选择“DB2 高级企业服务器版”选项。选择“新建安装”按钮。
将出现一个名为“DB2 设置向导”的新框架。单击“下一步”。[图 3]
将出现下一个屏幕并显示 DB2 许可协议。选择“我接受条款…”单击“下一步”。[图 4]
下一个屏幕会显示安装类型选项,该选项默认设置为“典型”。
保持同样的选择。单击“下一步”。[图 5]
下一个屏幕将显示安装操作。
选择“安装 DB2 高级企业服务器版…”
单击“下一步”。[图 6]
在下一个屏幕上,设置程序会要求您选择安装目录。
保持默认,然后单击“下一步”。
下一个屏幕会显示用户身份验证。输入“dasusr1”用户的密码。
(您的密码可以与用户名相同,这样便于记忆。)
在以下屏幕中,设置会要求您创建 DB2 服务器实例。
在此处,它会创建一个名为“db2ins1”的 DB2 实例。
下一个屏幕询问您默认实例需要的分区数。
您可以选择“单一或多重”分区。
选择“单一分区实例”。单击"下一步"。
在下一个屏幕,该设置会要求您为正创建的 DB2 实例进行身份验证。
此处,默认情况下,用户名被创建为“db2inst1”。您可以输入相同于用户名的密码。
单击“下一步”。
在下一个屏幕,该设置要求输入“db2fenc”用户的身份验证信息。
此处,您可以输入相同于用户名的密码。
单击“下一步”。
在下一个屏幕,您可以选择“现在不为您的 db2 服务器设置发送通知”选项。
单击“下一步”。
下一个屏幕向您显示有关 db2 设置的信息。
单击“完成”。
此时,DB2 安装过程已完成。
Verifying DB2 installation
您需要验证 DB2 服务器的安装,以进行实用性检查。完成 DB2 服务器安装后,注销当前用户模式并登录到“db2inst1”用户。在“db2inst1”用户环境中,您可以打开终端并执行以下命令来验证您的 db2 产品是否安装正确。
db2level
该命令显示当前实例中已安装 DB2 产品的当前版本和服务级别。
Syntax:
db2level
Example:
db2level
Output:
DB21085I Instance "db2inst2" uses "64" bits
And DB2 code release "SQL10010" with level
identifier "0201010E". Informational tokens
are "DB2 v10.1.0.0", "s120403",
"LINUXAMD64101", and Fix Pack "0".
Product is installed at "/home/db2inst2/sqllib".
db2licm
此命令显示我们 DB2 产品的所有许可相关信息。
Syntax:
db2licm <parameter>
Example:
db2licm -l
Output:
Product name: "DB2 Advanced Enterprise Server Edition"
License type: "Trial"
Expiry date: "10/02/2014"
Product identifier: "db2aese"
Version information: "10.1"
Product name: "DB2 Connect Server"
License type: "Trial"
Expiry date: "10/02/2014"
Product identifier: "db2consv"
Version information: "10.1"
Command Line Processor (CLP)
CLP 可以在三种模式中的一种中启动:
-
Command mode :在此模式中,每个命令和 SQL 语句必须以“db2”作为前缀。例如,查询“db2 activate database sample”。
-
Interactive input mode :您可以使用“db2”命令启动此模式。此处,您可以传入没有前缀的 SQL 语句。例如,“activate database sample”。
-
Batch mode :在此处,您需要创建一个脚本文件,它包含所有 SQL 查询要求并使用“.db2”扩展名保存该文件。您可以使用“db2 -tf <filename.db2>”语法在命令行中调用它。
DB2 Instance
Introduction
实例是 DB2 数据库管理器的逻辑环境。使用实例,您可以管理数据库。根据我们的要求,您可以在一台物理机上创建多个实例。实例目录的内容为:
-
Database Manager Configuration file
-
System Database Directory
-
Node Directory
-
Node Configuration File [db2nodes.cfg]
-
Debugging files, dump files
对于 DB2 数据库服务器,默认实例为“DB2”。不可能在创建实例目录后更改其位置。一个实例可以管理多个数据库。在一个实例中,每个数据库具有唯一名称、其自己的目录表集、配置文件、权限和特权。
Creating instance on Linux
如果将 DB2 服务器安装为 root 用户,则可以在 Linux 和 UNIX 上创建多个实例。一个实例可以在 Linux 和 UNIX 上独立地同时运行。一次只能在一个数据库管理器实例内工作。
实例文件夹包含数据库配置文件和文件夹。实例目录在 Windows 上的存储位置根据操作系统不同而异。
Instance environment commands
这些命令可用于在 DB2 CLI 中安排实例。
Get instance
此命令显示当前正在运行的实例的详细信息。
Syntax:
db2 get instance
Example: [查看激活当前用户的当前实例]
db2 get instance
Output:
The current database manager instance is : db2inst1
Set instance
要在 DB2 UDB 上启动或停止某个实例的数据库管理器,可针对当前实例执行以下命令。
Syntax:
set db2instance=<instance_name>
Example: [为当前用户安排 “db2inst1” 环境]
set db2instance=db2inst1
Creating an instance
让我们了解一下如何创建一个新实例。
db2icrt
如果要创建一个新实例,您需要使用 root 登录。实例 ID 不是 root ID 或 root 名称。
以下是创建新实例的步骤:
Step1 :为实例创建一个操作系统用户。
Syntax:
useradd -u <ID> -g <group name> -m -d <user location> <user name>
-p <password>
Example : [在组 “db2iadm1” 中为用户名为 “db2inst2” 的实例创建一个用户,密码为 “db2inst2”]
useradd -u 1000 -g db2iadm1 -m -d /home/db2inst2 db2inst2 -p db2inst2
Step2 : 以 root 用户身份访问 DB2 实例目录,创建新实例。
Location:
cd /opt/ibm/db2/v10.1/instance
Step3 : 使用以下语法创建实例:
Syntax:
./db2icrt -s ese -u <inst id> <instance name>
Example : [使用 ESE(企业服务器版)特性以用户 db2inst2 创建新实例 db2inst2]
./db2icrt -s ese -u db2inst2 db2inst2
Output:
DBI1446I The db2icrt command is running, please wait.
….
…..
DBI1070I Program db2icrt completed successfully.
Arranging communication port and host for an instance
编辑 /etc/services 文件并添加端口号。在给出的语法中,“inst_name”表示实例名称,“inst_port”表示实例的端口号。
Syntax:
db2c_<inst name> <inst_port>/tcp
Example : [在 services 文件中为实例 db2inst2 添加变量 db2c_db2inst2 的端口号 50001/tcp]
db2c_db2inst2 50001/tcp
Syntax 1 : [使用服务名称更新数据库管理器配置。以下语法中的 svcename 表示实例服务名称,inst_name 表示实例名称]
db2 update database manager configuration using svcename db2c_&<inst_name>
Example 1 : [使用值 db2c_db2inst2 为实例 db2inst2 变量 svcename 更新 DBM 配置]
db2 update database manager configuration using svcename db2c_db2inst2
Output
DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed successfully.
Syntax 2 : 为当前实例设置 tcpip 通信协议
db2set DB2COMM=tcpip
Syntax 3 : [停止并启动当前实例以从数据库管理器配置获取更新的值]
db2stop
db2start
Upgrading an instance
你可以将实例从以前的 DB2 副本版本升级到当前最新安装的 DB2 副本版本。
db2iupgrade
在 Linux 或 UNIX 系统上,该命令位于 DB2DIR/instance 目录中。在以下语法中,“inst_name”表示以前的版本 DB2 实例,“inst_username”表示当前安装版本 DB2 副本实例用户。
Syntax 2 :
db2iupgrade -d -k -u <inst_username> <inst_name>
Example :
db2iupgrade -d -k -u db2inst2 db2inst2
Command Parameters:
-d : 启用调试模式。
-k : 如果 DB2 副本(你在其中运行此命令)中支持预升级实例类型,将保留该类型。
如果在 Linux 上对 DB2iupgrade 命令使用超级用户 (su),你必须使用 “-” 选项发出 “su” 命令。
Using other commands with instance
要找出我们现在正在处理哪个 DB2 实例的命令。
Syntax 1 : [要检查数据库管理器激活的当前实例]
db2 get instance
Output:
The current database manager instance is: db2inst1
Syntax 2 : [要查看具有操作系统位和发行版本的当前实例]
db2pd -inst | head -2
Example:
db2pd -inst | head -2
Output:
Instance db2inst1 uses 64 bits and DB2 code release SQL10010
Syntax 3 : [要检查当前工作实例的名称]
db2 select inst_name from sysibmadm.env_inst_info
Example:
db2 select inst_name from sysibmadm.env_inst_info
Output:
INST_NAME --------------------------------------
db2inst1
1 record(s) selected.
Syntax : [要将新实例设置为默认值]
db2set db2instdef=<inst_name> -g
Example : [要将新创建的实例排列为默认实例]
db2set db2instdef=db2inst2 -g
DB2 Databases
本章介绍如何使用相关语法创建、激活和停用数据库。
Database directory
数据库目录是数据库的有序存储库。创建数据库时,数据库的所有详细信息都存储在数据库目录中,例如默认存储设备、配置文件和临时表列表等的详细信息。
分区全局目录在实例文件夹中创建。此目录包含与数据库相关的所有全局信息。此分区全局目录命名为 NODExxxx/SQLyyy,其中 xxxx 为数据分区号,yyy 为数据库令牌。
在分区全局目录中,会创建一个面向成员的目录。此目录包含本地数据库信息。面向成员的目录命名为 MEMBERxxxx,其中 xxxx 是成员号。DB2 Enterprise Server Edition 环境在单个成员上运行,并且仅有一个面向成员的目录。此面向成员的目录被唯一命名为 MEMBER0000。
Partitioned global directory
目录位置:<实例>/NODExxx/SQLxxx
分区全局目录包含如下列出的与数据库相关联的文件。
-
全局死锁写入文件事件监视文件
-
表空间信息文件 [SQLSPCS.1、SQLSPCS.2]
-
存储组控制文件 [SQLSGF.1、SQLSGF.2]
-
临时表空间容器文件。[/storage path//T0000011/C000000.TMP/SQL00002.MEMBER0001.TDA]
-
Global Configuration file [SQLDBCONF]
-
历史文件 [DB2RHIST.ASC, DB2RHIST.BAK, DB2TSCHG.HIS, DB2TSCHG.HIS]
-
Logging-related files [SQLOGCTL.GLFH.1, SQLOGCTL.GLFH.2]
-
Locking files [SQLINSLK, SQLTMPLK]
-
Automatic Storage containers
Member specific directory
目录位置:/NODExxxx/SQLxxxx/MEMBER0000
此目录包含:
-
Objects associated with databases
-
缓冲池信息文件 [SQLBP.1, SQLBP.2]
-
Local event monitoring files
-
与日志记录相关联的文件 [SQLOGCTL.LFH.1, SQLOGCTL.LFH.2, SQLOGMIR.LFH]
-
Local configuration files
-
死锁事件监视文件。在 ESE 和分区数据库环境中,详细死锁事件监视文件存储在目录节点的数据库目录中。
Creating database
您可以使用 CREATE DATABASE 命令在实例中创建数据库。所有数据库均使用在创建实例时创建的“IBMSTOGROUP”默认存储组创建。在 DB2 中,所有数据库表都存储在“表空间”中,后者使用各自的存储组。
数据库权限被自动设置为 PUBLIC [CREATETAB, BINDADD, CONNECT, IMPLICIT_SCHEMA 和 SELECT],但是,如果存在 RESTRICTIVE 选项,则不会以 PUBLIC 授予权限。
Creating non-restrictive database
此命令用于创建非限制性数据库。
Syntax : [要在创建新数据库。'database_name' 表示要创建的新数据库名称。]
db2 create database <database name>
Example : [要创建名为 ‘one’ 的新非限制性数据库]
db2 create database one
Output:
DB20000I The CREATE DATABASE command completed successfully.
Creating restrictive database
调用此命令后将创建限制性数据库。
Syntax : [在下面的语法中,“db_name” 表示数据库名称。]
db2 create database <db_name> restrictive
Example : [要创建名为 “two” 的新限制性数据库]
db2 create database two restrictive
Creating database with different user defined location
在不同路径上使用“IBMSTOGROUP”默认存储组创建数据库。先前,您调用“create database”命令时没有指定用户定义的位置来存储或创建特定位置的数据库。若要使用用户定义的数据库位置创建数据库,请按照以下步骤操作:
Syntax : [在以下语法中,“db_name” 表示“database name” , “data_location” 表示必须将数据存储在哪些文件夹中, “db_path_location” 表示 “data_location” 的驱动程序位置。]
db2 create database '<db_name>' on '<data location>' dbpath on '<db_path_location>'
Example : [要创建名为 “four” 的数据库,其中数据存储在 “data1” 中,并且此文件夹存储在 “dbpath1” 中]
db2 create database four on '/data1' dbpath on '/dbpath1'
Viewing local or system database directory files
执行此命令以查看当前实例中提供目录列表。
Syntax:
db2 list database directory
Example:
db2 list database directory
Output:
System Database Directory
Number of entries in the directory = 6
Database 1 entry:
Database alias = FOUR
Database name = FOUR
Local database directory =
/home/db2inst4/Desktop/dbpath
Database release level = f.00
Comment =
Directory entry type = Indirect
Catalog database partition number = 0
Alternate server hostname =
Alternate server port number =
Database 2 entry:
Database alias = SIX
Database name = SIX
Local database directory = /home/db2inst4
Database release level = f.00
Comment =
Directory entry type = Indirect
Catalog database partition number = 0
Alternate server hostname =
Alternate server port number =
Activating database
此命令启动特定数据库所需的所有服务,这样应用程序才可使用此数据库。
Syntax :[“db_name” 表示数据库名称]
db2 activate db <db_name>
Example : [激活数据库“one”]
db2 activate db one
Deactivating database
使用此命令,您可以停止数据库服务。
Syntax:
db2 deactivate db <db_name>
Example : [停用数据库“one”]
db2 deactivate db one
Connecting to database
创建数据库后,要投入使用,需要连接或启动数据库。
Syntax:
db2 connect to <database name>
Example : [将数据库 one 连接到当前 CLI]
db2 connect to one
Output:
Database Connection Information
Database server = DB2/LINUXX8664 10.1.0
SQL authorization ID = DB2INST4
Local database alias = ONE
Verifying if database is restrictive
要检查此数据库是否有限制,以下是语法:
Syntax : [在以下语法中,“db” 表示数据库,“cfg” 表示配置,“db_name” 表示数据库名]
db2 get db cfg for <db_name> | grep -i restrict
Example : [要检查数据库“one”是否有限制]
db2 get db cfg for one | grep -i restrict
Output:
Restrict access = NO
Configuring the database manager and the database
实例配置(Database Manager 配置)存储在名为“db2system”的文件中,而数据库相关配置则存储在名为“SQLDBCON”的文件中。这些文件无法直接编辑。您可以使用调用 API 的工具编辑这些文件。使用命令行处理器,您可以使用这些命令。
Database Manager Configuration Parameters
Syntax : [获取实例数据库管理程序的信息]
db2 get database manager configuration
db2 get dbm cfg
Syntax : [更新实例数据库管理程序]
db2 update database manager configuration
db2 update dbm cfg
Syntax : [重置先前的配置]
db2 reset database manager configuration
db2 reset dbm cfg
Database Configuration Parameters
Syntax : [获取数据库的信息]
db2 get database configuration
db2 get db cfg
Syntax : [更新数据库配置]
db2 update database configuration
db2 update db cfg
Syntax : [重置数据库配置中先前配置的值]
db2 reset database configuration
db2 reset db cfg
Syntax : [检查当前活动数据库的大小]
db2 "call get_dbsize_info(?,?,?,-1)"
Example : [确认当前激活数据库的大小]
db2 "call get_dbsize_info(?,?,?,-1)"
Output:
Value of output parameters
--------------------------
Parameter Name : SNAPSHOTTIMESTAMP
Parameter Value : 2014-07-02-10.27.15.556775
Parameter Name : DATABASESIZE
Parameter Value : 105795584
Parameter Name : DATABASECAPACITY
Parameter Value : 396784705536
Return Status = 0
Estimating space required for database
要估计数据库的大小,必须考虑以下因素的贡献:
-
System Catalog Tables
-
User Table Data
-
Long Field Data
-
Large Object (LOB) Data
-
Index Space
-
Temporary Work Space
-
XML data
-
Log file space
-
Local database directory
-
System files
Checking database authorities
可以使用以下语法来检查授予公共用户非限制性数据库的哪些数据库权限。
Step 1 :使用认证用户 Id 和实例密码连接到数据库。
Syntax :[使用用户名和密码连接到数据库]
db2 connect to <db_name> user <userid> using <password>
Example :[使用用户 Id“db2inst4”和密码“db2inst4”连接“one”数据库]
db2 connect to one user db2inst4 using db2inst4
Output:
Database Connection Information
Database server = DB2/LINUXX8664 10.1.0
SQL authorization ID = DB2INST4
Local database alias = ONE
Step2 :验证数据库的权限。
Syntax :[下面的语法显示了当前数据库的权限服务的结果]
db2 "select substr(authority,1,25) as authority, d_user, d_group,
d_public, role_user, role_group, role_public,d_role from table(
sysproc.auth_list_authorities_for_authid ('public','g'))as t
order by authority"
Example:
db2 "select substr(authority,1,25) as authority, d_user, d_group,
d_public, role_user, role_group, role_public,d_role from table(
sysproc.auth_list_authorities_for_authid ('PUBLIC','G'))as t
order by authority"
Output:
AUTHORITY D_USER D_GROUP D_PUBLIC ROLE_USER ROLE_GROUP ROLE_PUBLIC D_ROLE
------------------------- ------ ------- -------- --------- ---------- ----------- ------
ACCESSCTRL * * N * * N *
BINDADD * * Y * * N *
CONNECT * * Y * * N *
CREATETAB * * Y * * N *
CREATE_EXTERNAL_ROUTINE * * N * * N *
CREATE_NOT_FENCED_ROUTINE * * N * * N *
CREATE_SECURE_OBJECT * * N * * N *
DATAACCESS * * N * * N *
DBADM * * N * * N *
EXPLAIN * * N * * N *
IMPLICIT_SCHEMA * * Y * * N *
LOAD * * N * * N *
QUIESCE_CONNECT * * N * * N *
SECADM * * N * * N *
SQLADM * * N * * N *
SYSADM * * * * * * *
SYSCTRL * * * * * * *
SYSMAINT * * * * * * *
SYSMON * * * * * * *
WLMADM * * N * * N *
20 record(s) selected.
DB2 Bufferpools
本章为您介绍了数据库中的缓冲池。
Introduction
缓冲池是指数据库管理器分配的主存储空间部分。缓冲池的目的是从磁盘缓存表和索引数据。所有数据库都有自己的缓冲池。在新数据库创建时,会创建一个默认缓冲池。它被称为“IBMDEFAULTBP”。根据用户要求,可以创建多个缓冲池。在缓冲池中,数据库管理器将表行数据作为一个页面放置。此页面会一直驻留在缓冲池中,直到关闭数据库或用新数据写入该空间。缓冲池中已更新数据但未写入磁盘的页面称为“脏”页面。在缓冲池中更新的数据页面写入磁盘后,缓冲池就准备好接收其他数据。
Relationship between tablespaces and bufferpools
每个表空间都与数据库中的特定缓冲池相关联。一个表空间与一个缓冲池相关联。缓冲池和表空间的大小必须相同。多个缓冲池允许您配置数据库使用的内存,以提高其整体性能。
Listing the available bufferpools in the current database directory
Syntax : [下面的语法显示数据库中所有可用的缓冲池]
db2 select * from syscat.bufferpools
Example : [要查看当前数据库中的可用缓冲池]
db2 select * from syscat.bufferpools
Output:
BPNAME BUFFERPOOLID DBPGNAME NPAGES PAGESIZE ESTORE
NUMBLOCKPAGES BLOCKSIZE NGNAME
------------------------------------------------------------
IBMDEFAULTBP
1 -
-2 4096 N 0 0 -
1 record(s) selected.
Creating the bufferpool
要为数据库服务器创建新的缓冲池,您需要两个参数,即“缓冲池名称”和“页面大小”。执行以下查询以创建新的缓冲池。
语法:[在下面的语法中,“bp_name”表示缓冲池名称,“size”表示您需要为缓冲池声明的页面大小 (4K、8K、16K、32K)]
db2 create bufferpool <bp_name> pagesize <size>
Example : [要创建一个名称为“bpnew”、大小为“8192”(8Kb) 的新缓冲池。]
db2 create bufferpool bpnew pagesize 8192
Output
DB20000I The SQL command completed successfully.
DB2 Tablespaces
本章将详细说明表空间
Benefits of tablespaces in database
表空间在数据库中有以下多种好处:
Recoverability : 表空间让备份和恢复操作更方便。使用单个命令,您可以在表空间中备份或恢复所有数据库对象。
Automatic storage Management : 数据库管理器会根据需要创建和扩展容器。
Memory utilization : 单个缓冲池可以管理多个表空间。您可以为临时表空间指定它们自己的缓冲池,以提高诸如排序或联接之类的活动的性能。
Container
表空间包含一个或多个容器。容器可以是目录名、设备名或文件名。在数据库中,单个表空间可以在同一物理存储设备上拥有多个容器。如果表空间是通过自动存储表空间选项创建的,则容器的创建和管理将由数据库管理器自动处理。如果未使用自动存储表空间选项创建,则您需要自己定义和管理容器。
Default tablespaces
当创建一个新数据库时,数据库管理器会为数据库创建一些默认表空间。此表空间用于存储用户和临时数据。每个数据库至少需要包含三个表空间,如下所示:
Catalog tablespace : 其中包含数据库的系统目录表。它被命名为 SYSCATSPACE,并且无法删除。
User tablespace : 此表空间包含用户定义的表。在数据库中,我们有一个默认的用户表空间,名为 USERSPACE1。如果您在创建表时没有指定为此表指定用户定义表空间,则数据库管理器将为您选择默认用户表空间。
Temporary tablespace : 临时表空间包含临时表数据。此表空间包含系统临时表空间或用户临时表空间。
系统临时表空间在数据库管理器执行诸如排序或联接之类的操作时保存所需临时数据。数据库必须至少有一个系统临时表空间,它被命名为 TEMPSPACE1。它在创建数据库时创建。用户临时表空间保存来自表的临时数据。使用 DECLARE GLOBAL TEMPORARY TABLE 或 CREATE GLOBAL TEMPORARY TABLE 语句创建。在创建数据库时不会默认创建此临时表空间。
Tablespaces and storage management:
根据您希望如何使用表空间可以使用不同的方法设置表空间。您可以设置操作系统来管理表空间分配、也可以让数据库管理器分配空间或者为您的数据选择自动分配表空间。
有以下三种类型的管理空间可用:
System Managed Space (SMS) : 操作系统的文件系统管理器分配和管理存储表的空间。按需分配存储空间。此模型包含表示数据库对象的多个文件。此表空间类型已在用户定义的表空间的 10.1 版中弃用,并未在目录和临时表空间中弃用。
Database Managed Space (DMS) : 数据库服务器控制存储空间。按您在创建 DMS 表空间时指定的容器定义在文件系统上预分配存储空间。从用户定义的表空间的 10.1 版修复包 1 中弃用,但并未在系统表空间和临时表空间中弃用。
Automatic Storage Tablespace : 可以自动管理数据库服务器。数据库服务器根据数据库中的数据创建和扩展容器。使用自动存储管理,无需提供容器定义。数据库服务器会负责创建和扩展容器,以利用分配给数据库的存储。如果向存储组添加存储空间,则在现有容器达到其最大容量时会自动创建新的容器。如果您想立即使用新添加的存储,则可以重新平衡表空间。
Page, table and tablespace size:
临时 DMS 和自动存储表空间,您为数据库选择的页面大小确定表空间大小的最大限制。对于表 SMS 和临时自动存储表空间,页面大小限制表本身的大小。页面大小可以是 4kb、8kb、16kb 或 32kb。
Tablespace type |
4K page size limit |
8K page size limit |
16K page size limit |
32K page size limit |
DMS,非临时自动存储表空间常规 |
64G |
128G |
256G |
512G |
DMS,临时 DMS 和非临时自动存储表空间大 |
1892G |
16384G |
32768G |
65536G |
DB2 Storagegroups
本章描述了数据库存储组。
Introduction
存储数据库表或对象的一组存储路径是一个存储组。您可以将表空间分配给存储组。当您创建一个数据库时,所有表空间都采用默认存储组。数据库的默认存储组是“IBMSTOGROUP”。当您创建一个新的数据库时,如果在“CREATE DATABASE”命令的末尾传递了“AUTOMATIC STOGROUP NO”参数,则默认存储组为活动状态。数据库没有任何默认存储组。
Listing storagegroups
您可以列出数据库中的所有存储组。
Syntax : [查看当前数据库中可用存储组的列表]
db2 select * from syscat.stogroups
Example : [查看当前数据库中可用存储组的列表]
db2 select * from syscat.stogroups
Creating a storagegroup
以下是数据库中创建存储组的语法:
Syntax : [创建一个新的 stogroup。“stogropu_name”表示新存储组的名称,“path”表示存储数据(表)的位置]
db2 create stogroup on ‘path’
Example : [在路径“data1”文件夹上创建一个新的 stogroup “stg1”]
db2 create stogroup stg1 on ‘/data1’
Output:
DB20000I The SQL command completed succesfully
Creating tablespace with stogroup
以下是使用 storegroup 创建表空间的方法:
Syntax : [使用已存在的存储组创建一个新的表空间]
db2 create tablespace <tablespace_name> using stogroup <stogroup_name>
Example : [使用已存在的存储组“stg1”创建一个名为“ts1”的新表空间]
db2 create tablespace ts1 using stogroup stg1
Output:
DB20000I The SQL command completed succesfully
Altering a storagegroup
您可以使用以下语法更改 storegroup 的位置:
Syntax : [将存储组从旧位置移动到新位置]
db2 alter stogroup add ‘location’, ‘location’
Example : [针对名为“sg1”的存储组,修改位置从旧位置到新位置的路径]
db2 alter stogroup sg1 add ‘/path/data3’, ‘/path/data4’
Dropping folder path of storagegroup
在删除存储组的文件夹路径之前,您可以使用 alter 命令为存储组添加新位置。
Syntax : [从存储组位置中删除旧路径]
db2 alter stogroup drop ‘/path’
Example : [从“stg1”中删除存储组位置]
db2 alter stogroup stg1 drop ‘/path/data1’
Rebalancing a tablespace
当在数据库上进行事务且表空间变满时,为存储组或表空间创建新文件夹时需要重新平衡表空间。重新平衡使用新存储组更新数据库配置文件。
Syntax : [将表空间从旧存储组路径重新平衡到新存储组]
db2 alter tablspace <ts_name> rebalance
Example :[重新配置]
db2 alter tablespace ts1 rebalance
Renaming a storagegroup
Syntax :[修改现有存储名称的名称]
db2 rename stogroup <old_stg_name> to <new_stg_name>
Example :[将存储组的名称从“sg1”修改为新名称“sgroup1”]
db2 rename stogroup sg1 to sgroup1
Dropping a storage group
Step 1 :在删除任何存储组之前,您可以为表空间分配其他不同的存储组。
Syntax :[为表空间指定另一个存储组]
db2 alter tablspace <ts_name> using stogroup <another sto_group_name>
Example :[为表空间“ts1”从一个旧的存储组更改为新的名为“sg2”的存储组]
db2 alter tablespace ts1 using stogroup sg2
Step 2:
Syntax :[删除现有存储组]
db2 drop stogorup <stogroup_name>
Example :[从数据库中删除存储组“stg1”]
db2 drop stogroup stg1
DB2 Schemas
本章介绍和描述了模式的概念。
Introduction
模式是在数据库中按照逻辑分类的已命名对象的集合。
在数据库中,您无法创建名称相同的多个数据库对象。为此,模式提供了一个组环境。您可以在数据库中创建多个模式,并且可以创建名称相同但模式组不同的多个数据库对象。
模式可以包含表、函数、索引、表空间、过程、触发器等。例如,您可以为“employee”数据库创建两个名为“Professional”和“Personal”的不同模式。可以创建两个名称相同的不同表“Employee”。在此环境中,一个表包含专业信息,另一个表包含员工的个人信息。尽管有两个名称相同的表,但它们有两个不同的模式“Personal”和“Professional”。因此,用户可以在不遇到任何问题的情况下使用这两个表。当对表命名有约束时,此功能非常有用。
让我们看看与模式相关的一些命令:
Setting another schema to current environment
Syntax:
db2 set schema=<schema_name>
Example : [将“schema1”组织到当前实例环境]
db2 set schema=schema1
Creating a new Schema
Syntax : [使用授权用户 ID 创建新的模式]
db2 create schema <schema_name> authroization <inst_user>
Example : [创建使用“db2inst2”授权的“schema1”模式]
db2 create schema schema1 authorization db2inst2
Exercise
让我们创建两个名称相同但模式不同的表。在此,您使用两个不同的模式创建雇员表,一个用于个人信息,另一个用于专业信息。
Step 1 : 创建两个架构。
Schema 1 : [创建名为 professional 的架构]
db2 create schema professional authorization db2inst2
Schema 2 : [创建名为 personal 的架构]
db2 create schema personal authorization db2inst2
Step 2 : 创建两个表格,名称相同,用于存放员工详细信息
Table1 : professional.employee
db2 create table professional.employee(id number, name
varchar(20), profession varchar(20), join_date date,
salary number);
Table2 : personal.employee
db2 create table personal.employee(id number, name
varchar(20), d_birth date, phone bigint, address
varchar(200));
执行完这些步骤后,你将得到两个同名表格 'employee',它们有两个不同的架构。
DB2 Data Types
本章介绍了 DB2 中使用的各种数据类型。
Built-in data types
-
Datetime*TIME*: 表示一天中的时间,包括小时、分钟和秒。 TIMESTAMP : 以年、月、日、小时、分钟、秒和微秒的形式表示日期和时间的值。 DATE : 以年、月、日这三部分的形式表示一天的日期。
-
*String*Character
-
CHAR (fixed length) : 固定长度字符。可变长度
-
VARCHAR : 可变长度字符。
-
CLOB : 大型对象字符串,在字符长度可能超过 VARCHAR 数据类型限制时使用。图形
-
GRAPHIC 固定长度: 包含双字节字符的固定长度图形字符串 可变长度
-
VARGRAPHIC : 包含双字节字符的可变长度图形字符串。
-
DBCLOB : 大型对象类型 二进制
-
BLOB (可变长度): 大型对象中的二进制字符串
-
BOOLEAN : 以 0 和 1 的形式表示。
-
*Signed numeric*Exact
-
Binary integer SMALLINT [role="role="16BIT""]: Using this you can insert small int values into columns*INTEGER [32BIT]* : 使用此数据类型可在列中插入较大的整数*BIGINT [64 位]*: 使用此数据类型可在列中插入较大的整数
-
Decimal*DECIMAL (packed)*DECFLOAT (十进制浮点数):可用于插入十进制浮点数Approximate
-
Floating points REAL (单精度):可用于插入单精度的浮点数。 DOUBLE (双精度):可用于插入双精度的浮点数。
-
eXtensible Mark-up Language XML:可将 XML 数据存储到该数据类型中。
DB2 Tables
表是由数据库管理器维护的逻辑结构。在表中,每个垂直块称为列(元组),每个水平块称为行(实体)。以列和行为形式存储的数据集合称为表。在表中,每一列都有不同的数据类型。表用于存储持久性数据。
Type of tables
-
Base Tables : 他们持有持久数据。有不同种类的基本表,包括: Regular Tables : 通用表,带有索引的通用表是通用表。 Multidimensional Clustering Table (MDC) : 这种类型的表在多个键上物理群集,并且用于维护大型数据库环境。DB2 pureScale 中不支持这类表。 Insert time clustering Table (ITC) : 与 MDC 表类似,行按插入表的顺序群集。它们可以是分区表。它们也不支持 pureScale 环境。 Range-Clustered tables Table (RCT) : 这些类型的表提供快速且直接的数据访问。它们实现为顺序集群。表中的每条记录都有一个记录 ID。这些类型的表用于数据与表中一个或多个列紧密群集的情况。DB2 pureScale 中也不支持这类表。 Partitioned Tables : 这些类型的表用于数据组织架构,其中表数据被分为多个存储对象。可以将数据分区添加到、附加到分区表或从分区表中分离出来。可以将表中的多个数据分区存储在一个表空间中。 Temporal Tables : 数据库中表的变更历史记录存储在临时表中,比如以前执行的修改的详细信息。
-
Temporary Tables : 对于不同数据库操作的临时工作,需要使用临时表。临时表 (DGTT) 不显示在系统目录中,不能在创建的临时表中使用 XML 列。
-
Materialized Query Tables : MQT 可用于提高查询的性能。这类表由查询定义,该查询用于确定表中的数据。
Creating Tables
以下语法创建表:
Syntax : [要创建新表]
db2 create table <schema_name>.<table_name>
(column_name column_type....) in <tablespace_name>
Example : 我们在“professional”架构中创建一个表来存储“employee”详细信息。此表有“id、name、jobrole、joindate、salary”字段,此表数据将存储在表空间“ts1”中。
db2 create table professional.employee(id int, name
varchar(50),jobrole varchar(30),joindate date,
salary double) in ts1
Output:
DB20000I The SQL command completed successfully.
Listing table details
以下语法用于列出表详细信息:
Syntax : [要查看使用架构创建的表的列表]
db2 select tabname, tabschema, tbspace from syscat.tables
Example : [要查看当前数据库中的表的列表]
db2 select tabname, tabschema, tbspace from syscat.tables
Output:
TABNAME TABSCHEMA TBSPACE
------------ ------------- --------
EMPLOYEE PROFESSIONAL TS1
1 record(s) selected.
Listing columns in a table
以下语法列出表格中的列:
Syntax : [要查看表的列和数据类型]
db2 describe table <table_name>
Example : [要查看表“employee”的列和数据类型]
db2 describe table professional.employee
Output:
Data type Column
Column name schema Data type name Length Scale Nulls
------ ----- --------- ----------------- --------- ----- ------
ID SYSIBM INTEGER 4 0 Yes
NAME SYSIBM VARCHAR 50 0 Yes
JOBROLE SYSIBM VARCHAR 30 0 Yes
JOINDATE SYSIBM DATE 4 0 Yes
SALARY SYSIBM DOUBLE 8 0 Yes
5 record(s) selected.
Creating table with hidden column
以下语法使用隐藏列创建表:
Syntax : [要创建带有隐藏列的表]
db2 create table <tab_name> (col1 datatype,col2 datatype
implicitly hidden)
Example : [要创建带有隐藏列“phone”的“customer”表]
db2 create table professional.customer(custid integer not
null, fullname varchar(100), phone char(10)
implicitly hidden)
Inserting data values in table
以下语法在表中插入值:
Syntax : [要在表中插入值]
db2 insert into <tab_name>(col1,col2,...)
values(val1,val2,..)
Example : [要在“customer”表中插入值]
db2 insert into professional.customer(custid, fullname, phone)
values(100,'ravi','9898989')
db2 insert into professional.customer(custid, fullname, phone)
values(101,'krathi','87996659')
db2 insert into professional.customer(custid, fullname, phone)
values(102,'gopal','768678687')
Output:
DB20000I The SQL command completed successfully.
Retrieving values from table
以下语法从表中检索值:
Syntax :[从表中检索值]
db2 select * from <tab_name>
Example :[从“customer”表中检索值]
db2 select * from professional.customer
Output:
CUSTID FULLNAME
----------- ------------------------
100 ravi
101 krathi
102 gopal
3 record(s) selected.
Retrieving values from a table including hidden columns
以下语法从选定列中检索值:
Syntax :[从表中检索选定的隐藏列值]
db2 select col1,col2,col3 from <tab_name>
Example :[从表中检索选定列值结果]
db2 select custid,fullname,phone from professional.customer
Output:
CUSTID FULLNAME PHONE
------- --------- ------------
100 ravi 9898989
101 krathi 87996659
102 gopal 768678687
3 record(s) selected.
如果您想要查看隐藏列中的数据,您需要执行“DESCRIBE”命令。
Syntax :
db2 describe table <table_name> show detail
Example:
db2 describe table professional.customer show detail
Output:
Column name Data type schema Data type name Column
column Partitionkey code
Length Scale Nulls
number sequence page Hidden Default
--------------- -------------------- --------------- -------- ----
---- -------- ---------- ------------- -------- ----------- ------
---
CUSTID SYSIBM INTEGER 4 0
No 0 0 0 No
FULLNAME SYSIBM VARCHAR 100 0
Yes 1 0 1208 No
PHONE SYSIBM CHARACTER 10 0
Yes 2 0 1208 Implicitly
3 record(s) selected.
Altering the type of table columns
您可以使用此“alter”命令修改我们的表结构,如下所示:
Syntax :
db2 alter table <tab_name> alter column <col_name> set data type <data_type>
Example: :[将员工表的列“id”的数据类型从“int”修改为“bigint”]
db2 alter table professional.employee alter column id set data type bigint
Output: :
DB20000I The SQL command completed successfully.
Altering column name
您可以更改列名,如下所示:
Syntax :[将表的列名从旧名称修改为新名称]
db2 alter table <tab_name> rename column <old_name> to <new_name>
Example: :[将“customers”表中列名从“fullname”修改为“custname”]
db2 alter table professional.customer rename column fullname to custname
Dropping the tables
要删除任何表,您需要使用“DROP”命令,如下所示:
Syntax :
db2 drop table <tab_name>
Example: :[从数据库中删除客户表]
db2 drop table professional.customers
要删除表的整个层次结构(包括触发器和关系),您需要使用“DROP TABLE HIERARCHY”命令。
Syntax :
db2 drop table hierarchy <tab_name>
Example: :[删除表“customer”的整个层次结构]
db2 drop table hierarchy professional.customers
DB2 Alias
本章描述了使用数据库对象的别名创建别名和在数据中使用数据库对象的别名。
Creating database object aliases
您可以按如下方式创建数据库对象别名:
Syntax :
db2 create alias <alias_name> for <table_name>
Example : 为“professional.customer”表创建别名名称
db2 create alias pro_cust for professional.customer
如果您传递“SELECT * FROM PRO_CUST”或“SELECT * FROM PROFESSIONAL.CUSTOMER”,则数据库服务器将显示相同的结果。
Syntax :[直接使用模式名称从表中获取值]
db2 select * from <schema_name>.<table_name>
Example :[从 customer 表中获取值]
db2 select * from professional.customer
Output:
CUSTID FULLNAME PHONE
------- --------- ------------
100 ravi 9898989
101 krathi 87996659
102 gopal 768678687
3 record(s) selected.
Retrieving values using alias name of the table
您可以按如下方式使用数据库中的别名来获取值:
Syntax :[通过调用表的别名从表中获取值]
db2 select * from <alias_name>
Example :[使用别名从 customer 表中获取值]
db2 select * from pro_cust
Output:
CUSTID FULLNAME PHONE
------- --------- ------------
100 ravi 9898989
101 krathi 87996659
102 gopal 768678687
3 record(s) selected.
DB2 Constraints
本章描述了数据库中的各种约束。
Introduction
为了强制执行数据库的完整性, 定义了一组规则,称为约束。这些约束允许或禁止列中的值。
在实时数据库活动中, 应该根据某些限制添加数据。例如, 在销售数据库中, 销售 ID 或交易 ID 应当唯一。约束类型有:
-
NOT NULL
-
Unique
-
Primary key
-
Foreign Key
-
Check
-
Informational
约束仅与表相关。它们仅应用于特定表。它们在创建表时定义和应用于表。
Explanation of each constraint:
NOT NULL
这是禁止表中一个或多个列的空值规则。
Syntax:
db2 create table <table_name>(col_name col_type not null,..)
Example : [要创建一个销售表,其中有四列(id、itemname、qty、price),在此向所有列添加“非空”约束以避免在表中形成任何空单元。]
db2 create table shopper.sales(id bigint not null, itemname
varchar(40) not null, qty int not null,price double not null)
Inserting NOT NULL values into table
你可以按如下方式在表中插入值:
Example: [错误查询]
db2 insert into shopper.sales(id,itemname,qty)
values(1,'raagi',12)
Output: [正确查询]
DB21034E The command was processed as an SQL statement because
it was not a
valid Command Line Processor command. During SQL processing
it returned:
SQL0407N Assignment of a NULL value to a NOT NULL column
"TBSPACEID=5,
TABLEID=4, COLNO=3" is not allowed. SQLSTATE=23502
Example: [正确查询]
db2 insert into shopper.sales(id,itemname,qty,price)
values(1,'raagi',12, 120.00)
db2 insert into shopper.sales(id,itemname,qty,price)
values(1,'raagi',12, 120.00)
Output:
DB20000I The SQL command completed successfully.
Unique constraints
使用这些约束,你可以唯一地设置列的值。为此, 在创建表时使用“非空”约束声明唯一约束。
Syntax:
db2 create table <tab_name>(<col> <col_type> not null unique, ...)
Example:
db2 create table shopper.sales1(id bigint not null unique,
itemname varchar(40) not null, qty int not null,price
double not null)
Inserting the values into table
Example: 插入具有唯一 ID 1、2、3 和 4 的四行。
db2 insert into shopper.sales1(id, itemname, qty, price)
values(1, 'sweet', 100, 89)
db2 insert into shopper.sales1(id, itemname, qty, price)
values(2, 'choco', 50, 60)
db2 insert into shopper.sales1(id, itemname, qty, price)
values(3, 'butter', 30, 40)
db2 insert into shopper.sales1(id, itemname, qty, price)
values(4, 'milk', 1000, 12)
Example: 插入一个具有“id”值 3 的新行
db2 insert into shopper.sales1(id, itemname, qty, price)
values(3, 'cheese', 60, 80)
Output : 当你尝试插入一行已存在的 id 值时, 它将显示此结果:
DB21034E The command was processed as an SQL statement
because it was not a
valid Command Line Processor command. During
SQL processing it returned:
SQL0803N One or more values in the INSERT statement,
UPDATE statement, or foreign key update caused by a
DELETE statement are not valid because the primary key,
unique constraint or unique index identified by "1" constrains
table "SHOPPER.SALES1" from having duplicate values for the
index key. SQLSTATE=23505
Primary key
与唯一约束类似,你可以使用“主键”和“外键”约束来声明多个表之间的关系。
Syntax:
db2 create table <tab_name>( ,.., primary
key ())
Example : 创建“salesboys”表,其中“sid”为主键
db2 create table shopper.salesboys(sid int not null, name
varchar(40) not null, salary double not null, constraint
pk_boy_id primary key (sid))
Foreign key
外键是一张表中的一组列,必须匹配另一张表中一行的至少一个主键。它是一种引用约束或引用完整性约束。它是一条关于一个或多个表中多列值的逻辑规则。它使表之间存在必需的关系。
先前, 你创建了一张名为“shopper.salesboys”的表。对于此表,主键为“sid”。现在你正在创建一张具有不同模式的销售人员个人详细信息的新表,名为“employee”和表名为“salesboys”。在这种情况下,“sid”是外键。
Syntax:
db2 create table <tab_name>(<col> <col_type>,constraint
<const_name> foreign key (<col_name>)
reference <ref_table> (<ref_col>)
Example : [要创建一个名为“salesboys”的表,其中包含外键列“sid”]
db2 create table employee.salesboys(
sid int,
name varchar(30) not null,
phone int not null,
constraint fk_boy_id
foreign key (sid)
references shopper.salesboys (sid)
on delete restrict
)
Example : [将值插入到主键表“shopper.salesboys”]
db2 insert into shopper.salesboys values(100,'raju',20000.00),
(101,'kiran',15000.00),
(102,'radha',10000.00),
(103,'wali',20000.00),
(104,'rayan',15000.00)
Example : [将值插入外键表 “employee.salesboys” [无错误]]
db2 insert into employee.salesboys values(100,'raju',98998976),
(101,'kiran',98911176),
(102,'radha',943245176),
(103,'wali',89857330),
(104,'rayan',89851130)
如果您输入了一个未知的数字(未存储在 “shopper.salesboys” 表中),这将向您显示 SQL 错误。
Example : [错误执行]
db2 insert into employee.salesboys values(105,'rayan',89851130)
Output:
DB21034E The command was processed as an SQL statement because it
was not a valid Command Line Processor command. During SQL
processing it returned: SQL0530N The insert or update value of
the FOREIGN KEY "EMPLOYEE.SALESBOYS.FK_BOY_ID" is not equal to any
value of the parent key of the parent table. SQLSTATE=23503
Checking constraint
您需要使用此约束来为表中的特定列添加条件限制。
Syntax:
db2 create table
(
primary key (),
constraint check (condition or condition)
)
Example : [使用约束值创建 emp1 表]
db2 create table empl
(id smallint not null,
name varchar(9),
dept smallint check (dept between 10 and 100),
job char(5) check (job in ('sales', 'mgr', 'clerk')),
hiredate date,
salary decimal(7,2),
comm decimal(7,2),
primary key (id),
constraint yearsal check (year(hiredate) > 1986 or salary > 40500)
)
DB2 Indexes
本章涵盖索引简介、索引类型、索引创建和丢弃。
Introduction
索引是一组指针,可以引用表中的行、MDC 或 ITC 表中的块、XML 存储对象中由一个或多个键的值逻辑排序的 XML 数据。在 DB2 表列上创建索引以加快查询的数据访问速度,高效地对数据进行聚集和分区。它还可以提高对视图的操作性能。具有唯一索引的表可以包含具有唯一键的行。根据表要求,你可以采用不同类型的索引。
DB2 Triggers
本章介绍触发器,它们的类型以及触发器的创建和放弃。
Introduction
触发器是一组针对数据库中指定表上的 INSERT、UPDATE 或 DELETE 操作进行响应而执行的 actions。触发器一次性存储在数据库中。它们处理数据管理。可以在多个应用程序之间访问和共享它们。使用触发器的优点在于,如果需要在应用程序中进行任何更改,则在触发器处进行,而不是更改访问触发器的每个应用程序。触发器易于维护,且它们迫使应用程序开发更快。触发器使用 SQL 语句 “CREATE TRIGGER” 定义。
Creating a BEFORE trigger
让我们看看如何创建触发器序列:
Syntax:
db2 create sequence <seq_name>
Example :为 shopper.sales1 表创建触发器序列
db2 create sequence sales1_seq as int start with 1 increment by 1
Syntax:
db2 create trigger <trigger_name> no cascade before insert on
<table_name> referencing new as <table_object> for each row set
<table_object>.<col_name>=nextval for <sequence_name>
Example :为 shopper.sales1 表创建触发器以自动插入主键号
db2 create trigger sales1_trigger no cascade before insert on
shopper.sales1 referencing new as obj for each row set
obj.id=nextval for sales1_seq
现在尝试插入任何值:
db2 insert into shopper.sales1(itemname, qty, price)
values('bicks', 100, 24.00)
Retrieving values from table
让我们看看如何从表中检索值:
Syntax:
db2 select * from <tablename>
Example :
db2 select * from shopper.sales1
Output :
ID ITEMNAME QTY
------- ------------ ----------
3 bicks 100
2 bread 100
2 record(s) selected.
Creating an AFTER trigger
让我们看看如何创建 after 触发器:
Syntax:
db2 create trigger <trigger_name> no cascade before insert on
<table_name> referencing new as <table_object> for each row set
<table_object>.<col_name>=nextval for <sequence_name>
Example: [插入和检索值]
db2 create trigger sales1_tri_after after insert on shopper.sales1
for each row mode db2sql begin atomic update shopper.sales1
set price=qty*price; end
Output:
//inseting values in shopper.sales1
db2 insert into shopper.sales1(itemname,qty,price)
values('chiken',100,124.00)
//output
ID ITEMNAME QTY PRICE
----- -------------- ----------- -----------
3 bicks 100 2400.00
4 chiken 100 12400.00
2 bread 100 2400.00
3 record(s) selected.
DB2 - Sequences
本章将介绍序列、序列创建、序列查看和序列删除的概念。
Introduction
序列是一种软件函数,它在一定范围内生成升序或降序整数,以生成主键并在表之间协调其他键。您可以使用序列来利用整数,比如,employee_id 或 transaction_id。序列可以支持 SMALLINT、BIGINT、INTEGER 和 DECIMAL 数据类型。序列可以在多个应用程序中共享。无论事务如何,序列都会递增或递减。
通过 CREATE SEQUENCE 语句创建序列。
Parameters of sequences
以下参数用于序列:
Data type :这是返回递增值的数据类型。(SMALLINT、BIGINT、INTEGER、NUMBER、DOUBLE)
START WITH :序列从该参考值开始。
MINVALUE :序列开始使用的最小值。
MAXVALUE :序列的最大值。
INCREMENT BY :序列递增的步长值。
Sequence cycling :CYCLE 子句导致重复生成序列。通过引用已由前序序列生成并存储到数据库中的返回的值来进行序列生成。
Creating a sequence
你可以使用以下语法创建序列:
Syntax:
db2 create sequence <seq_name>
Example :[用从 1 开始的递增值创建具有“sales1_seq”名称的新序列]
db2 create sequence sales1_seq as int start
with 1 increment by 1
DB2 Views
本章介绍了视图的介绍、创建、修改和删除视图。
Creating a view
可以使用以下语法创建视图:
Syntax:
db2 create view <view_name> (<col_name>,
<col_name1...) as select <cols>..
from <table_name>
Example :为 shopper.sales1 表创建视图
db2 create view view_sales1(id, itemname, qty, price)
as select id, itemname, qty, price from
shopper.sales1
DB2 with XML
本章介绍在 DB2 中使用 XML。
Introduction
有了 PureXML 功能,你可以在数据库表的列中存储格式良好的 XML 文档。这些列具有 XML 数据库。将 XML 数据存储在 XML 列中,可以使其以本机分层形式保持数据。DB2 数据库服务器功能可以访问和管理已存储的 XML 数据。将 XML 数据存储在其本机分层形式中能够高效地搜索、检索和更新 XML。若要更新 XML 数据中的值,你需要使用 XQuery、SQL 或两者的组合。
Creating a database and table for storing XML data
通过发布以下语法创建一个数据库:
Syntax:
db2 create database xmldb
默认情况下,数据库使用 UTF-8 (UNICODE) 编码集。激活数据库并连接到它:
Syntax:
db2 activate db <db_name>
db2 connect to <db_name>
Example:
db2 activate db xmldb
db2 connect to xmldb
创建一个格式良好的 XML 文件,并创建一个数据类型为“XML”的表。必须将包含在双引号中的 SQL 查询传递到 XML 语法。
Syntax:
db2 “create table <schema>.<table>(col <datatype>,
col <xml datatype>)”
Example:
db2 "create table shope.books(id bigint not null
primary key, book XML)"
使用 SQL 语句“INSERT”将 XML 值插入到表中,格式良好的 XML 文档被插入到 XML 类型列中。
Syntax:
db2 “insert into <table_name> values(value1, value2)”
Example:
db2 "insert into shope.books values(1000, '<catalog>
<book>
<author> Gambardella Matthew</author>
<title>XML Developers Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating application
with XML</description>
</book>
</catalog>')"
Updating XML data in a table
您可以使用以下语法更新表中的 XML 数据:
Syntax:
db2 “update <table_name> set <column>=<value> where
<column>=<value>”
Example:
db2 "update shope.books set book='<catalog>
<book>
<author> Gambardella, Matthew</author>
<title>XML Developers Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth XML</description>
</book>
</catalog>' where id=1000"
DB2 - Backup and Recovery
本章介绍数据库的备份和恢复方法。
Logging
日志文件包含错误日志,这些错误日志用于从应用程序错误中恢复。日志保留数据库中更改的记录。如下所述,日志记录有两种类型:
Backup
使用 Backup 命令,您可以复制整个数据库。此备份副本包括数据库系统文件、数据文件、日志文件、控制信息等。
可以同时在脱机和联机时进行备份。
Offline backup
Syntax: [列出活动应用程序/数据库]
db2 list application
Output:
Auth Id Application Appl. Application Id
DB # of
Name Handle
Name Agents
-------- -------------- ---------- ---------------------
----------------------------------------- -------- -----
DB2INST1 db2bp 39
*LOCAL.db2inst1.140722043938
ONE 1
Syntax: [强制应用程序使用应用程序。已处理 ID]
db2 "force application (39)"
Output:
DB20000I The FORCE APPLICATION command completed
successfully.
DB21024I This command is asynchronous and may not
be effective immediately.
Syntax: [要终止数据库连接]
db2 terminate
Syntax: [要停用数据库]
db2 deactivate database one
Syntax: [要获取备份文件]
db2 backup database <db_name> to <location>
Example:
db2 backup database one to /home/db2inst1/
Output:
Backup successful. The timestamp for this backup image is :
20140722105345
Online backup
首先,您需要将模式从 Circular logging 更改为 Archive Logging 。
Syntax: [要检查数据库是否使用循环记录还是存档记录]
db2 get db cfg for one | grep LOGARCH
Output:
First log archive method (LOGARCHMETH1) = OFF
Archive compression for logarchmeth1 (LOGARCHCOMPR1) = OFF
Options for logarchmeth1 (LOGARCHOPT1) =
Second log archive method (LOGARCHMETH2) = OFF
Archive compression for logarchmeth2 (LOGARCHCOMPR2) = OFF
Options for logarchmeth2 (LOGARCHOPT2) =
在上述输出中,高亮显示的值 [logarchmeth1 和 logarchmeth2] 处于关闭模式,这意味着当前数据库处于“循环记录”模式。如果您需要使用“存档记录”模式,则需要更改或在配置文件中存在的变量 logarchmeth1 和 logarchmeth2 中添加路径。
Updating logarchmeth1 with required archive directory
Syntax: [要创建目录]
mkdir backup
mkdir backup/ArchiveDest
Syntax: [要为文件夹提供用户权限]
chown db2inst1:db2iadm1 backup/ArchiveDest
Syntax: [要更新配置 LOGARCHMETH1]
db2 update database configuration for one using LOGARCHMETH1
'DISK:/home/db2inst1/backup/ArchiveDest'
您可以进行离线备份以确保安全,激活数据库并连接到数据库。
Syntax: [要执行联机备份]
db2 backup database one online to
/home/db2inst1/onlinebackup/ compress include logs
Output:
db2 backup database one online to
/home/db2inst1/onlinebackup/ compress include logs
使用以下命令验证备份文件:
Syntax:
db2ckbkp <location/backup file>
Example:
db2ckbkp
/home/db2inst1/ONE.0.db2inst1.DBPART000.20140722112743.001
列出备份文件的历史记录
Syntax:
db2 list history backup all for one
Output:
List History File for one
Number of matching file entries = 4
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log
Backup ID
-- --- ------------------ ---- --- ------------ ------------
--------------
B D 20140722105345001 F D S0000000.LOG S0000000.LOG
------------------------------------------------------------
----------------
Contains 4 tablespace(s):
00001 SYSCATSPACE
00002 USERSPACE1
00003 SYSTOOLSPACE
00004 TS1
------------------------------------------------------------
----------------
Comment: DB2 BACKUP ONE OFFLINE
Start Time: 20140722105345
End Time: 20140722105347
Status: A
------------------------------------------------------------
----------------
EID: 3 Location: /home/db2inst1
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log
Backup ID
-- --- ------------------ ---- --- ------------ ------------
--------------
B D 20140722112239000 N S0000000.LOG S0000000.LOG
------------------------------------------------------------
-------------------------------------------------------------
-------------------------------
Comment: DB2 BACKUP ONE ONLINE
Start Time: 20140722112239
End Time: 20140722112240
Status: A
------------------------------------------------------------
----------------
EID: 4 Location:
SQLCA Information
sqlcaid : SQLCA sqlcabc: 136 sqlcode: -2413 sqlerrml: 0
sqlerrmc:
sqlerrp : sqlubIni
sqlerrd : (1) 0 (2) 0 (3) 0
(4) 0 (5) 0 (6) 0
sqlwarn : (1) (2) (3) (4) (5) (6)
(7) (8) (9) (10) (11)
sqlstate:
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log
Backup ID
-- --- ------------------ ---- --- ------------ ------------
--------------
B D 20140722112743001 F D S0000000.LOG S0000000.LOG
------------------------------------------------------------
----------------
Contains 4 tablespace(s):
00001 SYSCATSPACE
00002 USERSPACE1
00003 SYSTOOLSPACE
00004 TS1
-------------------------------------------------------------
----------------
Comment: DB2 BACKUP ONE OFFLINE
Start Time: 20140722112743
End Time: 20140722112743
Status: A
-------------------------------------------------------------
----------------
EID: 5 Location: /home/db2inst1
Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log
Backup ID
-------------------------------------------------------------
----------------
R D 20140722114519001 F
20140722112743
------------------------------------------------------------
----------------
Contains 4 tablespace(s):
00001 SYSCATSPACE
00002 USERSPACE1
00003 SYSTOOLSPACE
00004 TS1
------------------------------------------------------------
----------------
Comment: RESTORE ONE WITH RF
Start Time: 20140722114519
End Time: 20140722115015
Status: A
------------------------------------------------------------
----------------
EID: 6 Location:
Restoring the database from backup
要从备份文件恢复数据库,您需要按照给定的语法进行操作:
Syntax:
db2 restore database <db_name> from <location>
taken at <timestamp>
Example:
db2 restore database one from /home/db2inst1/ taken at
20140722112743
Output:
SQL2523W Warning! Restoring to an existing database that is
different from
the database on the backup image, but have matching names.
The target database
will be overwritten by the backup version. The Roll-forward
recovery logs
associated with the target database will be deleted.
Do you want to continue ? (y/n) y
DB20000I The RESTORE DATABASE command completed successfully.
向前滚动日志目录中位于的所有日志,包括磁盘驱动器故障前的最新更改。
Syntax:
db2 rollforward db <db_name> to end of logs and stop
Example:
db2 rollforward db one to end of logs and stop
Output:
Rollforward Status
Input database alias = one
Number of members have returned status = 1
Member ID = 0
Rollforward status = not pending
Next log file to be read =
Log files processed = S0000000.LOG -
S0000001.LOG
Last committed transaction = 2014-07-22-
06.00.33.000000 UTC
DB20000I The ROLLFORWARD command completed successfully.
DB2 - Database Security
本章介绍数据库安全性。
Introduction
可以通过两种不同的安全控制模式管理 DB2 数据库和函数:
Authentication
认证是确认用户仅根据他授权执行的活动权限登录的过程。用户认证可以在操作系统级别或数据库级别本身执行。通过使用诸如视网膜和指纹等生物特征认证工具来防止数据库遭受黑客或恶意用户的破坏。
可以在 db2 数据库系统外部管理数据库安全性。以下是一些类型的安全认证流程:
-
基于操作系统的认证。
-
轻量级目录访问协议 (LDAP)
对于 DB2,安全服务作为独立产品成为操作系统的一部分。对于认证,它需要两个不同的凭据,它们分别是用户 ID 或用户名和密码。
Authorization
您可以在 DB2 数据库系统中访问 DB2 数据库及其功能,这些功能由 DB2 数据库管理器管理。授权是由 DB2 数据库管理器管理的一个过程。管理器获取有关当前经过认证用户的的信息,以指示用户可以执行或访问哪些数据库操作。
以下是可以用于授权的不同权限方式:
Primary permission :直接授予授权 ID。
Secondary permission :如果用户是成员,则授予组和角色
Public permission :公开授予所有用户。
Context-sensitive permission :授予受信任上下文角色。
可以根据以下类别向用户授予授权:
-
System-level authorization
-
System administrator [SYSADM]
-
System Control [SYSCTRL]
-
System maintenance [SYSMAINT]
-
System monitor [SYSMON]
权威机构对实例级别的功能提供控制。权威机构会提供组权限,以控制维护和权限操作。例如,数据库和数据库对象。
-
Database-level authorization
-
Security Administrator [SECADM]
-
Database Administrator [DBADM]
-
Access Control [ACCESSCTRL]
-
Data access [DATAACCESS]
-
SQL administrator. [SQLADM]
-
Workload management administrator [WLMADM]
-
Explain [EXPLAIN]
权限机构在数据库内部提供控制。数据库的其他权限包括 LDAD 和 CONNECT。
-
Object-Level Authorization :对象级别授权涉及在对象上执行操作时验证权限。
-
Content-based Authorization :用户可以使用基于标签的访问控制 [LBAC] 对特定表上的各个行和列拥有读写访问权限。
DB2 表和配置文件用于记录与授权名称相关联的权限。当用户尝试访问数据时,记录的权限会验证以下权限:
-
用户的授权名称
-
用户所属的组
-
直接授予用户或间接授予组的角色
-
通过受信任上下文获得的权限。
在使用 SQL 语句时,DB2 授权模型会考虑以下权限的组合:
-
授予与 SQL 语句相关联的主授权 ID 的权限。
-
与 SQL 语句关联的辅助授权 ID。
-
Granted to PUBLIC
-
授予受信任上下文的权限。
Instance level authorities
让我们探讨一些与实例相关的权限。
System administration authority (SYSADM)
这是实例级别最高级别的管理权限。拥有 SYSADM 权限的用户可以在实例内执行一些数据库和数据库管理器命令。拥有 SYSADM 权限的用户可以执行以下操作:
-
Upgrade a Database
-
Restore a Database
-
更新数据库管理器配置文件。
System control authority (SYSCTRL)
这是系统控制权限中最高级别。它用于针对数据库管理器实例及其数据库执行维护和实用操作。这些操作可能会影响系统资源,但它们不允许直接访问数据库中的数据。
拥有 SYSCTRL 权限的用户可以执行以下操作:
-
更新数据库、节点或分布式连接服务 (DCS) 目录
-
强制用户退出系统级
-
创建或放弃数据库级
-
创建、更改或放弃表空间
-
Using any table space
-
Restoring Database
System maintenance authority (SYSMAINT)
它是系统控制权限的第二级。它提供对数据库管理器实例及其数据库执行维护和实用操作的功能。这些操作影响系统资源,但不会允许直接访问数据库中的数据。该权限旨在让用户维护包含敏感数据的数据库管理器实例中的数据库。
只有具有 SYSMAINT 或更高级别系统权限的用户才能执行以下任务:
-
Taking backup
-
Restoring the backup
-
Roll forward recovery
-
Starting or stopping instance
-
Restoring tablespaces
-
Executing db2trc command
-
在实例级别用户或数据库级别用户的情况下,获取系统监视器快照。
具有 SYSMAINT 的用户可以执行以下任务:
-
查询表空间的状态
-
Updating log history files
-
Reorganizing of tables
-
使用 RUNSTATS(收集目录统计信息)
Database authorities
每个数据库权限都持有执行数据库上某些操作的授权 ID。这些数据库权限与特权不同。以下是一些数据库权限的列表:
ACCESSCTRL :允许授予和撤消所有对象特权和数据库权限。
BINDADD :允许在数据库中创建新程序包。
CONNECT :允许连接到数据库。
CREATETAB :允许在数据库中创建新表。
CREATE_EXTERNAL_ROUTINE :允许创建应用程序和数据库用户使用的过程。
DATAACCESS :允许访问存储在数据库表中的数据。
DBADM :充当数据库管理员。它授予所有其他数据库权限,但 ACCESSCTRL、DATAACCESS 和 SECADM 除外。
EXPLAIN :允许解释查询计划,而不要求他们拥有访问表中数据的权限。
IMPLICIT_SCHEMA :允许用户通过使用 CREATE 语句创建对象来隐式创建架构。
LOAD :允许将数据加载到表中。
QUIESCE_CONNECT :允许在数据库静默(暂时禁用)时访问数据库。
SECADM :允许充当数据库的安全管理员。
SQLADM :允许监控和调整 SQL 语句。
WLMADM :允许充当工作负载管理员
Privileges
SETSESSIONUSER
授权标识符权限涉及授权标识符上的操作。只有一个称为 SETSESSIONUSER 权限的权限。它可以授予用户或组,并允许会话用户将其身份切换到授予了权限的任何授权标识符。此权限由用户 SECADM 权限授予。
Tablespace privileges
这些权限涉及数据库中表空间上的操作。可以向用户授予表空间的 USE 权限。然后这些权限允许他们在表空间中创建表。当创建表空间时,权限所有者可以使用具有 GRANT OPTION 命令的 USE 权限授予权限。而 SECADM 或 ACCESSCTRL 权限具有表空间上 USE 权限的权限。
DB2 - Roles
Creating and granting membership in roles
Syntax: [创建新角色]
db2 create role <role_name>
Example : [创建名为“sales”的新角色以添加某些表,这些表将由某些用户或组管理]
db2 create role sales
Output:
DB20000I The SQL command completed successfully.
Granting role from DBADM to a particular table
Syntax: [向表授予角色的权限]
db2 grant select on table <table_name> to role <role_name>
Example : [向角色“sales”添加管理表“shope.books”的权限]
db2 grant select on table shope.books to role sales
Output:
DB20000I The SQL command completed successfully.
安全管理员向必需用户授予角色。(在你使用此命令之前,你需要创建用户。)
Syntax: [向角色添加用户]
db2 grant role <role_name> to user <username>
Example : [向角色“sales”添加用户“mastanvali”]
db2 grant sales to user mastanvali
Output:
DB20000I The SQL command completed successfully.
DB2 - LDAP
Introduction
LDAP 是轻量级目录访问协议。LDAP 是一个基于客户端-服务器模型且在 TCP/IP 栈上层运行的全局目录服务行业标准协议。LDAP 提供了一个连接、访问、修改和搜索 Internet 目录的工具。
LDAP 服务器包含信息,这些信息以目录树的形式组织。客户端要求服务器提供信息或针对特定信息执行某些操作。服务器通过提供所需的(如果有的话)信息来应答客户端,或将客户端转给其他服务器处理所需的请求。然后,客户端从其他服务器获取所需信息。
目录的树形结构在所有参与服务器上始终保持相同。这是 LDAP 目录服务的一个显著特性。因此,无论客户端参考的是哪台服务器,客户端始终会以无差错的方式获取所需信息。这里,我们使用 LDAP 对 IBM DB2 进行认证,以替代操作系统认证。
LDAP 有两种类型:
我们来看看如何配置透明 LDAP。
Configuring transparent LDAP
要开始配置透明 LDAP,您需要配置 LDAP 服务器。
LDAP server configuration
创建一个 SLAPD.conf 文件,其中包含 LDAP 中所有有关用户和组对象的信息。在安装 LDAP 服务器时,默认情况下,它在机器上配置了基本的 LDAP 目录树。
下表指示修改后的文件配置。
以黄色突出显示代码框中的文本表示以下内容:
DBA 用户 ID = “db2my1”,组 = “db1my1adm”,密码 = “db2my1” 管理员用户 ID = “my1adm”,组 = “dbmy1ctl”。
# base dn: example.com
dn: dc=example,dc=com
dc: example
o: example
objectClass: organization
objectClass: dcObject
# pc box db
dn: dc=db697,dc=example,dc=com
dc: db697
o: db697
objectClass: organization
objectClass: dcObject
#
# Group: dbadm
#
dn: cn=dbmy1adm,dc=db697,dc=example,dc=com
cn: dbmy1adm
objectClass: top
objectClass: posixGroup
gidNumber: 400
objectClass: groupOfNames
member: uid=db2my1,cn=dbmy1adm,dc=db697,dc=example,dc=com
memberUid: db2my1
#
# User: db2
#
dn: uid=db2my1,cn=dbmy1adm,dc=db697,dc=example,dc=com
cn: db2my1
sn: db2my1
uid: db2my1
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
uidNumber: 400
gidNumber: 400
loginShell: /bin/csh
homeDirectory: /db2/db2my1
#
# Group: dbctl
#
dn: cn=dbmy1ctl,dc=db697,dc=example,dc=com
cn: dbmy1ctl
objectClass: top
objectClass: posixGroup
gidNumber: 404
objectClass: groupOfNames
member: uid=my1adm,cn=dbmy1adm,dc=db697,dc=example,dc=com
memberUid: my1adm
#
# User: adm
#
dn: uid=my1adm,cn=dbmy1ctl,dc=db697,dc=example,dc=com
cn: my1adm
sn: my1adm
uid: my1adm
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
uidNumber: 404
gidNumber: 404
loginShell: /bin/csh
homeDirectory: /home/my1adm
使用名称“/var/lib/slapd.conf”保存上述文件,然后执行此文件,通过以下命令将这些值添加到 LDAP 服务器中。这是一条 Linux 命令,而不是 db2 命令。
ldapadd r- -D ‘cn=Manager,dc=example,dc=com” –W –f
/var/lib/slapd.conf
在 LDAP 服务器上注册 DB2 用户和 DB2 组后,登录到已安装实例和数据库的特定用户。您需要配置 LDAP 客户端,以向客户端确认您的服务器位于何处(远程或本地)。
LDAP client configuration
LDAP 客户端配置保存在文件“ldap.conf”中。有两个文件可用于配置参数,一个通用,另一个特定。您应该在“/etc/ldap.conf”中找到第一个文件,而另一个位于“/etc/openldap/ldap.conf”中。
通用 LDAP 客户端配置文件中提供了以下数据
# File: /etc/ldap.conf
# The file contains lots of more entries and many of them
# are comments. You show only the interesting values for now
host localhost
base dc=example,dc=com
ldap_version 3
pam_password crypt
pam_filter objectclass=posixAccount
nss_map_attribute uniqueMember member
nss_base_passwd dc=example,dc=com
nss_base_shadow dc=example,dc=com
nss_base_group dc=example,dc=com
您需要根据 DB2 配置更改服务器和域信息的位置。如果我们在同一个系统中使用服务器,那么在“host”处将其指定为“localhost”,在“base”处,您可以配置 LDAP 服务器的“SLAPD.conf”文件中提到的内容。
可插拔认证模型 (PAM) 是用于认证服务的 API。这是一个用于使用加密密码和特定类型为 posixAccount 的 LDAP 对象的 LDAP 认证的公用接口。此类型的所有 LDAP 对象都表示包含可移植操作系统接口 (POSIX) 属性的抽象帐户。
网络安全服务 (NSS) 是一组支持跨平台开发支持安全性的客户端和服务器应用程序的库。其中包括 SSL、TLS、PKCS S/MIME 等库以及其他安全标准。
您需要为此接口和两个其他映射属性指定基准 DN。OpenLDAP 客户端配置文件包含下面给出的条目:
host localhost
base dc=example,dc=com
到此为止,您只需定义 LDAP 服务的主机和基准 DN。
Validating OpenLDAP environment
在配置 LDAP 服务器和 LDAP 客户端后,请验证两者是否能通信。
Step1 :使用以下命令检查您的本地 LDAP 服务器是否正在运行:
ps -ef | grep -i ldap
此命令应列出表示您 LDAP 服务器的 LDAP 程序:
/usr/lib/openldap/slapd -h ldap:/// -u ldap -g ldap -o slp=on
这表明您的 LDAP 服务器正在运行并正在等待来自客户端的请求。如果没有上述命令的进程,您可以使用“rcldap”命令启动 LDAP 服务器。
rcldap start
当服务器启动后,您可以通过发出以下命令在“/var/log/messages/”文件中对其进行监视。
tail –f /var/log/messages
Testing connection to LDAP server with ldapsearch
ldapsearch 命令打开与 LDAP 服务器的连接,绑定到它,并执行一个搜索查询,可以使用特殊参数“x”指定此搜索查询,通过使用 -x 参数而不是更加复杂的安全认证层(SASL)之类的机制来连接到您的 LDAP 服务器,以进行简单身份验证。
ldapsearch –x
LDAP 服务器应发送下面显示的响应,包含所有以 LDAP 数据交换格式(LDIF)存储的 LDAP 条目。
# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# example.com
dn: dc=example,
dc=com dc: example
o: example
objectClass: organization
objectClass: dcObject
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
Configuring DB2
在处理 LDAP 服务器和客户端后,您需要配置 DB2 数据库以用于 LDAP。让我们讨论如何安装和配置数据库,以便在 DB2 用户身份验证过程中使用 LDAP 环境。
Configuring DB2 and LDAP interaction plug-ins
IBM 提供了一个带有 DB2 LDAP 插件的免费软件包。DB2 软件包包括三个 DB2 安全插件,各针对以下一项:
-
server side authentication
-
client side authentication
-
group lookup
根据您的需求,您可以使用上述三个插件中的任何一个或全部。该插件不支持某些用户在 LDAP 中定义,而其他用户在操作系统中定义的环境。如果您决定使用 LDAP 插件,则需要在 LDAP 服务器中定义与数据库关联的所有用户。该原则也适用于该组插件。
您必须决定哪些插件对我们的系统是强制性的。在客户端系统上发生 CONNECT 或 ATTACH 语句时提供用户 ID 和密码验证的情形中,使用客户端身份验证插件。因此,必须将数据库管理器配置参数 SRVCON_AUTH 或 AUTHENTICATION 设置为值 CLIENT。很难保护客户端身份验证,通常不建议使用。通常建议使用服务器插件,因为如果客户端执行 CONNECT 或 ATTACH 语句,它会执行用户 ID 和密码的服务器端验证,这是安全的方式。服务器插件还提供了一种将 LDAP 用户 ID 映射到 DB2 授权 ID 的方法。
现在您可以开始安装和配置 DB2 安全插件,您需要考虑 DB2 所需的目录信息树。DB2 使用间接授权,这意味着用户属于一个组,而该组被授予较少的权限。您需要在 LDAP 目录中定义所有 DB2 用户和 DB2 组。
Image
LDIF 文件 openldap.ldif 应包含以下代码:
#
# LDAP root object
# example.com
#
dn: dc=example,
dc=com
dc: example
o: example
objectClass: organization
objectClass: dcObject
#
# db2 groups
#
dn: cn=dasadm1,dc=example,dc=com
cn: dasadm1
objectClass: top
objectClass: posixGroup
gidNumber: 300
objectClass: groupOfNames
member: uid=dasusr1,cn=dasadm1,dc=example,dc=com
memberUid: dasusr1
dn: cn=db2grp1,dc=example,dc=com
cn: db2grp1
objectClass: top
objectClass: posixGroup
gidNumber: 301
objectClass: groupOfNames
member: uid=db2inst2,cn=db2grp1,dc=example,dc=com memberUid: db2inst2
dn: cn=db2fgrp1,dc=example,dc=com
cn: db2fgrp1
objectClass: top
objectClass: posixGroup
gidNumber: 302
objectClass: groupOfNames
member: uid=db2fenc1,cn=db2fgrp1,dc=example,dc=com
memberUid: db2fenc1
#
# db2 users
#
dn: uid=dasusr1,
cn=dasadm1,
dc=example,dc=com
cn: dasusr1
sn: dasusr1
uid: dasusr1
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
uidNumber: 300
gidNumber: 300
loginShell: /bin/bash
homeDirectory: /home/dasusr1
dn: uid=db2inst2,cn=db2grp1,dc=example,dc=com
cn: db2inst2
sn: db2inst2
uid: db2inst2
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
uidNumber: 301
gidNumber: 301
loginShell: /bin/bash
homeDirectory: /home/db2inst2
dn: uid=db2fenc1,cn=db2fgrp1,dc=example,dc=com
cn: db2fenc1
sn: db2fenc1
uid: db2fenc1
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
uidNumber: 303
gidNumber: 303
loginShell: /bin/bash
homeDirectory: /home/db2fenc1
创建一个名为“db2.ldif”的文件,并将上述示例粘贴到其中。使用此文件,将已定义的结构添加到 LDAP 目录。
要将 DB2 用户和 DB2 组添加到 LDAP 目录,您需要将用户绑定为“rootdn”到 LDAP 服务器以获得确切的权限。
执行以下语法,使用 LDIF 文件“db2.ldif”中定义的所有对象填充 LDAP 信息目录
ldapadd –x –D “cn=Manager, dc=example,dc=com” –W –f <path>/db2.ldif
执行具有更多参数的搜索结果
ldapsearch –x |more
Preparing file system for DB2 usage
为我们的 LDAP 用户 db2inst2 创建实例。此用户需要包含空文件的目录。在创建新实例之前,您需要创建一个成为该实例所有者的用户。
在创建实例用户后,您必须在用户主目录(DB2 将对其进行修改)中创建文件“.profile”和“.login”。要在该目录中创建此文件,请执行以下命令:
mkdir /home/db2inst2
mkdir /home/db2inst2/.login
mkdir /home/db2inst2/.profile
您已经在 LDAP 目录中注册了所有与 DB2 相关联的用户和组,现在您可以使用实例所有者 ID“db2inst2”和 fenced 用户 ID“db2fenc1”创建一个名为“db2inst2”的实例,这是运行用户定义函数 (UDF) 或存储过程所必需的。
/opt/ibm/db2/V10.1/instance/db2icrt –u db2fenc1 db2inst2
DBI1070I Program db2icrt completed successfully.
现在检查实例主目录。您会看到一个名为“sqllib”的新子目录,以及为 DB2 使用而定制的 .profile 和 .login 文件。
Configuring authentication public-ins for LDAP support in DB2
将所需的 LDAP 插件复制到相应的 DB2 目录:
cp ///v10/IBMLDAPauthserver.so
/home/db2inst2/sqllib/security/plugin/server/.
cp ///v10/IBMLDAPgroups.so
/home/db2inst2/sqllib/security
/plugin/group/.
插件复制到指定目录后,您调整为 DB2 实例所有者登录并更改数据库管理器配置以使用这些插件。
Su – db2inst2
db2inst2> db2 update dbm cfg using svrcon_pw_plugin
IBMLDAPauthserver
db2inst2> db2 update dbm cfg using group_plugin
IBMLDAPgroups
db2inst2> db2 update dbm cfg using authentication
SERVER_ENCRYPT
db2inst2> db2stop
db2inst2> db2start
该修改在您启动 DB2 实例后生效。在重新启动该实例后,您需要安装和配置主 DB2 LDAP 配置文件“IBMLDAPSecurity.ini”,以使 DB2 插件与当前 LDAP 配置一起使用。
IBMLDAPSecurity.ini 文件包含
;-----------------------------------------------------------
; SERVER RELATED VALUES
;-----------------------------------------------------------
; Name of your LDAP server(s).
; This is a space separated list of LDAP server addresses,
; with an optional port number for each one:
; host1[:port] [host2:[port2] ... ]
; The default port number is 389, or 636 if SSL is enabled.
LDAP_HOST = my.ldap.server
;-----------------------------------------------------------
; USER RELATED VALUES
;-----------------------------------------------------------
rs
; LDAP object class used for use USER_OBJECTCLASS = posixAccount
; LDAP user attribute that represents the "userid"
; This attribute is combined with the USER_OBJECTCLASS and
; USER_BASEDN (if specified) to construct an LDAP search
; filter when a user issues a DB2 CONNECT statement with an
; unqualified userid. For example, using the default values
; in this configuration file, (db2 connect to MYDB user bob
; using bobpass) results in the following search filter:
OrgPerson)(uid=bob)
; &(objectClass=inet USERID_ATTRIBUTE = uid
representing the DB2 authorization ID
; LDAP user attribute, AUTHID_ATTRIBUTE = uid
;-----------------------------------------------------------
; GROUP RELATED VALUES
;-----------------------------------------------------------
ps
; LDAP object class used for grou GROUP_OBJECTCLASS = groupOfNames
at represents the name of the group
; LDAP group attribute th GROUPNAME_ATTRIBUTE = cn
; Determines the method used to find the group memberships
; for a user. Possible values are:
; SEARCH_BY_DN - Search for groups that list the user as
; a member. Membership is indicated by the
; group attribute defined as
; GROUP_LOOKUP_ATTRIBUTE.
; USER_ATTRIBUTE - A user's groups are listed as attributes
; of the user object itself. Search for the
; user attribute defined as
TRIBUTE to get the groups.
; GROUP_LOOKUP_AT GROUP_LOOKUP_METHOD = SEARCH_BY_DN
; GROUP_LOOKUP_ATTRIBUTE
; Name of the attribute used to determine group membership,
; as described above.
llGroups
; GROUP_LOOKUP_ATTRIBUTE = ibm-a GROUP_LOOKUP_ATTRIBUTE = member
现在定位当前实例目录中的文件 IBMLDAPSecurity.ini 文件。将上述示例内容复制到其中。
Cp
//db2_ldap_pkg/IBMLDAPSecurity.ini
/home/db2inst2/sqllib/cfg/
现在,您需要使用以下两个语法重新启动 DB2 实例:
db2inst2> db2stop
Db2inst2> db2start
此时,如果您尝试“db2start”命令,您会收到安全错误消息。因为尚未针对您的 LDAP 环境正确配置 DB2 安全配置。
Customizing both configurations
将 LDAP_HOST 名称准备好,该名称在 slapd.conf 文件中进行配置。
现在,编辑 IMBLDAPSecurity.ini 文件并键入 LDAP_HOST 名称。所述两个文件中的 LDAP_HOST 名称必须相同。
文件的内容如下所示:
;-----------------------------------------------------------
; SERVER RELATED VALUES
;-----------------------------------------------------------
LDAP_HOST = localhost
;-----------------------------------------------------------
; USER RELATED VALUES
----------------------------
;-------------------------------
USER_OBJECTCLASS = posixAccount
USER_BASEDN = dc=example,dc=com
USERID_ATTRIBUTE = uid
AUTHID_ATTRIBUTE = uid
;-----------------------------------------------------------
; GROUP RELATED VALUES
;-----------------------------------------------------------
GROUP_OBJECTCLASS = groupOfNames
GROUP_BASEDN = dc=example,dc=com
GROUPNAME_ATTRIBUTE = cn
GROUP_LOOKUP_METHOD = SEARCH_BY_DN
GROUP_LOOKUP_ATTRIBUTE = member
更改这些值后,LDAP 会立即生效,而您的 DB2 环境搭配 LDAP 也可完美运行。
您可以注销并重新登录到“db2inst2”用户。
现在,您的实例正在与 LDAP 目录一起工作。