Linux系统下DB2

  • Linux系统下启动DB2
  • 常用的一些数据库指令
  • 1.数据库相关操作
  • 2.表的相关操作


Linux系统下启动DB2

1.修改主机名为db2

vi /etc/sysconfig/network

将文件内容修改为:

NETWORKING=yes
HOSTNAME=db2

2.修改/etc/hosts 中主机名为db2
将文件修改成为如下:

127.0.0.1   redhat6 localhost db2 localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

3.切换到db2用户

su - db2inst1
chmod 775 sqllib/db2nodes.cfg

4.修改sqllib/db2nodes.cfg中主机名为db2
将文件修改成为如下:

0 db2 0

然后使用命令db2start启动DB2数据库实例。

常用的一些数据库指令

1.数据库相关操作

  • 开启数据库:db2start
  • 关闭数据库:db2stop (force) ,后面加force为强制关闭,最好先保证db2 list application没有应用连接
  • 查看数据库版本
    db2licm -vdb2level 或者用SQL语句:
db2 select service_level from sysibmadm.env_init_info
  • 查看db2的许可证信息:db2licm -l ,导入许可证:db2licm -a <文件>
  • 显示当前的实例:db2 get instance
  • 列出所有数据库:db2 list db directory
  • (指定路径)创建数据库:db2 create db db_name (on /tmp)
  • 连接数据库:db2 connect to db_name
  • 断开数据库连接:db2 connect resetdb2 disconnect current
  • 数据库激活db2 activate database db_name
  • 查看激活的数据库db2 list active databases
  • 停止激活db2 deactivate database db_name
  • 删除数据库db2 drop database db_name ,注意删除数据库之前要使数据库处于deactive的状态
  • 创建不同字符集的数据库
db2 create database db_name using codeset GBK territory CN

更多字符集(codeset)参考:DB2字符集官方文档

  • 查看当前DB2数据库用户
db2 select current schema from sysibm.sysdummy1
#  db2 "select current schema from sysibm.sysdummy1"
  • 查看数据的相关配置
db2 get db cfg for db_name
  • 设置数据库,允许进行增量备份
db2 update db cfg for <db_name> using trackmod on
  • 设置归档模式数据库:
    db2数据库的归档方法有如下几种off, logretain, userexit, disk, tsm, vendor。数据库的默认日志模式为循环日志记录即off.
    1). 可以通过命令手动修改配置文件
db2 update db cfg for <db_name> using logretain on 
db2 update db cfg for <db_name> using logarchmeth1 userexit 
db2 update db cfg for <db_name> using logarchmeth1 disk:/tmp
db2 update db cfg for <db_name> using logarchmeth1 tsm
  • 2). db2 backup db <db_name> to /tmp 3). 强制归档:db2 archive log for db <db_name>

2.表的相关操作

  • 列出数据库中的表:db2 list tables
  • 创建表:db2 "create table table_name(vol1 , vol2 , vol3 ... )"
  • 修改表名称:
db2 rename table <旧表名> to <新表名>
  • 修改表中某字段名:
db2 alter table <table_name> rename column <old_column_name> to <new_column_name>
  • 创建表指定表空间
db2  create table table_name(vol1 , vol2 , vol3 ... ) in  <tablespace_name> ;
#  db2  "create table table_name(vol1 , vol2 , vol3 ... ) in  <tablespace_name> "
  • 创建一个主键自增的表:
db2 create table s1 (id int not null primary key generated always as identity (start with 20001,increment  by +1),name varchar(200) not null) ;
#  db2 "create table s1 (id int not null primary key generated always as identity (start with 20001,increment  by +1),name varchar(200) not null) "
  • 表的时间类型:

时间类型

默认当前时间

表达形式

date

default current date

xx年xx月xx日,如 2021-03-01

time

default current time

x时x分x秒,如 11:00:21

timestamp

default current timestamp

具体时间,如 2021-03-01-11.00.21.421000

  • 查看表所在的表空间:
db2 select tabname,tbspace from syscat.tables where tabname = '表名' ;   #表名大写
#  db2 "select tabname,tbspace from syscat.tables where tabname = '表名' "
  • 查看表所在的索引:
