今天完成数据库原理实验四
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
记录不会恢复。原因如下:
- 完整备份:首先,你对数据库进行了完整备份并存储在
backup1
上,此时数据库中还没有插入C202
记录。 - 差异备份:接着进行了差异备份,它记录了从完整备份以来的所有变化,包括插入
C202
记录的事务。这个差异备份也存储在backup1
上。 - 日志备份:在差异备份之后,你删除了
C202
记录,并对数据库进行了日志备份,该日志备份包含了删除操作的信息,存储在backup2
上。 - 恢复过程:当你利用
backup1
和backup2
恢复数据库时,首先会应用完整备份和差异备份,此时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;
标签:SC,students,备份,Course,5.31,backup1,数据库 From: https://www.cnblogs.com/gjsgjs/p/18248664