我们知道Sybase可以用dump和load命令进行数据库的整体备份和整体导入,非常方便,凡是有利有弊,当然它也有缺陷,就是备份数据库的 服务器和导入数据库的服务器的pageSize必须相同,我以前就遇到这种情况,我从用dump命令windows上的Sybase服务器中导出一个数据 库到备份文件中,当我利用load命令将备份的数据库导入到Linux上的Sybase服务器时,报错,错误大概意思是我的备份文件的头部的信息 pageSize为2kb,而我要导入进的Sybase服务器的pageSize为8kb,两个不相符,不能导入。
因为Sybase数据库的pageSize是安装数据库时指定的,所以不能更改,除非重装一个。
在这种情况下,BCP就派上用场了,BCP命令和dump命令的不同之处是它不是将数据库整体备份,而是只备份表里面的数据库,保存在一个文件中,一个命令只能备份一个表的数据,例如
bcp testDB..testTB out opt/temp/testTB.txt -Udevelop -Pdevelop -SCAILONG -Jcp936 -c
上句bcp命令中:
testDB:数据库名称
testTB:要备份数据的表名称
opt/temp/testTB.txt:导入数据库到该文件中
-Udevelop:develop为登录数据库的用户名
-Pdevelop:develop为登录数据库的密码
-SCAILONG:CAILONG为数据库服务器名称(此处也可以为ip)
-Jcp936:cp936为数据库编码(cp936即系统第936位编码,貌似是gb2312)
-c:显示的保存备份数据,即我们打开备份的数据文件可以看到数据
技巧:因为上面一条命令只能备份一个表的数据到指定的文件,当我们一个库有成百上千张表,也需要几千条这样命令,难道我们就一条去copy、paste、修改?
当然是有技巧的,当我们要备份一个数据库所有表的数据,是可利用下列语句生成:
select 'bcp testDB..'+ name+' out opt/temp/'+name+'.dat -Udevelop -Pdevelop -SCAILONG -Jcp936 -c' from sysobjects where type='U'
执行这一条sql就得到了这个库所有表的bcp数据备份脚本,将其复制到outbcp.sh文件中,./outbcp.sh,即可执行该脚本(windows系统复制到outbcp.bat,双击运行),这样所有的表的备份文件则都在制定目录下。
进行数据库的导入,首先new一个新的数据库,然后打开rapid sql登录刚才备份数据的数据库服务器,选中刚才bcp备份数据的所有表,右键extract,即可得到所有表的建表脚本,在新数据库中执行,创建所有 表,只需将刚才output.bat中out全部repace成in即可,如果是导入到另外一台机器的数据库中,方法有两种:
方法1、将所有备份的文件和导入脚本通过ftp传到那台服务器上在执行脚本。
方法2、开始-》所有程序-》Sybase-》Dsedit utility-》在右侧Server列表中右键Add,添加一个Server,指定一个Server名称,然后再在右边双击最后一行Server Address,弹出一个操作框,点击Add按钮,在弹出的输入框的Network Address中输入192.168.6.156,5000,前面为要导入数据库的IP,逗号后面为数据库端口,这样操作完成后,将导入数据的批处理文件 -S后面的服务器名称改为刚才利用Dsedit utility工具创建的那个Server名称,这样即可将数据导入到另一台机器的数据库中。
可能在导入过程中,可能由于编码或者数据量过大的问题而不能成功导入,这是可以baidu、google一下,获得解决方法。