5.31

今天完成数据库原理实验四

1、开始→程序→Microsoft SQL Server→SQL Server Management Stdio。

2、 在“连接到服务器”对话框中,选择“Windows 身份验证”,点击“连接”,进

入 SQL Server Management Stdio 操作界面。

3、 创建 students 数据库。利用如下 sql 语句在 students 数据库中创建表(具体含义

见课本 P33 页)。

CREATE TABLE Student (

Sno char ( 7 ) PRIMARY KEY,

Sname char ( 10 ) NOT NULL,

Ssex char (2),

Sage tinyint ,

Sdept char (20)

)

CREATE TABLE Course (

Cno char(10) NOT NULL,

Cname char(20) NOT NULL,

Ccredit tinyint ,

Semester tinyint,

PRIMARY KEY(Cno)

)

CREATE TABLE SC

(

Sno char(7) NOT NULL,

Cno char(10) NOT NULL,

Grade tinyint,

XKLB char(4) ,

PRIMARY KEY ( Sno, Cno ) ,

FOREIGN KEY (Sno) REFERENCES Student (Sno),

FOREIGN KEY (Cno) REFERENCES Course (Cno)

)

4、 数据库的备份与恢复实验(238页)

上机练习
分别采用SSMS工具和T-SQL 语句, 利用第10章上机练习建立的“学生数据库”和第11章上机练习建立的表,完成下列各题。
1.利用 SSMS 工具按顺序完成下列操作:
(1) 创建永久备份设备: backup1, backup2。

  • 在SSMS中,服务器对象 -> "备份设备" -> "新建备份设备",然后输入名称backup1,选择路径或类型,确定;重复此步骤创建backup2。

路径为:E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\backup1.bak

E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\backup2.bak


(2)对“学生数据库”进行一次完整备份,并以追加的方式备份到backup1设备上。

 

BACKUP DATABASE students TO DISK = 'E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\backup1.bak' WITH INIT;

 


(3)执行下述语句删除“学生数据库”中到 SC表:
DROP TABLE SC


(4)利用backupl设备上对“学生数据库”进行的完整备份, 恢复出“学生数据库”

 

RESTORE DATABASE students FROM DISK = 'E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\backup1.bak' WITH RECOVERY;

(在主控制台运行)
(5)查看SC表是否被恢复出来了。

 


2.利用SSMS 工具按顺序完成下列操作:
(1)对“学生数据库”进行一次完整备份,并以覆盖的方式备份到backupl设备上,覆盖掉backup1设备上已有的备份内容。

 

 

BACKUP DATABASE students TO DISK = 'E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\backup1.bak' WITH FORMAT;
(2) 执行下述语句在 Course 表中插入一行新记录:
INSERT INTO Course VALUES(‘C201’, ‘离散数学’,3,4)
(3)将“学生数据库”以覆盖的方式差异备份到 backup2设备上。


(4)执行下述语句删除新插入的记录:
use students

DELETE FROM Course WHERE Cno = 'C201';
(5)利用backup1 和backup2备份设备对“学生数据库”的备份, 恢复“学生数据库”。完全恢复完成后,在Course 表中有新插入的记录吗?为什么?

 

  • 恢复后Course表不会有新插入记录,因为日志备份是在删除记录后做的,恢复到删除点。


3.利用 SSMS 工具按顺序完成下列操作:
(1)将“学生数据库”的恢复模式改为“完整”的。

 


(2)对“学生数据库”进行一次完整备份,并以覆盖的方式备份到backup1设备上。


(3) 执行下述语句向 Course 表中插入一行新记录:
INSERT INTO Course VALUES('C202', ' 编译原理',5,4)


(4)对“学生数据库”进行一次差异备份,并以追加的方式备份到backupl设备上。

与上文的backup1同一路径。


(5)执行下述语句删除新插入的记录:
DELETE FROM Course WHERE Cno = 'C202'


(6)对“学生数据库”进行一次日志备份,并以覆盖的方式备份到backup2设备上。

 


(7)利用 backup1 和backup2 备份设备恢复“学生数据库”,恢复完成后, 在 Course 表中有新插入的记录吗?为什么?

 

在完成利用backup1(包含完整备份和差异备份)和backup2(包含日志备份)恢复“学生数据库”的操作后,Course表中不会出现新插入的记录,即之前插入的C202记录不会恢复。原因如下:

  1. 完整备份:首先,你对数据库进行了完整备份并存储在backup1上,此时数据库中还没有插入C202记录。
  2. 差异备份:接着进行了差异备份,它记录了从完整备份以来的所有变化,包括插入C202记录的事务。这个差异备份也存储在backup1上。
  3. 日志备份:在差异备份之后,你删除了C202记录,并对数据库进行了日志备份,该日志备份包含了删除操作的信息,存储在backup2上。
  4. 恢复过程:当你利用backup1backup2恢复数据库时,首先会应用完整备份和差异备份,此时Course表中会包含C202记录。但随后,当恢复日志备份(backup2)时,数据库会重做日志中的事务,包括了删除C202的事务。这意味着C202记录会被再次删除。

因此,最终恢复完成后,Course表中不会出现C202这一新插入的记录,因为该记录虽然在差异备份中被包含,但在恢复日志备份的过程中被对应的删除操作回滚了。这就体现了数据库恢复过程中事务日志的连续性和一致性保障机制。

 

 

 

 

运行此任务时需断开连接

 

USE [master]

RESTORE DATABASE students

FROM DISK = 'E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\backup1.bak'

WITH REPLACE;

GO
4.利用备份和恢复数据库的T-SQL 语句按顺序完成下列操作:
 (1) 新建备份设备back1 和 back2,它们均存放在D:\BACKUP 文件夹下(假设此文件夹已存在),对应的物理文件名分别为back1. bak 和 back2. bak。

EXEC sp_addumpdevice 'disk', 'back1', 'E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\backup1.bak';

EXEC sp_addumpdevice 'disk', 'back2', 'E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\backup2.bak';
(2)对“学生数据库”进行一次完整备份,以覆盖的方式备份到 back1上。

BACKUP DATABASE students TO back1 WITH FORMAT;
(3) 删除 SC表。

DROP TABLE SC;
(4)对“学生数据库”进行一次差异备份,以追加的方式备份到 back1 上。

 

BACKUP DATABASE students TO back1 WITH DIFFERENTIAL;
(5) 删除“学生数据库”。

DROP DATABASE students;


 (6)利用back1备份设备恢复“学生数据库”的完整备份,并在恢复完成之后使数据库成为可用状态。

RESTORE DATABASE students FROM back1 WITH REPLACE, RECOVERY;
 (7)在SSMS工具的对象资源管理器中查看是否有“学生数据库”?为什么?如果有,展开此数据库中的“表”节点,查看是否有 SC表?为什么?

数据库存在,SC表不存在,因为SC表在备份前已被删除。
 (8)再次利用back1备份设备恢复“学生数据库”,首先恢复完整备份并使恢复后的数据库成为正在恢复状态,然后再恢复差异备份并使恢复后的数据库成为可用状态。

 

RESTORE DATABASE students FROM back1 WITH NORECOVERY; -- 完整备份,保持数据库为恢复中状态

RESTORE DATABASE students FROM back1 WITH FILE=2, RECOVERY; -- 差异备份,使数据库可用,记得使用FILE参数指明差异备份
 (9)在SSMS工具的对象资源管理器中展开“学生数据库”和其下的“表”节点,这次是否有SC表?为什么?

 

此时SC表仍不应存在,因为虽然恢复了数据库,但差异备份是在删除SC表后进行的,所以恢复后也不会有SC表。
 (10)对“学生数据库”进行一次完整备份,直接备份到D:\BACKUP 文件夹下,备份文件名为:students. bak。

 

BACKUP DATABASE students TO DISK = 'E:\JavaJdk\SqlServer\SqlServer1\MSSQL16.MSSQLSERVER\MSSQL\Backup\students.bak' WITH FORMAT;
(11)对“学生数据库”进行一次事务日志备份,以追加的方式备份到 back2设备上。

请注意,进行事务日志备份前,数据库必须处于“完整”恢复模式。若之前更改过,需先确认恢复模式。

 

(需要首先有完整备份)

BACKUP DATABASE students TO back2 WITH FORMAT;

BACKUP LOG students TO back2 WITH NOFORMAT;

posted @ 2024-05-31 23:24  七安。  阅读(40)  评论(0编辑  收藏  举报