如何恢复和修复MS SQL数据库的MDF文件[2]

如何恢复和修复MS SQL数据库的MDF文件[2],第1张

怎么办呢别着急 下面我们举例说明恢复办法

A 我们使用默认方式建立一个供恢复使用的数据库(如test) 可以在SQL Server Enterprise Manager里面建立

B 停掉数据库服务器

C 将刚才生成的数据库的日志文件test_log ldf删除 用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data mdf

D 启动数据库服务器 此时会看到数据库test的状态为 置疑 这时候不能对此数据库进行任何 *** 作

E 设置数据库允许直接

*** 作系统表 此 *** 作可以在SQL Server Enterprise Manager里面选择数据库服务器 按右键 选择 属性 在 服务器设置 页面中将 允许对系统目录直接修改 一项选中 也可以使用如下语句来实现

以下是引用片段 use master go sp_configure  allow updates go reconfigure with override go

F 设置test为紧急修复模式

update sysdatabases set status= where dbid=DB_ID( test )

此时可以在SQL Server Enterprise Manager里面看到该数据库处于 只读\置疑\脱机\紧急模式 可以看到数据库里面的表 但是仅仅有系统表

G 下面执行真正的恢复 *** 作 重建数据库日志文件

dbcc rebuild_log( test C:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log ldf )

执行过程中 如果遇到下列提示信息

服务器: 消息 级别 状态 行

未能排它地锁定数据库以执行该 *** 作

DBCC 执行完毕 如果 DBCC 输出了错误信息 请与系统管理员联系

说明您的其他程序正在使用该数据库 如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表 那么退出SQL Server Enterprise Manager就可以了

正确执行完成的提示应该类似于

警告: 数据库 test 的日志已重建 已失去事务的一致性 应运行 DBCC CHECKDB 以验证物理一致性 将必须重置数据库选项 并且可能需要删除多余的日志文件

DBCC 执行完毕 如果 DBCC 输出了错误信息 请与系统管理员联系

此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为 只供DBO使用 此时可以访问数据库里面的用户表了

H 验证数据库一致性(可省略)

dbcc checkdb( test )

一般执行结果如下

CHECKDB 发现了 个分配错误和 个一致性错误(在数据库 test 中)

DBCC 执行完毕 如果 DBCC 输出了错误信息 请与系统管理员联系

I 设置数据库为正常状态

sp_dboption test dbo use only false

如果没有出错 那么恭喜 现在就可以正常的使用恢复后的数据库啦

J 最后一步 我们要将步骤E中设置的 允许对系统目录直接修改 一项恢复 因为平时直接 *** 作系统表是一件比较危险的事情 当然 我们可以在SQL Server Enterprise Manager里面恢复 也可以使用如下语句完成

以下是引用片段 sp_configure  allow updates go reconfigure with override go

lishixinzhi/Article/program/SQL/201311/16354

1、新建一个TEST1数据库

2、备份test数据库

3、将test数据库强制还原到test1数据库

第三部注意:2005中数据库的备份中记录了备份数据库的地址,在你还原的过程中,你必须将此地址换成你电脑上要还原的数据库的地址。详细过程如下:

第一步:选择要还原的数据库 右击---任务---还原---数据库

第二步:选择备份文件。选择“源设备”,点击文本框右边的按钮“”,在d出的对话框中选择数据库的备份注意:文件格式要选择“所有文件”。

第三步:更改路径。

SQLite3是目前最新的SQLite版本。可以从网站上下载SQLite3的源代码(本书使用的版本是sqlite-3612targz)。

解压缩后进入sqlite-3612的根目录,首先命令“/configure”生成Makefile文件,接着运行命令“make”对源代码进行编译,最后运行命令“make install”安装SQLite3。安装完毕后,可以运行命令sqlite3查看SQLite3是否能正常运行,如下所示

[root@localhost ~]# sqlite3

SQLite version 3612

Enter "help" for instructions

Enter SQL statements terminated with a ";"

sqlite>

可以看到,SQLite3启动后会停留在提示符sqlite>处,等待用户输入SQL语句。

在使用SQLite3前需要先了解下SQLite3支持的数据类型。SQLite3支持的基本数据类型主要有以下几类:

NULL

NUMERIC

INTEGER

REAL

TEXT

SQLite3会自动把其他数据类型转换成以上5类基本数据类型,转换规则如下所示:

char、clob、test、varchar—> TEXT

integer—>INTEGER

real、double、float—> REAL

blob—>NULL

其余数据类型都转变成NUMERIC

下面通过一个实例来演示SQLite3的使用方法。

新建一个数据库

新建数据库testdb(使用db后缀是为了标识数据库文件)。在testdb中新建一个表test_table,该表具有name,、sex、age三列。SQLite3的具体 *** 作如下所示:

[root@localhost home]# sqlite3 testdb

SQLite version 3612

Enter "help" for instructions

Enter SQL statements terminated with a ";"

sqlite> create table test_table(name, sex, age);

如果数据库testdb已经存在,则命令“sqlite3 testdb”会在当前目录下打开testdb。如果数据库testdb不存在,则命令“sqlite3 testdb”会在当前目录下新建数据库testdb。为了提高效率,SQLite3并不会马上创建testdb,而是等到第一个表创建完成后才会在物理上创建数据库。

由于SQLite3能根据插入数据的实际类型动态改变列的类型,所以在create语句中并不要求给出列的类型。

创建索引

为了加快表的查询速度,往往在主键上添加索引。如下所示的是在name列上添加索引的过程。

sqlite> create index test_index on test_table(name);

*** 作数据

如下所示的是在test_table中进行数据的插入、更新、删除 *** 作:

sqlite> insert into test_table values ('xiaoming', 'male', 20);

sqlite> insert into test_table values ('xiaohong', 'female', 18);

sqlite> select from test_table;

xiaoming|male|20

xiaohong|female|18

sqlite> update test_table set age=19 where name = 'xiaohong';

sqlite> select from test_table;

xiaoming|male|20

xiaohong|female|19

sqlite> delete from test_table where name = 'xiaoming';

sqlite> select from test_table;

xiaohong|female|19

批量 *** 作数据库

如下所示的是在test_table中连续插入两条记录:

sqlite> begin;

sqlite> insert into test_table values ('xiaoxue', 'female', 18);

sqlite> insert into test_table values ('xiaoliu', 'male', 20);

sqlite> commit;

sqlite> select from test_table;

xiaohong|female|19

xiaoxue|male|18

xiaoliu|male|20

运行命令commit后,才会把插入的数据写入数据库中。

数据库的导入导出

如下所示的是把testdb导出到sql文件中:

[root@localhost home]# sqlite3 testdb "dump" > testsql;

testsql文件的内容如下所示:

BEGIN TRANSACTION;

CREATE TABLE test_table(name, sex, age);

INSERT INTO "test_table" VALUES('xiaohong','female',19);

CREATE INDEX test_index on test_table(name);

COMMIT;

如下所示的是导入testsql文件(导入前删除原有的testdb):

[root@localhost home]# sqlite3 testdb < testsql;

通过对testsql文件的导入导出,可以实现数据库文件的备份。

1122 SQLite3的C接口

以上介绍的是SQLite3数据库的命令 *** 作方式。在实际使用中,一般都是应用程序需要对数据库进行访问。为此,SQLite3提供了各种编程语言的使用接口(本书介绍C语言接口)。SQLite3具有几十个C接口,下面介绍一些常用的C接口。

sqlite_open

作用:打开SQLite3数据库

原型:int sqlite3_open(const char dbname, sqlite3 db)

参数:

dbname:数据库的名称;

db:数据库的句柄;

sqlite_colse

作用:关闭SQLite3数据库

原型:int sqlite_close(sqlite3 db)

例如:

testc:

#include <stdioh>

#include <sqlite3h>

static sqlite3 db=NULL;

int main()

{

int rc;

rc= sqlite3_open("testdb", &db);

if(rc)

{

printf("can't open database!\n");

}

else

{

printf("open database success!\n");

}

sqlite3_close(db);

return 0;

}

运行命令“gcc –o test testc –lsqlite3”进行编译,运行test的结果如下所示:

[root@localhost home]# open database success!

sqlite_exec

作用:执行SQL语句

原型:int sqlite3_exec(sqlite3 db, const char sql, int (callback)(void,int,char,char), void , char errmsg)

参数:

db:数据库;

sql:SQL语句;

callback:回滚;

errmsg:错误信息

例如:

testc:

#include <stdioh>

#include <sqlite3h>

static sqlite3 db=NULL;

static char errmsg=NULL;

int main()

{

int rc;

rc = sqlite3_open("testdb", &db);

rc = sqlite3_exec(db,"insert into test_table values('daobao', 'male', 24)", 0, 0, &errmsg);

if(rc)

{

printf("exec fail!\n");

}

else

{

printf("exec success!\n");

}

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# /test

exec success!

[root@localhost home]# sqlite3 testdb

SQLite version 3611

Enter "help" for instructions

Enter SQL statements terminated with a ";"

sqlite> select from test_table;

daobao|male|24

sqlite3_get_table

作用:执行SQL查询

原型:int sqlite3_get_table(sqlite3 db, const char zSql, char pazResult, int pnRow, int pnColumn, char pzErrmsg)

参数:

db:数据库;

zSql:SQL语句;

pazResult:查询结果集;

pnRow:结果集的行数;

pnColumn:结果集的列数;

errmsg:错误信息;

sqlite3_free_table

作用:注销结果集

原型:void sqlite3_free_table(char result)

参数:

result:结果集;

例如:

testc:

#include <stdioh>

#include <sqlite3h>

static sqlite3 db=NULL;

static char Result=NULL;

static char errmsg=NULL;

int main()

{

int rc, i, j;

int nrow;

int ncolumn;

rc= sqlite3_open("testdb", &db);

rc= sqlite3_get_table(db, "select from test_table", &Result, &nrow, &ncolumn,

&errmsg);

if(rc)

{

printf("query fail!\n");

}

else

{

printf("query success!\n");

for(i = 1; i <= nrow; i++)

{

for(j = 0; j < ncolumn; j++)

{

printf("%s | ", Result[i ncolumn + j]);

}

printf("\n");

}

}

sqlite3_free_table(Result);

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# /test

query success!

xiaohong | female | 19 |

xiaoxue | female | 18 |

xiaoliu | male | 20 |

daobao | male | 24 |

sqlite3_prepare

作用:把SQL语句编译成字节码,由后面的执行函数去执行

原型:int sqlite3_prepare(sqlite3 db, const char zSql, int nByte, sqlite3_stmt stmt, const char pTail)

参数:

db:数据库;

zSql:SQL语句;

nByte:SQL语句的最大字节数;

stmt:Statement句柄;

pTail:SQL语句无用部分的指针;

sqlite3_step

作用:步步执行SQL语句字节码

原型:int sqlite3_step (sqlite3_stmt )

例如:

testc:

#include <stdioh>

#include <sqlite3h>

static sqlite3 db=NULL;

static sqlite3_stmt stmt=NULL;

int main()

{

int rc, i, j;

int ncolumn;

rc= sqlite3_open("testdb", &db);

rc=sqlite3_prepare(db,"select from test_table",-1,&stmt,0);

if(rc)

{

printf("query fail!\n");

}

else

{

printf("query success!\n");

rc=sqlite3_step(stmt);

ncolumn=sqlite3_column_count(stmt);

while(rc==SQLITE_ROW)

{

for(i=0; i<2; i++)

{

printf("%s | ", sqlite3_column_text(stmt,i));

}

printf("\n");

rc=sqlite3_step(stmt);

}

}

sqlite3_finalize(stmt);

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# /test

query success!

xiaohong | female | 19 |

xiaoxue | female | 18 |

xiaoliu | male | 20 |

daobao | male | 24 |

在程序中访问SQLite3数据库时,要注意C API的接口定义和数据类型是否正确,否则会得到错误的访问结果。

测试结果的查看 执行一组suite,测试用例,测试脚本之后TestManager写结果到一个测试日志中 ,测试日志记录在Results Tab的Builds目录下,日志名称和测试用例的一致。双击后在窗口的右侧可以显示Test Log

以上就是关于如何恢复和修复MS SQL数据库的MDF文件[2]全部的内容,包括:如何恢复和修复MS SQL数据库的MDF文件[2]、sql2005 我有一个数据库名叫test 我想新建一个test1数据和test一样、如何使用SQLite等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9492836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存