Server 数据库中的数据记录或复制其职业日志中的

2019-07-15 作者:数据库   |   浏览(108)

今天遇到一个需要对表进行去重的问题,数据量大概千万左右,第一选择就是按Oracle的思路上:

备份术语的术语表

SQL2008无法附加数据库,提示“无法显示请求的对话框”(nColIndex实际值是-1)图文解决方法

事务

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

小鱼儿玄机30码姐妹 1小鱼儿玄机30码姐妹 2

 1 delimiter \
 2 create PROCEDURE p1(
 3     OUT p_return_code tinyint
 4 )
 5 BEGIN 
 6   DECLARE exit handler for sqlexception 
 7   BEGIN 
 8     -- ERROR 
 9     set p_return_code = 1; 
10     rollback; 
11   END; 
12  
13   DECLARE exit handler for sqlwarning 
14   BEGIN 
15     -- WARNING 
16     set p_return_code = 2; 
17     rollback; 
18   END; 
19  
20   START TRANSACTION; 
21     DELETE from tb1;
22     insert into tb2(name)values('seven');
23   COMMIT; 
24  
25   -- SUCCESS 
26   set p_return_code = 0; 
27  
28   END\
29 delimiter ;

支持事务的存储过程

1 set @i =0;
2 call p1(@i);
3 select @i;
delete from table t1 where id < (select max(id) from table t2 where t1.c1=t2.c1);  --将c1值相同的记录进行去重,只留下id最大的,写成id>min(id)效果相同。

备份

 创建备份的过程,方法是通过复制 SQL Server 数据库中的数据记录或复制其事务日志中的日志记录。备份 可用于在出现故障后还原或恢复数据的数据副本。 数据库备份还可用于将数据库副本还原到新位置。

SQL2008无法附加数据库,提示“无法显示请求的对话框”(nColIndex实际值是-1)图文解决方法 

函数

MySQL中提供了许多内置函数,例如:

小鱼儿玄机30码姐妹 3小鱼儿玄机30码姐妹 4

 1 CHAR_LENGTH(str)
 2         返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
 3         对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。
 4 
 5     CONCAT(str1,str2,...)
 6         字符串拼接
 7         如有任何一个参数为NULL ,则返回值为 NULL。
 8     CONCAT_WS(separator,str1,str2,...)
 9         字符串拼接(自定义连接符)
10         CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
11 
12     CONV(N,from_base,to_base)
13         进制转换
14         例如:
15             SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示
16 
17     FORMAT(X,D)
18         将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。
19         例如:
20             SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
21     INSERT(str,pos,len,newstr)
22         在str的指定位置插入字符串
23             pos:要替换位置其实位置
24             len:替换的长度
25             newstr:新字符串
26         特别的:
27             如果pos超过原字符串长度,则返回原字符串
28             如果len超过原字符串长度,则由新字符串完全替换
29     INSTR(str,substr)
30         返回字符串 str 中子字符串的第一个出现位置。
31 
32     LEFT(str,len)
33         返回字符串str 从开始的len位置的子序列字符。
34 
35     LOWER(str)
36         变小写
37 
38     UPPER(str)
39         变大写
40 
41     LTRIM(str)
42         返回字符串 str ,其引导空格字符被删除。
43     RTRIM(str)
44         返回字符串 str ,结尾空格字符被删去。
45     SUBSTRING(str,pos,len)
46         获取字符串子序列
47 
48     LOCATE(substr,str,pos)
49         获取子序列索引位置
50 
51     REPEAT(str,count)
52         返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
53         若 count <= 0,则返回一个空字符串。
54         若str 或 count 为 NULL,则返回 NULL 。
55     REPLACE(str,from_str,to_str)
56         返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
57     REVERSE(str)
58         返回字符串 str ,顺序和字符顺序相反。
59     RIGHT(str,len)
60         从字符串str 开始,返回从后边开始len个字符组成的子序列
61 
62     SPACE(N)
63         返回一个由N空格组成的字符串。
64 
65     SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
66         不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
67 
68         mysql> SELECT SUBSTRING('Quadratically',5);
69             -> 'ratically'
70 
71         mysql> SELECT SUBSTRING('foobarbar' FROM 4);
72             -> 'barbar'
73 
74         mysql> SELECT SUBSTRING('Quadratically',5,6);
75             -> 'ratica'
76 
77         mysql> SELECT SUBSTRING('Sakila', -3);
78             -> 'ila'
79 
80         mysql> SELECT SUBSTRING('Sakila', -5, 3);
81             -> 'aki'
82 
83         mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
84             -> 'ki'
85 
86     TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
87         返回字符串 str , 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH 。 remstr 为可选项,在未指定情况下,可删除空格。
88 
89         mysql> SELECT TRIM('  bar   ');
90                 -> 'bar'
91 
92         mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
93                 -> 'barxxx'
94 
95         mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
96                 -> 'bar'
97 
98         mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
99                 -> 'barx'

部分内置函数

1、自定义函数

小鱼儿玄机30码姐妹 5小鱼儿玄机30码姐妹 6

 1 delimiter \
 2 create function f1(
 3     i1 int,
 4     i2 int)
 5 returns int
 6 BEGIN
 7     declare num int;
 8     set num = i1   i2;
 9     return(num);
10 END \
11 delimiter ;

小鱼儿玄机30码姐妹,View Code

2、删除函数

1 drop function func_name;

3、执行函数

小鱼儿玄机30码姐妹 7小鱼儿玄机30码姐妹 8

1 # 获取返回值
2 declare @i VARCHAR(32);
3 select UPPER('alex') into @i;
4 SELECT @i;
5 
6 
7 # 在查询中使用
8 select f1(11,nid) ,name from tb2;

View Code

 

以上相关子查询的SQL在c1上存在索引时效率不算低,但是很遗憾MySQL没有这种写法,类似的替代写法在MySQL中效率也低的令人发指,如中间表等手段。

备份设备

要写入 SQL Server 备份及能从中还原这些备份的磁盘或磁带设备。 SQL Server 备份也可以写入 Microsoft Azure Blob 存储服务,并且使用 URL 格式来指定备份文件的目标和名称。 有关详细信息,请参阅 使用 Microsoft Azure Blob 存储服务进行 SQL Server 备份和还原。

 

正好在前些时间整理一些shell脚本时处理过mysql导入时出错继续执行的问题,因此测试后采用了如下办法:

备份介质

已写入一个或多个备份的一个或多个磁带或磁盘文件。

 

1.将表数据导出:

数据备份 (data backup)

完整数据库的数据备份(数据库备份)、部分数据库的数据备份(部分备份)或一组数据文件或文件组的数据备份(文件备份)。

今天,我在工作室换了一台电脑写Code,当我在附加数据库的时候,出现如下异常,折腾了半天,还是不行。于是我就重装SQL,重装之后还是不行。纠结了,当时我也忘记去google,傻傻的就把系统重装了(新机)。折腾差不多一天之后,系统、SQL、VS2010、补丁等等全都搞定之后,总算“大功告成了”,这个时候,我又跑去附加数据库。这回蛋疼了~~依然是失败。于是乎,有了这篇文章(好记性不如烂笔头):

mysqldump -uroot -p --skip-extended-insert -t DBNAME TABLE>TABLE.sql

然后记一下去重后的记录数:
select count(*) from (select 1 from TABLE group by c1) a;

数据库备份 (database backup)

数据库的备份:完整数据库备份表示备份完成时的整个数据库。 差异数据库备份只包含自最近完整备份以来对数据库所做的更改。

 

2.truncate表,然后创建唯一索引

完整备份 (full backup)

一种数据备份,包含特定数据库或者一组特定的文件组或文件中的所有数据,以及可以恢复这些数据的足够的日志。

出现错误 

truncate table TABLE;
create unique index IX_c1 on TABLE(c1);

使用SSMS数据库管理工具备份数据库

打开数据库管理工具,选择要备份的数据库-》右键点击-》选择任务-》选择备份-》数据库管理工具默认是完整备份,不用修改其他配置-》找到目标,删除当前文件-》选择添加-》在选择备份目标弹出框中点击选择路径-》选择路径-》在定位数据库文件弹出框中输入文件名-》最后在备份数据库文件框中点击确定

小鱼儿玄机30码姐妹 9

小鱼儿玄机30码姐妹 10

小鱼儿玄机30码姐妹 11

 小鱼儿玄机30码姐妹 12

 

小鱼儿玄机30码姐妹 13

小鱼儿玄机30码姐妹 14

 

3.最后导入数据,需要添加-f选项。

使用SSMS数据库管理工具还原数据库

打开数据库管理工具,连接数据库-》右键点击数据库-》选择还原数据库-》在还原数据库弹出框选择设备,点击右边的选择文件按钮-》在选择备份设备弹出框中,点击添加-》在定位备份文件中,选择你要还原的文件,点击确定-》在选择备份设备弹出框中,点击确定-》在还原数据库弹出框选择设备,点击确定-》刷新数据库即可看到

小鱼儿玄机30码姐妹 15

小鱼儿玄机30码姐妹 16

小鱼儿玄机30码姐妹 17

 

小鱼儿玄机30码姐妹 18

 小鱼儿玄机30码姐妹 19

小鱼儿玄机30码姐妹 20

 

mysql -uroot -p -f DBNAME<TABLE.sql

使用T-SQL脚本备份数据库

本分数据库语法:backup database 数据库名 to disk=路径;

示例:backup database testss to disk='D:SqlTestbackuptestss.bak';

小鱼儿玄机30码姐妹 21

小鱼儿玄机30码姐妹 22

 

 小鱼儿玄机30码姐妹 23

-f的作用是:Continue even if an SQL error occurs.

使用T-SQL脚本还原数据库

 

还原数据库语法:   restore database 数据库名 from disk=完整路径;

示例:restore database testss from disk='D:SqlTestbackuptestss.bak';

小鱼儿玄机30码姐妹 24

 

这样导入时会报很多的错误,就是因为唯一约束的存在,你只需要最后检查下表的记录数时候与第一步中查到的数目一致就可以了。

 总结

优点:1、这种模式下,所有数据库操作都被完整地记录在日志中,出现某些操作在这种模式下也还是最小化日志,并且不是自动截断,它支持任何备份还原策略,特别是时间点还原。

           2、能够完整记录数据库操作进行时间点恢复,保证数据尽可能0丢失。

缺点:1、需要严格管理事务日志文件。

      2、数据库规模可能会变得难以控制。

这个是由于权限不足导致的,我们必须在【本地账号】的SQL中,新建一个【域帐号】的SQL用户,设置完成之后,还需要手动分配权限。详情如下:

这种去重方式效率比较高,缺陷可能是出错时屏幕上一堆的‘Duplicate entry’报错会淹没其他的报错。

 

本文由小鱼儿玄机30码发布于数据库,转载请注明出处:Server 数据库中的数据记录或复制其职业日志中的

关键词: 小鱼儿玄机30码