波斯马BOSSMA Information Technology

Windows下Cassandra备份和还原的批处理

发布时间:2011年12月14日 / 分类:NoSQL / 18,419 次浏览 / 评论

在网上看到一个网友写的《自制Cassandra数据库备份还原工具》,本来想能拿过来就用,可惜是在linux上用的,Windows操作系统上根本用不了,很多命令都不同。于是乎我做了个移植工作,边看批处理命令,边修改这个脚本,总算初步搞定。

这里讲的Cassandra的备份还原使用了自带的工具sstable2json和json2sstable,关于这两个的介绍可以看如下两篇文章:

http://wiki.apache.org/cassandra/Operations

http://www.datastax.com/docs/1.0/utilities/sstable2json

使用语法:

Usage: sstable2json [-f outfile] <sstable> [-k key [-k key [...]]]

outfile是备份到的地址,sstable是数据文件的地址。

Usage: json2sstable -K keyspace -c column_family <json> <sstable>

还原的时候要指定KeySpace和Column Family,如果手动执行这个命令,要还原的Column Family多了,那可真是个累死人不偿命的活啊。

批处理原理:

这里所谓的批处理就是对相似的操作自动化的执行,减少人的体力劳动。通过遍历要备份和还原的文件夹中的数据文件,自动调用上边的两个命令进行备份或还原操作。

具体实现:

说了这么多,还是看看具体怎么做的,来点干货。

@echo off
SetLocal EnableDelayedExpansion

set "f=%*"
if not defined f goto usage

cd %~dp0
set bktool=%~dp0bin\sstable2json.bat
set rctool=%~dp0bin\json2sstable.bat

if "%1"=="-r" goto recover
if "%1"=="-b" goto backup
goto :eof

REM 备份操作
:backup
rem 创建备份目录
set backdir=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
md %3\%backdir%

set sDir=%2
set tDir=%3\%backdir%

cd %sDir%
set successno=0

for /f %%i in ('dir /s *-Data.db^|find /i "个文件"') do set filecount=%%i
echo 从[%sDir%]中读取SSTable文件共[%filecount%]个,备份至[%tDir%]

for /f "delims=" %%a in ('dir /b /a-d /s "*-Data.db"') do (
	set filename=%%a
	set "filename=!filename:.db=!"
	set "filename=!filename:%sDir%\=!"
	rem echo !filename!

	set sFile=%sDir%\!filename!.db
	set tFile=%tDir%\!filename!.json

	echo 备份 !sFile!
	rem echo 备份 !sFile! 到 !tFile!

	CALL %bktool% !sFile! > !tFile!

	if ERRORLEVEL 0 (
		set /a successno+=1
		echo SUCCESS
	)
)
echo 备份完成:成功/总数 = %successno%/%filecount%
goto :eof

REM 还原操作
:recover
set sDir=%3
set tDir=%2

cd %sDir%
set successno=0

for /f %%i in ('dir /s *-Data.json^|find /i "个文件"') do set filecount=%%i
echo 从[%sDir%]中读取SSTable文件共[%filecount%]个,还原至[%tDir%]

for /f "delims=" %%a in ('dir /b /a-d /s "*-Data.json"') do (
	set filename=%%a
	set "filename=!filename:.json=!"
	set "filename=!filename:%sDir%\=!"
	rem echo !filename!

	set sFile=%sDir%\!filename!.json
	set tFile=%tDir%\!filename!.db
	echo 还原 !sFile!
	rem echo 还原 !sFile! 到 !tFile!

	rem 查找KS和CF
	rem echo !tDir:~-15,1!
	echo TO: %tDir%
	set dbName=
	set num=0
	set b=0

	:redo
	if not "!tDir:~-%num%,1!"=="\" (
		rem echo "!tDir:~-%num%,1!"
		set /a num+=1
		goto redo
	)

	set /a num=!num!-1
	set dbName=!tDir:~-%num%!
	echo %dbName%

	set cfName=
	set num=0
	set b=0

	:redo2
	if not "!filename:~%num%,1!"=="-" (
		set /a num+=1
		goto redo2
	)

	set cfName=!filename:~0,%num%!
	echo %cfName%

	CALL %rctool% -K %dbName% -c %cfName% !sFile! !tFile!

	if ERRORLEVEL 0 (
		set /a successno+=1
		echo 还原成功
	)
)
echo 还原结束:成功/总数 = %successno%/%filecount%
goto :eof

REM 使用说明
:usage
echo 用法:
echo    语法: [OPTIONS] [DBFileDir] [JSonFileDir]
echo.
echo            -b, --backup    备份Cassandra数据库
echo            -r, --recover   还原Cassandra数据库
echo            DBFileDir    Cassandra数据库文件的目录路径
echo            JSonFileDir  Json文件存放路径
echo.
echo 例子:
echo    备份: -b /db_data/data_file/system /db_data/json_file/system
echo    还原: -r /db_data/data_file/system /db_data/json_file/system
echo.
echo 备注:
echo    若需备份完整数据,请先停止Cassandra对外提供服务,然后将commit_log刷入数据库后再执行备份。
goto :eof

:doend

将这个文件保存到cassandra的根目录,文件名随便,但是需要.bat的后缀。
在命令提示符工具中进入这个目录,输入脚本文件名称,例如:datatool.bat。
如果不带参数,会显示如何使用的提示,在上边脚本的最后可以看到将要显示的信息,这里再说说怎么使用:

备份:

datatool.bat -b D:\cassandra\data\system D:\cassandra\backup\system

一共三个参数:
-b 指定备份操作
D:\cassandra\data\system 要备份的KeySpace的路径
D:\cassandra\backup\system 备份文件的存放路径

这个命令执行后,会在备份存放路径下创建一个以当前时间为名称的文件夹。

还原:

datatool.bat -r D:\cassandra\data\system D:\cassandra\backup\system

一共三个参数:
-r 指定还原操作
D:\cassandra\data\system 要还原的KeySpace的路径
D:\cassandra\backup\system 备份文件的存放路径

这个命令执行后,会根据备份文件的名称自动获取Column Family,根据要还原的KeySpace路径获取KeySpace名称。

计划任务:

虽然上边的脚本已经帮助我们解决了很多枯燥的工作,但是仍然要人工取处理。

何不把这个脚本的执行添加到Windows的计划任务中去,每隔一段时间做一次备份。

这个具体的计划任务我就不做了,有兴趣的朋友自己试试吧。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《Windows下Cassandra备份和还原的批处理

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

目前有1 条评论

  1. 花郎吧 0楼:

    喜欢批处理的操作!!

发表评论