我们想在完整备份后创建远程增量备份。这将使我们能够在发生故障时进行恢复,并使用 SQL Anywhere 网络服务器启动另一台具有尽可能接近实时备份的机器。
我们正在做一个完整的备份如下:
dbbackup -y -c "eng=ServerName.DbName;uid=dba;pwd=sql;links=tcpip(host=ServerName)"
c:\backuppath\full
Run Code Online (Sandbox Code Playgroud)
这会备份数据库和日志文件,并且可以按预期恢复。对于增量备份,如果有多个增量备份,我已经使用重命名方案尝试了实时和增量事务日志:
dbbackup -y -t -c "eng=ServerName.DbName;uid=dba;pwd=sql;links=tcpip(host=ServerName)"
c:\backuppath\inc
dbbackup -y -l -c "eng=ServerName.DbName;uid=dba;pwd=sql;links=tcpip(host=ServerName)"
c:\backuppath\live
Run Code Online (Sandbox Code Playgroud)
但是,在将事务日志应用于还原时,将事务日志应用于数据库时总是收到错误消息:
10092:无法找到事务日志中引用的表的表定义
事务日志恢复命令是:
dbeng11 "c:\dbpath\dbname.db" -a "c:\backuppath\dbname.log"
Run Code Online (Sandbox Code Playgroud)
该错误没有指定它找不到哪个表,但这是一个受控测试,没有创建或删除任何表。我插入几行然后在尝试恢复之前启动增量备份。
有谁知道在 Sql Anywhere 11 上进行增量备份和还原的正确方法吗?
更新:考虑可能与目标数据库的复杂性有关,我做了一个新的空白数据库和网络服务。然后添加了一个包含两列的表格并插入了几行。进行完整备份,然后插入和删除更多行并提交事务,然后进行增量备份。在恢复完整备份后尝试应用事务日志的增量备份时,这也失败并出现相同的错误...
编辑:
您可以点击此链接查看相同的问题,并提供更多关于 SA 的反馈:http : //sqlanywhere-forum.sybase.com/questions/4760/restoring-incrementallive-backup-failure
我有场 id_list='1234,23,56,576,1231,567,122,87876,57553,1216'
我想用它来搜索IN
这个领域:
SELECT *
FROM table1
WHERE id IN (id_list)
Run Code Online (Sandbox Code Playgroud)
id
是 integer
id_list
是 varchar/text
但是这样就行不通了,所以我需要以某种方式拆分id_list
为选择查询。
我应该在这里使用什么解决方案?我正在使用 T-SQL Sybase ASA 9 数据库 (SQL Anywhere)。但是这样就行不通了,所以我需要以某种方式拆分id_list
为选择查询。
我看到的方式是使用while循环创建自己的函数,并根据分隔符位置搜索拆分每个元素提取,然后将元素插入到临时表中,该函数将作为结果返回。
对 Sebastian Meine 回答及其解决方案的评论:
Sybase SQL Anywhere 9
sa_split_list
系统程序在这里不存在,所以它不起作用
CAST
效果很好Sybase SQL Anywhere 12
sa_split_list
系统程序存在并且运行良好
CAST
效果很好对于 Sybase SQL Anywhere 9,我进行了 sa_split_list 系统过程替换:
Run Code Online (Sandbox Code Playgroud)CREATE PROCEDURE str_split_list(in str long varchar, in delim char(10) default ',') RESULT( line_num integer, row_value long varchar) BEGIN DECLARE str2 …
我正在尝试通过 ODBC 驱动程序从 IQ16 访问 ASA16 服务器。两台服务器都安装在同一个 Linux 机器上。
我已经安装unixodbc-bin
并添加了一个文件 .odbc.init 到运行数据库的用户的家中:
[mes_input]
Driver=/opt/sqlanywhere16/lib64/libdbodbc16_r.so
uid=dba
pwd=SQL
EngineName=mes_input
CommLinks=tcpip(host=127.0.0.1;port=49152)
AutoStop=no
DatabaseName=mes_input
Run Code Online (Sandbox Code Playgroud)
ASA 在那个盒子上的 49152 上运行;IQ 运行默认值 2638。
另外,我在接口文件锁定中添加了一个条目,如下所示:
mes_input
master tcp ether myserver 49152
query tcp ether myserver 49152
Run Code Online (Sandbox Code Playgroud)
回到 IQ,我可以通过 Sybase Central 添加远程服务器以及此框中的表。还测试连接并显示没有错误。
但是当我现在尝试通过例如从 ASA 复制一些数据时
INSERT locale_table LOCATION 'mes_input.mes_input' 'SELECT * FROM table'
Run Code Online (Sandbox Code Playgroud)
我越来越:
Connectivity libraries cannot be found (check your dynamic library
search path). Selects from attached databases are not possible without
these libraries.
-- (hqmlib/hqm_cpm.cxx …
Run Code Online (Sandbox Code Playgroud) 为了更新数据库(Sybase Adaptive Server Anywhere 8),我从客户端计算机上的一个数据库中获取所有数据并使用
SELECT * FROM tabelName OUTPUT TO 'C:\path' FORMAT ASCII DELIMITED BY ';';
Run Code Online (Sandbox Code Playgroud)
然后我使用这些文件来更新另一个连接到服务器的数据库,方法是制作临时表,检查是否缺少任何内容,然后删除临时表。
INPUT INTO tempTable FROM 'C:\path' FORMAT ASCII DELIMITED BY ';';
INSERT INTO mainTable
SELECT *
FROM tempTable
WHERE id NOT IN (SELECT id FROM mainTable);
DROP TABLE tempTable;
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有更好的方法来做到这一点,因为两个表需要很长时间来导出和导入数据(尽管它们确实有大量的列和数据,但仍然和大量的数据我的意思是〜100列和约 100,000 行)。这尤其奇怪,因为另一个具有相似数据量的表通过得非常快(尽管它的列确实较少)。需要一段时间的两个表每秒读取约 1000 个数据,而其他表要快得多。
每个客户的笔记本电脑上都有 database.db 文件。他们获取了一些数据并需要提交它但没有连接,因此他们使用自己的 .db 文件并稍后更新服务器上的文件。
获取 SQL 定义可能很困难,因为表是在前一段时间制作的,我不知道如何获取它们。目标数据库是保存所有数据的数据库,而源数据库是未连接且可在需要时离线使用的数据库。
一些建议,提示将不胜感激。
我有这样的查询
SELECT *
FROM my_table
WHERE ... AND id IN (SELECT t2.id
FROM my_table t2
WHERE id = t2.id AND ... );
Run Code Online (Sandbox Code Playgroud)
我知道在这个例子中我可以组合这两个WHERE
子句并且不使用子查询,但这不是重点。
此查询在我使用的 DBMS(SQL Anywhere 16)上完美运行,但我想知道id
在子查询中my_table.id
从主查询引用的事实是否是标准行为,或者我是否只是幸运。
链接或参考 RFC 或任何官方文件表示赞赏:)