广东省网站设计与开发百度关键词优化的意思
达梦:【1】达梦常用操作
- 一、登录达梦
- 二、创建表空间及用户模式
- 三、查看表空间、用户、模式
- 四、系统查询
- 五、角色管理
- 六、数据库导入导出
- 七、达梦数据库汉字存储
- 八、根据表生成ctl控制文件
- 九、本地连多台数据库(RAC)
一、登录达梦
./disql username/password@ip:port
> select * from dual;
二、创建表空间及用户模式
1、一个用户下可以有多个模式名,一个模式只能跟着一个用户,创建用户会自己生成模式,先创建表空间,再创建用户绑定表空间
create tablespace "表空间名称" datafile '表空间名称.DBF' size 32 CACHE = NORMAL; --创建表空间
create user 用户名称 identified by 用户密码 default tablespace 表空间名称; --创建用户
2、创建模式
CREATE SCHEMA "模式名称" AUTHORIZATION "SYSDBA";
三、查看表空间、用户、模式
1、查看表空间
select * from dba_data_files; --查看所有表空间
select * from dba_free_files; --查看所有剩余表空间
2、查看用户
select * from dba_users; --查看所有用户
3、查看模式
SELECT DISTINCT object_name FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'SCH' --查询所有的模式名
4、查看模式所属用户
selectSCH_OBJ.NAME ,SCH_OBJ.ID ,SCH_OBJ.CRTDATE,USER_OBJ.NAME
from(select NAME, ID, PID, CRTDATE from SYS.SYSOBJECTS where TYPE$='SCH')SCH_OBJ,(select NAME, ID from SYS.SYSOBJECTS where TYPE$='UR' and SUBTYPE$='USER')USER_OBJ
whereSCH_OBJ.PID=USER_OBJ.ID
ORDER BYSCH_OBJ.NAME;
5、查看用户所属角色
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE='用户名'
四、系统查询
1、查看达梦版本
select name,create_time from v$database;
2、查看数据库大小写是否敏感
SELECT CASE_SENSITIVE();
3、查看用户权限角色
select * from DBA_SYS_PRIVS ;
4、查看所有用户
select username from dba_users;
5、查看表空间
select TABLESPACE_NAME from user_tablespaces;
6、查看指定表字段
select * from all_tab_columns where owner='用户名' and Table_Name='表名';
五、角色管理
1、查询角色的权限
select * from dba_sys_privs where grantee='角色名';
2、创建角色
CREATE ROLE 角色名;
3、给角色授予resource和public的权限
GRANT CREATE TABLE,CREATE INDEX TO 角色名;
4、给角色授予创建表和索引的权限
GRANT CREATE TABLE,CREATE INDEX TO 角色名;
5、给角色授予查询DMHR模式下CITY表的查询权限
GRANT SELECT ON DMHR.CITY TO 角色名;
6、授予角色的权限给用户
GRANT 角色名 TO 用户名;
7、回收用户的角色权限
REVOKE 角色名 FROM 用户名;
8、启用角色
sp_set_role('角色名',1);
9、禁用角色
sp_set_role('角色名',0);
10、删除角色
DROP ROLE 角色名;
六、数据库导入导出
1、数据库导出
./dexp SYSDBA/SYSDBA@IP:PORT directory=/data/sdb/snn file=imp_exp.dmp schemas=fuck
file:导出文件名
directory:导出文件存放路径
schemas:导出模式名
2、数据库导入
./dimp SYSDBA/SYSDBA@IP:PORT file=/data/sdb/snn/imp_exp.dmp remap_schema=fuck:
file:导入文件路径及名称
remap_schema:原导出模式名:待导入模式名
七、达梦数据库汉字存储
UNICODE_FLAG和LENGTH_IN_CHAR两个跟字符集相关的参数
- UNICODE_FLAG
此参数表示了数据库中所有数据的字符集,包括数据字典的字符集,需要注意的是,数据库一旦初始化完成,字符集就无法修改,可以用select Unicode查询当前数据库的字符集,0代表GB18030,1代表utf-8LENGTH_IN_CHAR - LENGTH_IN_CHAR
此参数决定了数据库中的varchar类型对象的长度是否以字符为单位,取值1则是设置以字符为单位,将存储长度值按照理论字符长度进行放大。取值为0,则所有varchar类型对象长度以字节为单位
1、场景一
Unicode_flag和length_in_char都设置为0,字符集GB18030,varchar长度以字节为单位
GB18030字符集下,一个汉字需要占用两个字节,所以varchar(3)可以插入一个汉字加上一个半角字符,但是无法插入两个汉字。
2、场景二
UNICODE_FLAG=1,LENGTH_IN_CHAR=0
字符集为utf-8,varchar长度以字节为单位
Utf-8字符集的情况下,一个汉字需要占用三个字节,所以varchar(3)只能插入一个汉字。
3、场景三
UNICODE_FLAG=0,LENGTH_IN_CHAR=1
字符集为GB18030,varchar长度以字节为单位
在length_in_char=1的情况下,varchar的实际可存储字节数会按一定比例放大,所以在使用GB18030的时候,varchar(3)实际可以存储3个汉字,也就是3*2个字节的数据
4、场景四
UNICODE_FLAG=1,LENGTH_IN_CHAR=1
字符集为utf-8,varchar长度以字符为长度
这里我们会发现一个奇怪的情况,明明设置是 varchar(3),为什么可以插入 4 个汉字呢。这是因为在 DM7 中数据库实际存储数据是以字节为单位。在 lengtg_in_char=1 且字符集为 utf-8 的时候,VARCHAR 类型对象的实际存放的最大长度是 VARCHAR 类型定义的长度*4 字节。
也就是说,这里一个 varchar(3) 的结构可以存放的数据为 3*4=12 个字节。然而事实上 UTF-8 中的一个汉字一般只用占用 3 个字节,所以这里我们可以插入 12/3=4 个汉字
总结:当 LENGTH_IN_CHAR=0 的情况下,varchar() 的长度是以字节数为单位。这时我们只需要考虑汉字和全角字符所占用字节数,其中 gb18030 的一个汉字是两个字节,utf-8 的一个汉字一般是三个字节。如果插入数据的总字节数大于 varchar 定义的长度,则会插入失败。
当 LENGTH_IN_CHAR=1 的情况下,varchar() 所能存储的字节数将会按照一定比例扩展。字符集为 gb18030 时 varchar 的字节数等于定义长度 *2,字符集为 utf-8 时 varchar 的字节数为定义长度 *4
八、根据表生成ctl控制文件
装载数据经常会使用到ctl控制文件进行状态,批量生成表对应控制文件
1、ctl控制文件的framemark模板[dmCtl.ftl]
LOAD DATA
INFILE '*' STR X '0A'
REPLACE
INTO TABLE ${schemaName}
FIELDS '${middleDiv}'
TRAILING NULLCOLS
(
${fieldDelimiter}
)
2、生成服务类
package com.yzj.plutus.executor.service.Impl;import cn.hutool.core.io.FileUtil;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.*;/*** 根据数据库表生成ctl控制文件*/
@Slf4j
@RequiredArgsConstructor
@Service
public class GenerateCtlFileServiceImpl {private final GenerateCtlMapper generateCtlMapper;private final Config config;private final freemarker.template.Configuration configuration;public void generateCtl(String tableName) throws IOException, TemplateException {//1.获取表字段List<String> fields = generateCtlMapper.generateCtl(config.getSchemaName(), tableName);StringBuffer sb = new StringBuffer();for (int i = 0; i < fields.size(); i++) {//1.1、第一位是ID不需要if (i == 0 && "ID".equalsIgnoreCase(fields.get(i))){continue;}//1.2、最后一位不加",",但是增加"sysdate"【入库时间[个性化]】if (i == fields.size() - 1){sb.append(fields.get(i)).append(" \"SYSDATE\"");} else if (i == fields.size() - 2) {//1.3、倒数第二位加" TERMINATED BY ''"sb.append(fields.get(i)).append(" TERMINATED BY '").append(config.getEndDiv()).append("',");}else {sb.append(fields.get(i)).append(",");}}Map<String, Object> data = new HashMap<>();data.put("schemaName", tableName);data.put("fieldDelimiter", sb.toString());data.put("middleDiv", config.getMiddleDiv());//2、拼接ctl模板需要部分configuration.setDirectoryForTemplateLoading(new File(Objects.requireNonNull(this.getClass().getClassLoader().getResource("template")).getPath()));Template template = configuration.getTemplate(config.getTemplateCtlFileName());//3、生成ctl文件StringWriter sw = new StringWriter();template.process(data, sw);log.info("拼接后的数据为:【{}】", sw.toString());FileUtil.writeLines(Collections.singletonList(sw.toString()), new File(config.getCtlFilePath() + File.separatorChar + tableName + ".ctl"), "UTF-8");log.info("数据库表【{}】的ctl控制文件生成完成, 存放路径:【{}】", config.getSchemaName() + "." + tableName, config.getCtlFilePath());}@Mapperpublic interface GenerateCtlMapper{@Select("SELECT A.COLUMN_NAME FROM ALL_TAB_COLUMNS A WHERE A.OWNER=#{schemaName} AND A.TABLE_NAME=#{tableName}")List<String> generateCtl(@Param("schemaName") String schemaName, @Param("tableName") String tableName);}@Data@Configurationpublic class Config{private String schemaName;/*** 字段分隔符*/private char middleDiv = '\u0003';/*** 字段结尾符*/private char endDiv = '\u0002';/*** CTL模板文件名称*/private String templateCtlFileName;/*** ctl文件存放路径*/private String ctlFilePath;}
}
九、本地连多台数据库(RAC)
1、服务器创建文件【/etc/dm_svc.conf】,写入如下内容
TIME_ZONE=(480)
LANGUAGE=(cn)
SUPERIP=(123.123.123.1:5236,123.123.123.2:5236,123.123.123.3:5236)#EP_SGLJYTOR 0:均匀分布1:定向连接服务名的第一个IP,
#每次定向连接服务名的第一个IP。当IP1发生故障,间隔1s进行重连,尝试60次,若无
#法连接,再自动连接IP2。若IP2先起来,IP1后起来。因为AUT0_RECONNECT=(1),所以连
#接在IP2的连接不会切回IP1上。[SUPERIP]
LOGIN_MODE=(1)
SWITCH_TIMES=(60)
SWITCH_INTERVAL=(1000)
EP_SGLJYTOR=(1)
AUTO_RECONNECT=(1)
2、应用连接配置
<driver>dm.jdbc.driver.DmDriver</driver>
<url>jdbc:dm://SUPERIP</url>
3、应用连接达梦数据库【指定schema[1用户多个schema]】
# 达梦 模式名就相当于库名
# 写法一【本人使用此种】url: jdbc:dm://localhost:5236?schema=PERSON&compatibleMode=mysql&characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
#写法二【尝试过失败】#url: jdbc:dm://localhost:5236/PERSON&compatibleMode=mysql&characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai