首页
解决方案
数据库专业技术服务全栈式PostgreSQL解决方案Oracle分布式存储化数据库云PolarDB一体化解决方案
产品
CLup:PostgreSQL高可用集群平台 CMiner: PostgreSQL中的CDC CData高性能数据库云一体机 CBackup数据库备份恢复云平台 CPDA高性能双子星数据库机 CSYun超融合虚拟机产品 ZQPool数据库连接池 ConshGuard数据保护产品
文档
文章
客户及伙伴
中启开源
关于我们
公司简介 联系我们
中启开源

介绍

我们在解决一些数据库无法启动的问题是,需要修补数据块,此工具可以把数据块从一个文件或块设备的指定位置拷贝一段数据到另一个文件或块设备中。

有人问有dd工具用,为什么还需要这个工具,原因是dd会截断目标文件而不是简单的覆盖些,用起来不是很方便,具体可以见后面的例子。

使用

使用此工具,可以把块设备其中的一部分内容拷贝成一个文件,也可以拷贝到另一个块设备中。

源码目录直接运行make就可以完成编译,生成blkcpy可执行文件,不带任何参数运行这个文件会出现一个帮助,

  1. Syntax:
  2. blkcpy <sourcefile> <startpos> <readbytes> <destfile> <startpos>
  3. example:
  4. blkcpy /dev/rora_temp 4k 50M /tmp/ora_temp.dat 0
  5. blkcpy /dev/rora_temp 4k 2G /dev/rora_temp2 4k
  6. blkcpy /dev/rora_temp 4k end /tmp/ora_temp

dd工具会截断文件的说明: 如我们要把一个50M的源文件t1.dat第23Mbytes开始的1M数据拷贝到另一个文件t2.dat的第24M开始的位置,其它数据不改动。如果执行dd命令:

  1. osdba@osdba-laptop:~/tmp$ ls -l
  2. total 102400
  3. -rw-rw-r-- 1 osdba osdba 52428800 Jun 29 00:16 t1.dat
  4. -rw-rw-r-- 1 osdba osdba 52428800 Jun 29 00:16 t2.dat
  5. osdba@osdba-laptop:~/tmp$ dd if=t1.dat bs=1M skip=23 of=t2.dat seek=24 count=1
  6. 1+0 records in
  7. 1+0 records out
  8. 1048576 bytes (1.0 MB) copied, 0.00137634 s, 762 MB/s
  9. osdba@osdba-laptop:~/tmp$ ls -l
  10. total 76800
  11. -rw-rw-r-- 1 osdba osdba 52428800 Jun 29 00:16 t1.dat
  12. -rw-rw-r-- 1 osdba osdba 26214400 Jun 29 00:19 t2.dat
  13. osdba@osdba-laptop:~/tmp$

最后会发现t2.dat文件从50M被截取成了24M,也就是说最后25M数据被dd给截断了。而使用我写的这个blkcpy工具则不会发生这种情况:

  1. osdba@osdba-laptop:~/tmp$ ls -l
  2. total 102400
  3. -rw-rw-r-- 1 osdba osdba 52428800 Jun 29 00:16 t1.dat
  4. -rw-rw-r-- 1 osdba osdba 52428800 Jun 29 00:22 t2.dat
  5. osdba@osdba-laptop:~/tmp$ blockcopy t1.dat 23M 1M t2.dat 24M
  6. blockcopy v0.1 - tangcheng 2009.03.12
  7. Finished:00000001M
  8. osdba@osdba-laptop:~/tmp$ ls -l
  9. total 102400
  10. -rw-rw-r-- 1 osdba osdba 52428800 Jun 29 00:16 t1.dat
  11. -rw-rw-r-- 1 osdba osdba 52428800 Jun 29 00:23 t2.dat

同时使用我这个工具,可以方便指定起始位置,拷贝的长度,写入目标文件的位置,比dd更容易操作。

下载

下载路径: