小。速度很快。可靠。
选择任意三个选项。

SQLite C接口

在线备份API。

sqlite3_备份*sqlite3_backup_init(sqlite3*pDest,/*目标数据库句柄*/const char*zDestName,/*目标数据库名称*/sqlite3*pSource,/*源数据库句柄*/const char*zSourceName/*源数据库名称*/);int sqlite3_backup_step(sqlite3_备份*p,int n页面);int sqlite3_backup_finish(sqlite3_备份*p);int sqlite3_backup_remaining(sqlite3_备份*p);int sqlite3_backup_pagecount(sqlite3_备份*p);

备份API将一个数据库的内容复制到另一个数据库中。它对于创建数据库备份或用于将内存中的数据库复制到持久文件或从持久文件复制。

另请参阅:使用SQLite Online Backup API

SQLite在目标数据库文件上保持写事务处于打开状态备份操作期间。源数据库只有在读取时才被锁定;它不会在整个备份操作中持续锁定。因此,可以在实时源数据库上执行备份,而无需阻止其他数据库连接在备份过程中读取或写入源数据库。

要执行备份操作,请执行以下操作:

  1. sqlite3_备份_ init()调用一次以初始化备份,
  2. sqlite3_backup_step()调用一次或多次以进行传输两个数据库之间的数据,最后
  3. sqlite3_备份完成()被调用以释放所有资源与备份操作关联。
对于每个sqlite3_backup_finish(),应该只有一个调用成功调用sqlite3_backup_init()。

sqlite3_备份_ init()

sqlite3_backup_init(D,N,S,M)的D和N参数是数据库连接与目标数据库关联和数据库名称。对于主数据库,数据库名称为“main”,对于临时数据库,或中AS关键字后指定的名称一个附件附加数据库的语句。传递给的S和M参数sqlite3_backup_init(D,N,S,M)标识数据库连接和源数据库的数据库名称。来源和目的地数据库连接(参数S和D)必须不同,否则sqlite3_backup_init(D,N,S,M)将失败一个错误。

调用sqlite3_backup_init()将失败,返回NULL,如果上已打开一个读或读写事务目标数据库。

如果sqlite3_backup_init(D,N,S,M)中发生错误,则NULL为返回,错误代码和错误消息存储在目的地数据库连接D。调用sqlite3_backup_init()失败的错误代码和消息可以使用sqlite3_errcode(),sqlite3_errmsg()、和/或sqlite3_errmsg16()功能。成功调用sqlite3_backup_init()将返回指向sqlite3_备份对象。这个sqlite3_备份对象可以与sqlite3_backup_step()一起使用,并且sqlite3_backup_finish()函数执行指定的备份操作。

sqlite3_backup_step()

函数sqlite3_backup_step(B,N)将在指定的源和目标数据库sqlite3_备份对象B。如果N为负数,则复制所有剩余的源页面。如果sqlite3_backup_step(B,N)成功复制了N个页面还有更多页面需要复制,则函数返回SQLITE_OK(SQLITE_OK).如果sqlite3_backup_step(B,N)成功完成所有页面的复制从源到目标,然后返回SQLITE_DONE公司.如果在运行sqlite3_backup_step(B,N)时出错,然后是错误代码返回。以及SQLITE_OK(SQLITE_OK)SQLITE_DONE公司,调用sqlite3_backup_step()可能会返回SQLITE_READONLY(SQLITE_只读),SQLITE_NOME公司,SQLITE_BUSY数据库,SQLITE_锁定,或一个SQLITE_IOERR_XXX数据库扩展错误代码。

sqlite3_backup_step()可能会返回SQLITE_READONLY(SQLITE_只读)如果

  1. 目标数据库是以只读方式打开的,或者
  2. 目标数据库正在使用写先行日志目标和源页面大小不同,或者
  3. 目标数据库是内存中的数据库目标和源页面大小不同。