db2 select * from syscat.index where tabname = '表名' ;   #表名大写
#  db2 "select * from syscat.index where tabname = '表名' "
  • 查询所有的表空间
db2 select tbsp_name, case TBSP_USING_AUTO_STORAGE  when 1 then 'YES' else 'NO' end auto_storage from table (sysproc.MON_GET_TABLESPACE('',-1)) ;
#  db2 "select tbsp_name, case TBSP_USING_AUTO_STORAGE  when 1 then 'YES' else 'NO' end auto_storage from table (sysproc.MON_GET_TABLESPACE('',-1)) "
  • 查询确认表空间(重点观察Containers一栏的内容)
db2 connect to <DBNAME>
db2pd -db <DBNAME> -tablespaces
  • 插入数据: db2 "insert into table_name values(value1,value2 ...)"
  • 将文本文件的数据导入数据库某个表中,如将test.txt文件的数据导入到student表中:
db2 import from '(路径名)\test.txt' of del insert into student ;
  • 显示数据: db2 select * from table_name
  • 创建BUFFERPOOL
db2 CREATE BUFFERPOOL epayBUFFER SIZE 1000 PAGESIZE 32K ;
#  db2 "CREATE BUFFERPOOL epayBUFFER SIZE 1000 PAGESIZE 32K "
  • 创建TABLESPACE(表空间)
    表空间SMS MANAGED BY SYSTEM (指定的最后可以是目录)
    表空间DMS MANAGED BY DATABASE (指定的最后只能是文件)
db2 CREATE TABLESPACE epaySpace PAGESIZE 32K MANAGED BY SYSTEM USING ('/home/db2inst1/epay/ts') BUFFERPOOL epayBUFFER ;
#  db2 "CREATE TABLESPACE epaySpace PAGESIZE 32K MANAGED BY SYSTEM USING ('/home/db2inst1/epay/ts') BUFFERPOOL epayBUFFER "
db2 CREATE TABLESPACE TS_SPACE2 MANAGED BY DATABASE USING (FILE '/home/db2inst1/ts_space2/ts' 1000)
#  db2 "CREATE TABLESPACE TS_SPACE2 MANAGED BY DATABASE USING (FILE '/home/db2inst1/ts_space2/ts' 1000)"
  • 清空表数据

1).使用 DELETE 语句

db2 DELETE FROM < 表名 >

该语句将清除表中所有数据,但由于这一操作会记日志,因此执行速度会相对慢一些。另外要注意的是,如果表较大,那么为保证删除操作的成功,应考虑是否留有足够大的日志空间。

2).使用 NOT LOGGED INITIALLY 选项

db2 ALTER TABLE < 表名 > ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE

这一方法仅在所操作的表在创建时选择了 NOT LOGGED INITIALLY 选项进行定义后才可使用。整个删除操作将不会记日志,因此执行速度是这 4 种方法中最快的一种,但删除的数据是不可恢复的。

3).使用 LOAD 命令

db2 LOAD FROM /dev/null OF DEL REPLACE INTO < 表名 > NONRECOVERABLE 
--(UNIX 系统或 LOAD FROM < 空文件 > OF DEL REPLACE INTO < 表名 > NONRECOVERABLE

在这一方法中,REPLACE 导入方式首先会将表中所有数据清空,然后 IMPORT/LOAD 又向表中导入了空数据,从而实现了数据的清除操作。

4).使用 DROP/CREATE TABLE 语句

db2 DROP TABLE < 表名 > CREATE TABLE < 表名 > < 字段的定义 >

如果保存有表的定义语句,或已利用 DB2LOOK 命令获得了表定义的脚本,那么也可先删除整个表,再重新创建表。如果表较大,那么用这种方法实现数据清空的速度会快于使用 DELETE 语句。但是用这种方法时要注意:如果这个表上有很多外键,那么需要维护外键的完整性。

PS:

9.7新增了 TRUNCATE TABLE tabname IMMEDIATE 快速删除表里所有行,不能回滚