关于拷贝数据库

有的时候测试batch需要查看本地log,所以在本地建立远程数据库的克隆版本成为必要的。

 

要在本地建立一个克隆数据库,我们可以直接在本地使用backup命令,可惜的是,这个backup生成的文件只能在远程的机器上生成。要在本地生成远程数据库的克隆版而不骚扰DBA,如何做到呢?

 

克隆无非是建表,添加数据,添加约束这3

 

所以我们可以按着这3步克隆一个远程数据库

 

建表:

 

1. 建立数据库

在本地建立一个数据库,多余的不说了

            2. 建立用户,建立schema

            在本地建立的数据库中建立远程要导入那些表的schema,建立一个用户,让他可以使用这些schema,建立用户名密码就是windows添加一个用户,如图

 

远程数据库

 

添加schema

 

添加用户

 

添加用户权限

 

让用户有建立的schema

将远程的数据库中需要的表生成ddl文件(ddl文件是可以一个文件表示多个表的),保管到本地,如图

 

一切按默认来:

 

保管到本地:

 

由于用远程的system,所以保管到本地是需要我们本地机器的用户名密码的,

随便写个用户,让他进来:

 

保管:

生成的batch.ddl包含

①     连接数据库命令:

connect to 远程数据库;

           

        调整表空间命令:

ALTER TABLESPACE SYSCATSPACE

      PREFETCHSIZE AUTOMATIC

      OVERHEAD 7.500000

      FILE SYSTEM CACHING

      TRANSFERRATE 0.060000;

 

        设定测试功能触发器命令

            SET CURRENT SCHEMA = "ISITECORE";

            CREATE FUNCTION XXXXX

 

        建表以及添加主键:

            CREATE TABLE "BFADMIN "."M_QUEUE" 

      ALTER TABLE "BFADMIN "."M_QUEUE"

      ADD PRIMARY KEY

            ("QUEUE_ID");

        创建view(视图)

      SET CURRENT SCHEMA = "BFADMIN ";

SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","ISITECORE";

CREATE VIEW V_SUBMITTED_JOB

 

        添加外键及约束

      ALTER TABLE "BFADMIN "."T_KEYS"

      ADD CONSTRAINT "KEYNAME" FOREIGN KEY

            ("KEYNAME")

      REFERENCES "BFADMIN "."M_KEYS_SETTING"

            ("KEYNAME")

      ON DELETE NO ACTION

      ON UPDATE NO ACTION

      ENFORCED

      ENABLE QUERY OPTIMIZATION;

 

        提交并断开数据库

      COMMIT WORK;

 

 

CONNECT RESET;

 

 

TERMINATE;

PS:可能上面还有创建序列(sequence)命令,一定要保留

 

这一系列下来,一个远程的表应该被原原本本地克隆下来,但是我们本地有本地的规矩,例如我们不想调整我们本地的表空间,我就把2删掉,开始的1部分一定要改成本地的数据库名,否则会将远程的数据库数据全部清空的

      这里还要要强调一点,就是这各文件只是单纯地建表,并没有判断本地有没有我们自己建的同名的表,而且如果表有外键的话,添加数据是添加不进去的

 

      所以我们要先添加数据再添加约束,我们可以先把数据导出来,再在45倒入数据命令,或者把这个文件分离,分成一部分建表,一部分添加约束.我这里采用后者,添加视图和约束的文件为batchkey.ddl,这个文件也需要有batch.ddl开始的1部分和结束的5部分,因为我们也需要先连接,做完操作后提交,断开

 

      这样,batch.ddl成为这种样子:

     

      CONNECT TO 本地数据库;//注:连接到本地数据库

 

      CREATE TABLE "BFREPODB"."M_ADD"  (//注:建立表和sequence

              "CMPCD" CHAR(10) NOT NULL WITH DEFAULT '' ,

              "ADDCD" CHAR(10) NOT NULL WITH DEFAULT '' ,

                    

"ADDCLSCD" CHAR(5) NOT NULL WITH DEFAULT '' ,

              "CNYCD" CHAR(2) NOT NULL WITH DEFAULT '' ,

              "ZIPCD" CHAR(8) NOT NULL WITH DEFAULT '' ,

              "ADDLN1" CHAR(240) NOT NULL WITH DEFAULT '' ,

              "ADDLN2" CHAR(240) NOT NULL WITH DEFAULT '' ,

              "ADDLN3" CHAR(240) NOT NULL WITH DEFAULT '' ,

              "ADDLN4" CHAR(240) NOT NULL WITH DEFAULT '' ,

              "STRDT" DATE NOT NULL WITH DEFAULT '9998-12-31' ,

              "ENDDT" DATE NOT NULL WITH DEFAULT '9998-12-31' ,

              "CRTDATE" TIMESTAMP NOT NULL WITH DEFAULT CURRENT    

              "CRTUID" CHAR(20) NOT NULL WITH DEFAULT '' ,

              "UPDDATE" TIMESTAMP NOT NULL WITH DEFAULT CURRENT    

              "UPDUID" CHAR(20) NOT NULL WITH DEFAULT '' ,

              "DELFG" CHAR(1) NOT NULL WITH DEFAULT '' )  

             IN "USERSPACE1" ;

 

 

 

 

ALTER TABLE "BFREPODB"."M_ADD" //建立表主键

      ADD PRIMARY KEY

            ("CMPCD",

             "ADDCD",

             "STRDT");

COMMIT WORK;                  //提交,退出

 

 

CONNECT RESET;

 

 

TERMINATE;

 

PS:有一些是comment(注释),不用理会

 

      batchkey.ddl是这种样子:

     

      CONNECT TO 本地数据库;//注:连接到本地数据库

 

      SET CURRENT SCHEMA = "BFADMIN ";

SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","ISITECORE";

CREATE VIEW V_SUBMITTED_JOB等等

 

ALTER TABLE "BFADMIN "."M_QUEUE" //建立视图

      ADD CONSTRAINT "IN_COMING_VALID" CHECK

            (STATUS_IN_COMING = '1' OR STATUS_IN_COMING = '0')

      ENFORCED

      ENABLE QUERY OPTIMIZATION;

 

COMMIT WORK;      //提交退出

 

 

CONNECT RESET;

 

 

TERMINATE;

 

最后, db2cmd启动db2命令行 , 进入c盘根目录,使用命令

 

db2 –tvf batch.ddl

将本地数据库的表全部建立

 

添加数据:

 

db2cmd启动db2命令行 , 使用命令

 

db2move 远程数据库名 export –u 远程用户名 –p 远程密码

 

将会在该路径下导出远程数据库表的所有数据

然后再在该路径下使用命令:

 

db2move 本地数据库名 import –u 本地用户名(包含需要schema的用户) –p 本地密码

 

将远程生成的数据导入到本地数据

 

添加约束:

 

收尾工作, db2cmd启动db2命令行 , 使用命令

 

db2 –tvf batchkey.ddl

将本地数据库的约束建立

 

 

            这样,一个远程数据库就被拷贝过来啦,既然已经拷贝到了本地,我们可以在本地作backup,再把backup文件分发给大家。

            Backup步骤

 

指定目录

 

之后一切默认,即可把backup文件导出

backup文件名一般这样:

数据库名.备份次数.节点名.XXX.XXX.日期时间.00N

 

backup文件分发给大家,让大家按此建立数据库:

上面的restore database一定要取文件的数据库名

 

路径取backup文件路径,下面时间一定要和backup绝对吻合

 

之后一切默认,即可

 

可能还有很多miss,欢迎批评指正

<think>嗯,用户询问ClickHouse中如何拷贝整个数据库。从提供的引用看,用户给出的引用[2]特别重要,它提到ClickHouse从20.10版本开始默认使用Atomic引擎,这与数据库拷贝方法密切相关。关于数据库拷贝的实现方式,Atomic引擎和Ordinary引擎的做法完全不一样:-Atomic引擎是事务性的,需要用到CREATETABLE……ASSELECT命令。-如果是旧版的Ordinary引擎,则可以直接复制元数据文件和数据目录根据用户提供的引用[2],用户很可能正在使用20.10以上的版本,所以系统应该考虑以Atomic引擎为主进行说明。用户没有显示说明数据库版本,不过需要建议用户先用SELECTversion()确认这个重要信息。具体的操作步骤需要分为两个方向说明:第一步确认引擎类型,第二步根据结果选择不同的拷贝方案。对于Atomic引擎,核心是借助ASSELECT语句实现每个表的创建和数据转移,这个过程要保持操作原子性以防数据不一致。需要注意的是原子数据库的特殊限制,例如名称变更问题(Atomic引擎表有内部UUID)。另外数据量很大时还要考虑优化,比如分批插入、调整并行处理等技巧。引用[4]提到的并行读取和分布式聚合可能对大数据量迁移有帮助。用户提到的其他引用内容也值得思考:引用[3]中INSERT操作可用来转移数据;引用[1]的CLI工具将在执行命令时用到。安全方面需要提醒权限问题,比如目标库的写入权限和元数据操作权限。最后生成相关问题需要覆盖深拷贝拷贝区别、跨引擎迁移场景等延伸点。</think> 在 ClickHouse 中拷贝整个数据库的方法取决于使用的**数据库引擎(Atomic 或 Ordinary)** 以及数据量大小。以下是详细步骤和注意事项: --- ### 🔑 核心步骤(适用于当前默认的 Atomic 引擎) #### ⚠️ 前提条件 1. **确认引擎类型**: ```sql SELECT version(); -- 确认版本(20.10+默认Atomic) SHOW CREATE DATABASE <原库名>; -- 查看引擎 ``` #### ✅ 操作流程(Atomic 引擎) 1. **创建目标数据库**(确保与原库引擎一致): ```sql CREATE DATABASE <目标库名> ENGINE = Atomic; ``` 2. **逐表拷贝数据**: ```sql CREATE TABLE <目标库名>.<表名> AS <原库名>.<表名> ENGINE = <原表引擎> -- 例如 ReplacingMergeTree ORDER BY ... -- 保留原表结构 SETTINGS ...; -- 保留原表设置 ``` *若需保留数据*: ```sql INSERT INTO <目标库名>.<表名> SELECT * FROM <原库名>.<表名>; ``` 3. **拷贝视图与物化视图**: 需手动重建(视图依赖底层表结构,无法直接拷贝)。 --- ### ⚠️ 特殊场景:Ordinary 引擎(旧版本) > 仅适用于 **20.10 前**且引擎为 `Ordinary` 的数据库 1. **物理拷贝文件**: - 停止 ClickHouse 服务 - 复制元数据:`/var/lib/clickhouse/metadata/<原库名>` → `/var/lib/clickhouse/metadata/<目标库名>` - 复制数据:`/var/lib/clickhouse/data/<原库名>` → `/var/lib/clickhouse/data/<目标库名>` - 重启 ClickHouse > 💡 **风险提示**:可能导致元数据与数据不一致,需严格验证。 --- ### 🔍 优化建议(大数据量场景) 1. **分批次插入**:避免单次操作内存溢出 ```sql INSERT INTO <目标表> SELECT * FROM <原表> WHERE date BETWEEN '2023-01-01' AND '2023-01-31' -- 按分区筛选 ``` 2. **调整并行度**(引用分布式处理机制[^4]): 修改配置文件增加并发线程数: ```xml <yandex> <max_threads>16</max_threads> </yandex> ``` --- ### 📚 注意事项 1. **字典与外部依赖**:需手动迁移外部字典配置文件 2. **权限问题**:目标库需显式授权给用户 3. **原子性保障**:Atomic 引擎的 DDL 操作是原子的,但大表 INSERT 可能中断,建议用 `ON CLUSTER` 分布式执行[^1] 4. **存储策略**:若原库使用自定义存储策略(如 JBOD),需预先配置目标库路径 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值