如果sqlite3_backup_step()无法获得所需的文件系统锁,则这个busy-handler函数被调用(如果指定了一个)。如果busy-handler在锁可用之前返回非零,然后SQLITE_BUSY数据库返回给调用者。在这种情况下稍后可以重试sqlite3_backup_step()。如果来源数据库连接用于在sqlite3_backup_step()时写入源数据库被调用,那么SQLITE_锁定立即返回。再一次,在这个case稍后可以重试对sqlite3_backup_step()的调用。如果SQLITE_IOERR_XXX数据库,SQLITE_NOME公司,或SQLITE_READONLY(SQLITE_只读)返回,然后重试调用sqlite3backupstep()是没有意义的。这些错误被认为是致命的。申请必须接受备份操作失败并传递了备份操作句柄到sqlite3backupfinish()以释放相关资源。

对sqlite3_backup_step()的第一个调用获得一个独占锁在目标文件上。独占锁不会被释放,直到调用sqlite3_backup_finish()或备份操作完成和sqlite3_backup_step()返回SQLITE_DONE公司。每次呼叫sqlite3_backup_step()获取共享锁在源数据库上持续sqlite3_backup_step()调用的持续时间。因为在调用之间未锁定源数据库sqlite3_backup_step(),可以中途修改源数据库通过备份过程。如果源数据库被外部进程或通过数据库连接而不是由备份操作使用,则备份将自动通过下一次调用sqlite3_backup_step()重新启动。如果来源使用与使用的数据库连接相同的数据库连接修改数据库通过备份操作,备份数据库将自动同时更新。

sqlite3_备份完成()

当sqlite3_backup_step()返回时SQLITE_DONE公司,或当应用程序希望放弃备份操作应该会破坏sqlite3_备份通过将其传递给sqlite3_backup_finish()。sqlite3_backup_finish()接口将释放所有与关联的资源sqlite3_备份对象。如果sqlite3_backup_step()尚未返回SQLITE_DONE公司,然后是任何回滚目标数据库上的活动写事务。这个sqlite3_备份对象无效在调用sqlite3_backup_finish()后不能使用。

sqlite3_backup_finish返回的值为SQLITE_OK(SQLITE_OK)如果没有无论是否发生sqlite3_backup_step()错误sqlite3_backup_step()已完成。如果在之前的任何时间发生内存不足或IO错误对同一对象调用sqlite3_backup_step()sqlite3_备份对象,然后sqlite3_backup_finish()返回相应的错误代码.

返回SQLITE_BUSY数据库SQLITE_锁定来自sqlite3_backup_step()不是永久错误,不会影响的返回值sqlite3_backup_finish()。

sqlite3_backup_remaining()和sqlite3_备份_pagecount()

sqlite3_backup_remaining()例程返回页面数在最新的sqlite3backup_step()结束时进行备份。sqlite3_backup_pagecount()例程返回总页数在源数据库中sqlite3_backup_step()。这些函数返回的值仅由更新sqlite3_backup_step()。如果源数据库被修改为更改源数据库的大小或剩余页数,这些更改不会反映在sqlite3_backup_pagecount()的输出中和sqlite3_backup_remaining()直到下一个sqlite3_backup_step()。

数据库句柄的并发使用

来源数据库连接可由应用程序用于其他当备份操作正在进行或正在初始化时。如果SQLite被编译和配置为支持线程安全数据库连接,则可以并发使用源数据库连接从其他线程中。

然而,应用程序必须保证目标数据库连接之后不会传递给任何其他API(通过任何线程)sqlite3_backup_init()被调用,并且在对的相应调用之前sqlite3_backup_finish()。SQLite当前未检查以查看如果应用程序错误地访问目的地数据库连接因此不会报告错误代码,但操作可能会发生故障尽管如此。在执行正在进行备份也可能导致互斥锁死锁。

如果磨合共享缓存模式,应用程序必须确保目标数据库使用的共享缓存在备份运行时无法访问。实际上,这意味着应用程序必须保证磁盘文件备份到的不被进程中的任何连接访问,不仅仅是传递给sqlite3backupinit()的特定连接。

这个sqlite3_备份对象本身是部分线程安全的。多个线程可以安全地对sqlite3_backup_step()进行多个并发调用。但是,sqlite3_backup_remaining()和sqlite3_ backup_pagecount()严格来说,API并不是线程安全的。如果在在另一个线程调用sqlite3_backup_step()的同时它们可能返回无效值。

另请参见列表物体,常量、和功能.