
# 创建和管理数据库
#### 前提条件
用户必须拥有数据库创建的权限或者是数据库的系统管理员权限才能创建数据库，授予创建数据库的权限请参见[用户及权限](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0008.html#ZH-CN_TOPIC_0000002200189394)。
#### 背景信息
- 初始时，GaussDB包含两个模板数据库template0、template1，以及一个默认的用户数据库postgres。
- CREATE DATABASE实际上通过拷贝模板数据库来创建新数据库。只支持拷贝template0。请避免使用客户端或其他方式连接及操作两个模板数据库。
  ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 模板数据库中没有用户表，可通过系统表PG_DATABASE查看模板数据库属性。
  
  - 模板template0不允许用户连接，模板template1只允许数据库初始用户和系统管理员连接，普通用户无法连接。
    
- 数据库系统中会有多个数据库，但是同一时刻客户端程序只能连接一个数据库。当前，不支持在不同的数据库之间进行相互查询（跨库查询或跨库事务）。
- 当数据库集群中存在多个数据库时，可以通过客户端工具的-d参数指定目标数据库进行登录，也可以在客户端程序登录数据库以后通过\\c命令进行数据库切换。
 
#### 注意事项
如果数据库的编码为SQL_ASCII（可以通过"show server_encoding"命令查看当前数据库存储编码），则在创建数据库对象时，如果对象名中含有多字节字符（例如中文），超过数据库对象名长度限制（63字节）的时候，数据库会将最后一个字节（而不是字符）截断，可能造成出现半个字符的情况。
针对这种情况，请遵循以下条件：
- 保证数据对象的名称不超过限定长度。
- 使用例如utf-8编码集作为数据库的默认存储编码集（server_encoding）。
- 不要使用多字节字符作为对象名。
- 因为误操作导致在多字节字符的中间截断，从而导致无法删除数据库对象，如果出现这种现象，请使用截断前的数据库对象名进行删除操作，或将该对象从各个数据库节点的相应系统表中依次删除。
 
#### 操作步骤
1. 使用如下命令创建一个新的数据库db_tpcds。 
   ```
   gaussdb=# CREATE DATABASE db_tpcds;
   CREATE DATABASE
   ```
   ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   - 数据库名称遵循SQL标识符的一般规则。当前角色自动成为此新数据库的所有者。
   
   - 如果一个数据库系统用于承载相互独立的用户和项目，建议把它们放在不同的数据库里。
   
   - 如果项目或者用户是相互关联的，并且可以相互使用对方的资源，则应该把它们放在同一个数据库里，但可以规划在不同的模式中。模式只是一个纯粹的逻辑结构，某个模式的访问权限由权限系统模块控制。
   
   - 创建数据库时，若数据库名称长度超过63字节，server端会对数据库名称进行截断，保留前63个字节，因此建议数据库名称长度不要超过63个字节。
   
   - 数据库默认创建在pg_default表空间下。若要指定表空间，可以使用如下语句：
     ```
     gaussdb=# CREATE DATABASE db_tpcds WITH TABLESPACE = hr_local;
     CREATE DATABASE
     ```
     其中hr_local为表空间名称，关于如何创建表空间，请参见[创建和管理表空间](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0026.html#ZH-CN_TOPIC_0000002235389469)。
     
   
   - 创建完db_tpcds数据库后，可以选择继续在默认的postgres数据库进行其他操作，也可以按如下方法退出postgres数据库，使用新用户连接到此数据库执行创建表等操作。
     ```
     gaussdb=# \q
     gsql -d db_tpcds -p 8000 -U joe
     Password for user joe:
     gsql((GaussDB Kernel 503.0.XXX build f521c606) compiled at 2021-09-16 14:55:22 commit 2935 last mr 6385 release)
     Non-SSL connection (SSL connection is recommended when requiring high-security)
     Type "help" for help.
      
     db_tpcds=>
     ```
     
    
   
   
2. 查看数据库。 
   - 使用\\l元命令查看数据库系统的数据库列表。
     ```
     gaussdb=# \l
     ```
     
   
   - 使用如下命令通过系统表pg_database查询数据库列表。
     ```
     gaussdb=# SELECT datname FROM pg_database;
     ```
     
   
   
   
   
3. 修改数据库。 
   用户可以使用如下命令修改数据库属性（比如：owner、名称和默认的配置属性）。
   - 使用如下命令为数据库重新命名。
     ```
     gaussdb=# ALTER DATABASE db_tpcds RENAME TO human_tpcds;
     ALTER DATABASE
     ```
     
   
   
   ![](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   执行完参数设置后，需要手动执行CLEAN CONNECTION清理旧连接，否则可能存在节点间参数值不一致。
   
   
4. 删除数据库。 
   用户可以使用[DROP DATABASE](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-12-0561.html#ZH-CN_TOPIC_0000002235270573)命令删除数据库。该命令删除了数据库中的系统目录，并且删除了带有数据的磁盘上的数据库目录。用户必须是数据库的owner或者系统管理员才能删除数据库。当有人连接数据库时，删除操作会失败。删除数据库时请先连接到其他的数据库。
   使用如下命令删除数据库。
   ```
   gaussdb=# DROP DATABASE human_tpcds;
   DROP DATABASE
   ```
   
   
 
