1.检查glibc 需要高于1.14
rpm -aq|grep glibc
1.规划账号(OS)
不建议用root用户安装管理。
创建组:
[root@dm1 grub]# cat /etc/group|grep dinstall
[root@dm1 grub]# groupadd dinstall
创建用户:
[root@dm1 grub]# id dmdba
[root@dm1 grub]# useradd -g dinstall dmdba
[root@dm1 grub]# passwd dmdba
规划安装路径:
mkdir /dm7
chown -R dmdba:dinstall /dm7
ls -ld /dm7
配置环境变量
cd /home/dmdba
vi .bash_profile
配置内容如下:
PATH=$PATH:$HOME/bin
export PATH
export DM_HOME=/dm7
export PATH=$DM_HOME/bin:$DM_HOME/tool:$PATH:$HOME/bin
[dmdba@localhost ~]$ source .bash_profile
配置完成后 执行 echo DM_HOME 若出现 /dm7 则成功,若没有出现则 执行:
source .bash_profile
设置文件最大打开数量
ulimit -n 65536
或者
vi /etc/security/limits.conf
添加以下内容:
dmdba soft nofile 4096
dmdba hard nofile 65536
挂载安装包,需在root用户下
mount -o loop /installdoc/dm7_setup_rh6_64_ent_7.6.0.142_20190312.iso /mnt
切换到dmdba账号下,安装数据库
cd mnt
命令行安装:
./DMInstall.bin -i
2.创建数据库实例-图形化
运行dbca.sh
创建数据库实例--命令行
./dminit path=/dm7/data DB_NAME=DM02 instance_name=DMSERVER02 PORT_NUM=5237
su - root
cd /dm7/script/root/
./dm_service_installer.sh -t dmserver -i /dm7/data/DM02/dm.ini -p DMSERVER02
service DMSERVER02 start
netstat -ntl|grep 52
数据库实例登录
disql sysdba/dameng123@localhost:5236
数据库实例状态切换
select status$ from v$instance;
alter database mount;
重做日志文件
SQL> select path from v$rlogfile;
SQL> alter database add logfile '/dm7/data/DAMENG/DAMENG04.log' size 128;
SQL> select path,rlog_size/1024/1024 from v$rlogfile;
SQL> alter database resize logfile '/dm7/data/DAMENG/DAMENG04.log' to 256;
数据库文件
select path from v$datafile;
控制文件
select para_name,para_value from v$dm_ini where para_name='CTL_PATH';
修改参数(v$parameter)
参数类型
0 Sys/session 动态参数,同时修改内存和配置文件
1 Read only 在数据库运行状态时,不能修改。
2 In file 静态参数,修改后,重启服务生效
SQL> Select para_name,para_value from v$dm_ini where para_name='BUFFER_POOLS';
LINEID para_name para_value
---------- ------------ ----------
1 BUFFER_POOLS 3
3.2 命令
SP_PARA_SET_VALUE(SCOPE,PARA_NAME,PARA_VALUE);
SCOPE值:
1: 修改配置文件和内存
2:只修改配置文件
示例:
SQL> SP_SET_PARA_VALUE(2,’BUFFER’,1000);
表空间
视图
dba_tablespaces
v$tablespace
v$huge_tablespace
创建一个表空间,初始大小50M,最大100M
SQL> create tablespace tbs2 datafile '/dm7/data/DAMENG/tbs2_01.dbf' size 50 autoextend on maxsize 100;
创建一个表空间,初始大小50M,表空间由2个数据文件组成,分别存储在不同的磁盘上,每次扩展1m,每个数据文件最大100M
create tablespace tbs3 datafile '/dm7/data/DAMENG/tbs3_01.dbf' size 50 autoextend on next 1 maxsize 100,'/dm7/data/tbs3_02.dbf' size 50 autoextend on next 1 maxsize 100;
扩展表空间
alter tablespace tbs1 add datafile '/dm7/data/DAMENG/tbs1_02.dbf' size 32;
更换存储位置
0:----online
1:------offline
SQL> alter tablespace tbs3 offline;
SQL> select tablespace_name,status from dba_tablespaces;
SQL> alter tablespace tbs3 rename datafile '/dm7/data/tbs3_02.dbf' to '/dm7/data/DAMENG/tbs3_02.dbf';
SQL> alter tablespace tbs3 online;
SQL> select file_name,status,tablespace_name from dba_data_files;
用户管理
SQL> select username from dba_users;
案例1:建立用户test,用户可以创建自己的表,有属于自己的表空间,用户密码要求每60天变更一次。
SQL> create tablespace test datafile '/dm7/data/DAMENG/test_01.dbf' size 32;
SQL>create user test identified by dameng123 limit password_life_time 60 default tablespace test;
SQL> select * from all_users;
SQL> conn test/dameng123
SQL>select grantee,granted_role from dba_role_privs where grantee='TEST';
SQL> select grantee,privilege from dba_sys_privs where grantee='PUBLIC';
SQL> grant create table to test;
案例2:规划一个用户test1,用户每60天变更一次密码,密码尝试连接2次失败,账号锁定5分钟,用户能查询sales.customer表。
create user test1 identified by dameng123 limit password_life_time 60,failed_login_attemps 2,password_lock_time 5;
//尝试登录2次后
SQL> select username,account_status,lock_date from dba_users;
SQL>alter user test1 account unlock;
SQL> select username,account_status,lock_date from dba_users;
SQL> grant select on sales.customer to test1; //赋权限
SQL> revoke select on sales.customer from test1; //发现权限过大
SQL> grant select(person_id) on sales.customer to test1; //赋权限
SQL> conn test1/dameng123
SQL> select user;
SQL> select person_id from bookshop.reader limit 10;
企业招聘一批录入人员,权限固定,只能录入city表。
SQL> conn sysdba/dameng123
SQL> create role r1;
SQL> grant insert on dmhr.city to r1;
SQL> create user test2 identified by dameng123;
SQL> grant r1 to test2;
SQL> conn test2/dameng123
SQL> insert into dmhr.city values('sdf','dfdss',7);
insert into dmhr.city values('sdf','dfdss',7);
[-5506]:没有引用表[REGION]上的权限.
SQL> conn sysdba/dameng123
SQL> grant references any table to test2;
SQL> conn test2/dameng123
SQL> insert into dmhr.city values('aaa','bbbb',6);
SQL> commit;
用户维护
收回权限:revoke
SQL> revoke select on dmhr.employee from test1;
赋权限:
SQL> grant references any table to test2;
修改用户密码
SQL> alter user test identified by 123456789;
锁定用户
SQL> alter user test account lock;
解锁用户
SQL> alter user test account unlock;
删除用户:
SQL> drop user test;
SQL> drop user test cascade;-------慎重,最好先备份
删除角色:
SQL> drop role r1;
表的管理
遵循3范式。
案例1.规划一张学员信息表。
表名:STU
学号:id char(10)
姓名:sname varchar(20) not null
性别:sex char(1)
年龄:age int
电话:tel varchar(15) not null
家庭住址:address varchar(50)
表空间 STU
约束:主键列—学号,非空—姓名和电话。
备注:student info
create table "TEST1"."STU"
(
"ID" CHAR(10) ,
"SNAME" VARCHAR(20) not null ,
"SEX" CHAR(1) ,
"AGE" INT,
"TEL" VARCHAR(15) not null ,
"ADDRESS" VARCHAR(50),
primary key("ID")
)
storage(initial 1, next 1, minextents 1, fillfactor 0, on "STU")
;
comment on table "TEST1"."STU" is 'STUDENT INFO';
1、非空约束
SQL> create table test1.t1(id int);
SQL> alter table test1.t1 modify id int not null;
2、唯一约束
SQL> create table test1.t2(id int unique);
唯一约束遇到null,忽略,可录入多个。
3、主键约束(一张表只能有一个主键约束)
SQL> create table test1.t3(id int primary key);
SQL> create table test1.t4(id int);
SQL> alter table test1.t4 add constraint t4_pri primary key(id);
4、检查约束
SQL> create table test1.t5(id int check(id>=5));
外键约束
SQL> create table test1.t6(sid int primary key ,pid int);
SQL> create table test1.t7(id int primary key,sid int foreign key references test1.t6(sid));
7、对列加备注
SQL> comment on column test1.t6.sid is '编号';
导入数据到数据库
cat a.sql
insert into test1.t1 values(1);
insert into test1.t1 values(2);
insert into test1.t1 values(3);
insert into test1.t1 values(4);
insert into test1.t1 values(5);
insert into test1.t1 values(6);
insert into test1.t1 values(7);
commit;
SQL> start /home/dmdba/a.sql
SQL> select * from test1.t1;
维护表
1、重命名:
SQL> alter table test1.t1 rename to tt;
2、增加删除列
SQL> alter table test1.tt add name varchar(10) default 'aaaa';
SQL> alter table test1.tt drop name;
3、启用和禁用约束
SQL> select table_name,constraint_name,constraint_type from dba_constraints where table_name='T5';
SQL> alter table test1.t5 enable constraint CONS134218779;
删除表:
SQL> drop table test1.tt;
如何去查看表结构
语法:sp_tabledef(‘模式名’,’表名’);
SQL> sp_tabledef('TEST','T1');
语法:DBMS_METADATA.GET_DDL(‘类型’,‘表名’,‘模式名’)
SQL> select dbms_metadata.get_ddl('TABLE','STU','TEST1');
视图管理
创建create view() as select() from () where();
SQL>create view test1.v1 as select * from dmhr.employee;
SQL>create view test1.v2 as select employee_name,hire_date,salary from dmhr.employee where hire_date >='2010-01-01';
相关数据字典:
Dba_views;
索引管理
查看索引:
SQL> select table_name,index_name from dba_indexes where table_name='STU';
创建表的索引
规划索引表空间,表的数据无序的,索引的数据是有序
SQL> create tablespace index1 datafile '/dm7/data/DAMENG/index1_01.dbf' size 32; //创建索引表空间
SQL> create table test1.emp(id int);
SQL> select table_name,index_name from dba_indexes where table_name='EMP';
SQL> create index ind_emp on test1.emp(id) tablespace index1;
SQL> select table_name,index_name from dba_indexes where table_name='EMP';
SQL> explain select * from test1.emp where id<10;
SQL> begin //没有走我们自己建的索引,统计信息是旧的,需要重新收集
收集统计信息:
2 dbms_stats.gather_table_stats('TEST1','EMP');
3 end;
4 /
DMSQL 过程已成功完成
已用时间: 8.743(毫秒). 执行号:1969.
SQL> explain select * from test1.emp where id<10;
1 #NSET2: [0, 1, 12]
2 #PRJT2: [0, 1, 12]; exp_num(2), is_atom(FALSE)
3 #SSEK2: [0, 1, 12]; scan_type(ASC), IND_EMP(EMP), scan_range(null2,10)
重建索引:
SQL> alter index test1.ind_emp rebuild;
SQL> alter index test1.ind_emp rebuild online; //online的作用?
删除索引:
SQL> drop index test1.ind_emp;
序列管理:
SQL> create sequence test1.s1
2 start with 1 -----序列的起始
3 increment by 1 ---自增多少
4 maxvalue 5 ----最大值
5 nocache ---是否缓存
6 nocycle ---是否循环
7 ;
SQL> create table test1.t10(id int primary key);
SQL> insert into test1.t10 values(test1.s1.nextval);
SQL> insert into test1.t10 values(test1.s1.nextval);
修改序列
SQL> alter sequence test1.s1 maxvalue 10; SQL> insert into test1.t10 values(test1.s1.nextval);
删除序列
SQL> drop sequence test1.s1;
案例1:求各个部门的最高工资
SQL> select department_id,max(salary) from dmhr.employee group by department_id;
1
案例2:找出部门平均工资大于10000的所有部门
SQL> select department_id,avg(salary) av1 from dmhr.employee group by department_id having avg(salary)>10000;
1
注意:having 表示分组后的数据进行过滤,having不能单独使用,一定是和group by 一起使用。聚合函数不能出现在where子句中。
排序 升序asc 降序desc 默认升序
SQL> select department_id,avg(salary) av1 from dmhr.employee group by department_id having avg(salary)>10000 order by av1 desc;
多表连接查询:
内连接:结果集显示全部满足连接条件的记录 inner join
SQL> select employee_name,department_name from dmhr.employee e join dmhr.department d on e.department_id=d.department_id limit 10;
外连接
左外连接:把left join 左边的全部显示出来,右边的只显示满足条件的,不满足条件的用null 代替
SQL> update dmhr.employee set department_id=null where employee_id=1001;
SQL> select employee_name,department_name from dmhr.employee e left join dmhr.department d on e.department_id=d.department_id limit 10;
右外连接: 把写在right join右边的全部显示出来,左边的只显示满足条件的,不满足条件的用null代替
SQL> insert into dmhr.department values('1106','aaaa','9002',9);
SQL> select employee_name,department_name from dmhr.employee e right join dmhr.department d on e.department_id=d.department_id;
全外连接:返回所有的记录,包括不满足条件
select employee_name,department_name from dmhr.employee full join dmhr.department d on e.department_id=d.department_id;
物理备份
1)工具简介
冷备:(dmap服务打开的状态下,数据库是关闭的)
热备:(dmap服务一定是打开的,数据库也是打开的,数据库要开归档)
导入导出:dexp dimp
集群:数据守护(dw),dsc(rac)
达梦支持第三方的备份软件:爱数,鼎甲
2)物理备份过程(冷备)
第一步:创建归档日志存放路径
#mkdir /dm7/data/dm01/arch
第二步:开归档
SQL> alter database mount;
SQL> alter database add archivelog 'type=local,dest=/dm7/data/dm01/arch,file_size=64,space_limit=0';
SQL> alter database archivelog;
SQL> alter database open;
SQL> select ARCH_MODE,STATUS$ from v$database;
第三步:停止数据库服务
[dmdba@localhost dm01]$ service DmServicedm01 stop
第四步:使用dmrman备份
说明:dmrman 命令必须在命令所在的bin目录下执行才行
[dmdba@localhost bin]$ pwd
/dm7/bin
[dmdba@localhost bin]$ ./dmrman
RMAN> backup database '/dm7/data/dm01/dm.ini';
根据提示信息找到备份文件位置
使用命令行备份(热备)
使用命令行备份,同样需要开归档,但是不需要停数据库服务
#mkdir /dm7/data/backup
SQL> backup database full backupset '/dm7/data/backup/full_bak';
增量备份
SQL> insert into user2.t1 values(user2.s1.nextval);
SQL> select checkpoint(1);
SQL> backup database increment backupset '/dm7/data/backup/incr_bak';
恢复表空间
SQL> restore tablespace tbs3 from backupset '/dm7/backup/full_bak2/';
SQL> alter tablespace tbs3 online;
逻辑备份
导入导出(dexp,dimp)
分为四种级别:分别独立,互斥不能同时存在
数据库级别:导出或导入整个数据库的访问对象
用户:导入或导出一个或多个用户所拥有的所有对象
模式:导入或导出一个或多个模式下的所有的对象
表级:导出或导入一个或多个指定表或表分区
逻辑导出
[dmdba@dca01 tool]$ mkdir /dm7/backup/dexp
[dmdba@dca01 bin]$ ./dexp sysdba/dameng123@localhost:5236 file=dexp01.dmp log=dexp01.log directory=/dm7/backup/dexp full=y
逻辑导入
[dmdba@dca01 bin]$ ./dimp sysdba/SYSDBA@localhost:5239 file=/dm7/backup/dexp/dexp01.dmp log=/dm7/backup/dexp/dimp01.log
作业:
tool/manager
Sysjobs:作业信息
Sysjobschedules:作业的调度信息
Sysjobhistories:作业的历史信息
SQL> select * from sysjob.sysjobs;
dm开发:
达梦支持那些语言做开发
C,c++, java,python ,php,perl
定义一个DM jdbc 的驱动串:
String jdbcstring=”dm.jdbc.driver.DmDriver”
DM URL连接串
String urlstring=”jdbc:dm://ip:5236”
10.1.配置ODBC
Linux环境中配置ODBC环境
检查:[root@dca01 ~]# rpm -aq|grep gcc 有没有gcc包,如果没有,配置yum源去安装。
解压安装包
tar -xzvf unixODBC-2.3.0.tar.gz
配置odbc
[root@dca01 unixODBC-2.3.0]# cd unixODBC-2.3.0
[root@dca01 unixODBC-2.3.0]# ./configure --enable-gui=no
编译odbc
[root@dca01 unixODBC-2.3.0]# make
[root@dca01 unixODBC-2.3.0]# make install
查看odbc的版本
[root@dca01 unixODBC-2.3.0]# odbc_config --version
查看odbc配置文件路径
[root@dca01 unixODBC-2.3.0]# odbc_config --odbcini
[root@dca01 unixODBC-2.3.0]# odbcinst -j
配置odbc.ini 和odbcinst.ini
[root@localhost ~]# cd /usr/local/etc/
[root@localhost etc]# cat odbc.ini
[dm7]
Description = DM ODBC DSND
Driver = DM7 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = dameng123
TCP_PORT = 5236
[root@localhost etc]#
[root@localhost etc]# cat odbcinst.ini
[DM7 ODBC DRIVER]
Description = ODBC DRIVER FOR DM7
DRIVER = /dm7/bin/libdodbc.so
[root@localhost etc]# isql dm7