在网上看到一个网友写的《自制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的计划任务中去,每隔一段时间做一次备份。
这个具体的计划任务我就不做了,有兴趣的朋友自己试试吧。
喜欢批处理的操作!!
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论