金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 数据库 > 使用Java实现数据库编程,通过重建方式还原

使用Java实现数据库编程,通过重建方式还原

发布时间:2019-12-16 00:56编辑:数据库浏览(78)

    1、        修改表:

    1,备份master数据库

    SQLSERVER编译与重编译

    编译的含义


    当SQLSERVER收到任何一个指令,包括查询(query)、批处理(batch)、存储过程、触发器(trigger)

    、预编译指令(prepared statement)和动态SQL语句(dynamic SQL Statement)要完成语法解释、语句解释,

    然后再进行“编译(compile)”,生成能够运行的“执行计划(execution plan)”。在编译的过程中,

    SQLSERVER会根据所涉及的对象的架构(schema)、统计信息以及指令的具体内容,估算可能的执行计划,

    以及他们的成本(cost),最后选择一个SQLSERVER认为成本最低的执行计划来执行。执行计划生成之后,

    SQLSERVER通常会把他们缓存在内存里,术语统称他们叫“plan cache”以后同样的语句执行,SQLSERVER就可以使用同样的执行计划,而无须再做一次编译。

    这种行为叫“重用(reuse)或者叫重用执行计划”。但是有时候,哪怕是一模一样的语句,SQL下次执行还是要再做一次编译。

    这种行为叫“重编译(recompile)”。执行计划的编译和重编译都是要消耗资源的。

    如果执行计划能够重用,那么SQLSERVER就不需要再执行上面的过程,加快执行指令的速度,很多语句调优的文章里提到数据库重用执行计划就是指这个意思

     

     

    执行计划重用的利弊


    执行计划的好坏当然决定了语句最终的执行速度。对于同样的一条语句,使用好的执行计划可能会比差的要快几百倍,甚至上千倍。

    所以从这一个角度来讲,每运行一条语句,都把他先编译一遍当然是最好的。他能够保证使用的执行计划是SQLSERVER能找到的最优的。

    但是SQLSERVER每秒钟可能会运行成百上千的指令。如果每个都编译一遍,是资源的一种浪费。所以SQLSERVER在这里也试图寻找一个平衡点,

    使用有限的compile/recompile,得到最好的整体性能

     

    运行下面的指令,就能够看到SQLSERVER当前缓存的执行计划有哪些(请别在生产服务器上直接运行因为上面往往有庞大的缓存)

    1 SELECT * FROM sys.[syscacheobjects]
    

     

     

    重编译的发生场景


    但是有些时候,SQLSERVER为了确保返回正确的值,或者有性能上的顾虑,有意不重用缓存在内存里的执行计划,而现场编译一份。

    这种行为,被称为重编译(recompile)。下面是比较常见的会发生重编译的情形:

     

    1、当指令或者批处理所涉及的任何一个对象(表格或者视图)发生了架构(schema)变化

    例如,在表或者视图上添加或删除了一个字段,添加或者删除了一个索引,在表上添加或者删除了一个约束条件(constraints)等。

    定义发生了变化,原来的执行计划就不一定正确了,当然要重编译

     

    2运行过sp_recompile

    当用户在某个存储过程或者触发器上运行过sp_recompile后,下一次运行他们就会发生一次重编译。

    如果用户在某个表或者视图上运行了sp_recompile,那么所有引用到这张表(或者视图)的存储过程在下一次运行前,都要做重编译

     

    3、有些动作会清除内存里的所有执行计划,迫使大家都要做重编译

    例如,下列动作会清除整个SQLSERVER服务器缓存的所有执行计划:

    (1)Detach一个数据库

    (2)对数据库做了升级,在新的服务器上,会发生执行计划清空

    (3)运行了DBCC freeproccache

    (4)运行了reconfigure语句

    (5)运行了alter database..collate语句修改了某个数据库的字符集(collation)

     

    下列动作会清除SQLSERVER服务器缓存的某个数据库的执行计划:

    DBCC FLUSHPROCINDB

    清除SQL Server 2000服务器内存中的某个数据库的存储过程缓存内容

    1 DECLARE @a INT
    2 SELECT @a=DB_ID('gposdb')
    3 DBCC flushprocindb(@a)
    

    ALTER DATABASE ...MODIFY NAME语句

    ALTER DATABASE ...SET ONLINE语句

    ALTER DATABASE...SET OFFLINE语句

    ALTER DATABASE...SET EMERGENCY语句

    DROP DATABASE 语句

    当一个数据库自动关闭时

    DBCC CHECKDB语句结束时

     

    4、当下面这些SET 开关值变化后,先前的那些执行计划都不能重用

    ansi_null_dflt_off,

    ansi_null_dflt_on,

    ansi_nulls,

    _ansi_padding

    ansi_warnings,

    arithabort,

    concat_null_yields_null,

    datefirst,dateformat,

    forceplan,

    language,

    no_browsetable,

    numeric_roundabort,

    quoted_identifier

    这是因为这些SET开关会影响语句的执行的行为,甚至带来不同的结果。他们发生变化了,SQLSERVER就要根据新的设置重做执行计划

     

    5、当表格或者视图上的统计信息发生变化后

    当统计信息被手动更新后,或者SQLSERVER发现某个统计信息需要自动更新时,SQLSERVER会对所涉及的语句都做重编译

     

    需要说明的是,在SQLSERVER里,执行计划重用并不一定是一件好事,而编译/重编译也不一定是一件坏事。

    计划重用可以帮助SQLSERVER节省编译时间,对降低CPU使用率和减少阻塞都有好处,但是缺点是每次重用的计划并不一定是最合适的计划。

    参数嗅探parameter sniffing就是典型的计划重用带来的负效应。编译和重编译当然能给当前运行的语句带来尽可能准确执行计划,

    但是对于经常运行的语句,尤其是一些执行速度比较快的语句,可能其编译时间占最后总时间的相当大比例。这对资源来讲是一个很大的浪费 

    一般来说,SQLSERVER能够很好地在编译与重编译之间做平衡,大部分情况下没什么问题的。

    (1)修改表名语法:

    ALTER TABLE <旧表名> RENAME [ TO ] <新表名>;

    注意:其中[TO]为可选参数,使用与否不影响结果,仅修改表名,表结构不变;

    (2)添加字段语法:

    ALTER TABLE 表名 ADD 字段名 数据类型 [属性];

    (3)修改字段语法:

    ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型 [属性];

    其中,”原字段名“指修改前的字段名,“ 新字段名”指修改后的字段名,“数据类型”指修改后的数据类型,

    如果不需要修改数据类型,则和原数据类型保持一致,但“数据类型”不能为空。

    注意:由于不同的类型的数据储存方式和长度不同,修改数据类型可能会影响数据表中已有的数据,因此,此种情况下不应轻易修改数据类型。

    (4)删除字段语法:

    ALTER TABLE 表名 DROP字段名;

    Eg:

    DROP TABLE IF EXISTS `demo01`;

    #创建表

    CREATE TABLE  `demo01`(

           `id` INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,

           `name` VARCHAR(8) NOT NULL

    );

    #修改表名

    ALTER TABLE `demo01` RENAME `demo02`;

    #添加字段

    ALTER TABLE ` demo02 ` ADD `password` VARCHAR(32) NOT NULL;

    #修改字段

    ALTERTABLE ` demo02 ` CHANGE `name` `username`CHAR(10) NOT NULL;

    #删除字段

    ALTERTABLE ` demo02 ` DROP `password`;

    图片 1

    2、        添加主外键:

     

    (1)添加主键约束语法:

    ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY 表名(主键字段);

    Eg:设置grade表中gradeId字段为主键

    ALTER TABLE `grade` ADD CONSTRAINT `pk_grade` PRIMARY KEY `grade`(`gradeId`);

    (2)添加外键约束语法:

    ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键字段) REFE RENCES 关联表名(关联字段);

    Eg:将student表的gradeId字段和grade表的gradeId字段建立外键关联:

    ALTER TABLE `student`  ADD  CONSTRAINT fk_student_grade FOREIGN KEY(`gradeId`) REFERENCES `grade` (`gradeId`);

    提示:在MySQL中,InnoDB储存类型的表支持外键,

    MyISAM储存类型的表不支持外键,因此对于MySISAM储存类型的表,也可以通过建立逻辑关联的方式保证数据的完整性和一致性,

    这种关联实际上是依照设计之初就定义好的固有逻辑,按照这种固有逻辑存取数据即可,不需要在数据库层面进行“硬绑定”。

    2,停止服务,直接删除master数据文件

    3、      DML(数据操作语言):

    图片 2

    (1)插入数据记录:

    (A)插入单行数据记录语法:

            INSERT INTO 表名 [(字段名列表)] VALUES(值列表);

            Eg:

               INSERT INTO `student`(`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`)

               VALUES('123','黄小平',1,'13956799999','1996-5-8');

    其中:

    1.表的字段名是可选的,如果省略,则依次插入所有字段。

    2.多个列表和多个值之间使用逗号分隔。

    3.值列表必须和字段名列表数量相同,且数据类型相符。

    4.如果插入的是表中部分数据,字段名列表必须填写。

     (B)插入多行数据语法:在MySQL中INSERT语句支持一次插入多条记录,插入时可指定多个值列表,每个值列表之间逗号隔开。

              INSERT INTO 新表(字段名列表)VALUES(值列表1),(值列表2),……(值列表n);

              注意:插入数据时需要指定具体字段名。

             Eg:

               INSERT INTO `subject`(`subjectNo`,`subjectName`,`classHour`,`gradeID`)

               VALUES(1,'Logic Java',220,1),(2,'HTML',160,1),(3,'Java OOP',230,2);

     

              注意:为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!

              插入时间类型也需要 ‘ ’ 。

    (2)将查询结果插入到新表语法:

            CREATE TABLE 新表(SELECT 字段1,字段2,..........FROM 原表);

             注意:新表无需事先创建,如新表已存在,将会报错!

    (3)更新数据记录语法:

             UPDATE 表名 SET 字段1=值,字段2=值,。。。。字段n=值[WHERE 条件];

    (4)删除数据记录语法:

             DELETE FROM 表名 [WHERE 条件];

              除此之外,也可以使用TRUNCATE语句删除表中所有行。语法:

              TRUNCATE TABLE 表名;

              注意:TRUNCATE 语句实现删除表中所有数据,删除后将重置自增列,表结构及其字段、约束、索引保持不变执行速度比DELETE语句快。

     

    SQL Sever数据库与MySQL数据库把数据插入新表语法对比:

     

     

    4、数据查询:

    图片 3

             ●查询回顾:SQL Server中查询语句在MySQL中同样支持;

     

    SQL Service中的数据查询语法:

    3,用安装程序重建master数据文件

    SELECT<字段名列表>

      控制台下进入安装目录就不说了

    FRMO<表名或视图>

      D:SetUpsqlserver2012>Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=sqlserver2012     /SQLSYSADMINACCOUNTS=UserName /SAPWD= ***

    [WHERE <查询条件>]

    图片 4

    [GROUP BY<分组字段名>]

     

    [HAVING<条件>]

    4,单用户模式启动SQL Server 服务,利用备份文件还原

    [OGDER BY<排序的字段名>[ASC 或 DESC]]

     单用户模式启动  :net start mssql$sqlserver2012 /m

     

     sqlcmd方式连接  :sqlcmd -S "ServerNameInstanceName"

    Eg:

    图片 5

    SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate`

     

    FROM `student`

    如果有master文件本身没有损坏,有master的备份,只需要步骤4还原master即可

    WHERE `gradeId` = 1

     

    ORDER BY studentNo;

    5,重启数据库服务,之后可以正常访问

    其中:

      图片 6

    1.字段名列表为要查询的字段名、各字段之间使用逗号分隔、若查询表中所有字段、则使用“* ”号表示。

    2.FROM后的表名为要查询的数据的来源,可以单个可以多个。

    3.WHERE子句为可选项,指定查询的条件。

    本文由金沙国际官网发布于数据库,转载请注明出处:使用Java实现数据库编程,通过重建方式还原

    关键词: