有关各种数据库知识及学习心得
7月9
MySQL中,查询表(crawl_content)中字段(url)值重复的记录:

SELECT url, COUNT(*) AS sumCount FROM crawl_content GROUP BY url HAVING sumCount > 1;
说明:先用GROUP BY 对 url进行分组,同时使用COUNT(*)进行统计,再用HAVING来过滤大于1的,这样查找出来的就是重复的记录了。
4月3
1、水平切分:
通俗的来讲
例:QQ的用户表。假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这100亿中查找,会很慢很慢。如果将这一张表分成100份,每张表有1亿条,就小了很多,比如qq_user_0,qq_user_1,qq_user_2...qq_user_99表。

用户登录的时候,可以将用户的id%100,那么会得到0-99的数,查询表的时候,将表名qq跟取模的数连接起来,就构建了表名。比如123456789用户,取模的89,那么就到qq_user_89表查询,查询的时间将会大大缩短。

这就是水平切分。

2、垂直切分:

垂直切分指的是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。

例如学生答题表tt:有如下字段:

Id name 分数 题目 回答

其中题目和回答是比较大的字段,id name 分数比较小。

如果我们只想查询id为8的学生的分数:select 分数 from tt where id = 8;虽然知识查询分数,但是题目和回答这两个大字段也是要被扫描的,很消耗性能。但是我们只关心分数,并不想查询题目和回答。这就可以使用垂直分割。我们可以把题目单独放到一张表中,通过id与tt表建立一对一的关系,同样将回答单独放到一张表中。这样我们插叙tt中的分数的时候就不会扫描题目和回答了。

3、其他要点:

1)存放图片、文件等大文件用文件系统存储。数据库只存储路径,图片和文件存放在文件系统,甚至单独存放在一台服务器(图床)。

2)数据参数配置。

最重要的参数就是内存,我们主要用的innodb引擎,所以下面两个参数调的很大:

innodb_additional_mem_pool_size=64M

innodb_buffer_pool_size=1G

对于MyISAM,需要调整key_buffer_size,当然调整参数还是要看状态,用show status语句可以看到当前状态,以决定该调整哪些参数。
10月31

常用MySQL集群解决方案

10:39数据库  From: 本站原创
1、mysql企业常用集群架构
点击在新窗口中浏览此图片

在中小型互联网的企业中。mysql的集群一般就是上图的架构。WEB节点读取数据库的时候读取dbproxy服务器。dbproxy服务器通过对SQL语句的判断来进行数据库的读写分离。读请求负载到从库(也可以把主库加上),写请求写主库。

这里的dbproxy是数据库集群的唯一出口所以也需要做高可用。

drproxy是数据库读写分离的常用软件,amoeba、mycat、cobar也很常用。这类软件不仅带有读写分离功能,还可以实现负载均衡以及后端节点的健康检查。

数据库的读写分离除了通过这类数据库中间件软件实现,还可以写在程序中。

通常我们的主库要做双主高可用,实现主库挂掉另一个主库立刻接管。如果不做双主,从库接管主库的时候需要做状态迁移,会有延迟。

数据库主库的高可用重点需要考虑的是数据同步。比较常用的高可用方案有:

1、keepalived+mysql replication。通过keepalived实现VIP飘逸,通过mysql自带的同步方案replication实现数据同步。

2、hearbeat+drbd。通过drbd实现双主数据的同步,这个数据同步是基于块设备的。比一般的同步方案要快很多。通过heartbeat实现VIP漂移以及drbd资源的切换管理。

3、keepalived+mha。

对于从库,最好不要超过5个。我们可以把其中的三个作为用户访问的节点,把另外一个作为内部人员的查询节点。因为内部人员查询节点的时候一般是按照时间段查询,不经过索引,占用的资源比较多,所以要把这个节点单独专用,以免影响客户访问。最后我们应该留一个从库进行数据库的数据备份。

从库的数据一致性保持可以通过直接于主库进行主从辅助,也可以从其他从库那进行主从复制(优点是减少主库压力,缺点是延迟稍大)。

2、MYSQL数据架构
数据库服务器==》数据库(多个实例)==》多个库==》多个表==》多个字段行列(数据)

在一台数据库服务器上可以跑多个实例,一个实例中有多个库,一个库有多个表,一个表有多个行列。
3月8
很多MySQL程序都会带有匿名登录的功能。

在刚刚安装完MySQL之后,就能够登录数据库啦。

这对于平时使用MySQL来说也基本没有什么,可是假设我们想部署数据库的时候。这样的登录方式式绝对不能存在的!试想一下,假设你的数据库随便就能够进入的话,我想你一定会在半夜收到电话,说数据出问题啦!

以下介绍一下删除匿名用户的方式:


首先使用命令进入数据库


[root@localhost raul]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


然后切换数据库,进入我们须要操作的数据库mysql
3月8
在导入的时候,用phpMyAdmin去导入30多M左右的mysql数据库文件时出错:

您可能正在上传很大的文件,请参考文档来寻找解决方法。

1.很明显,是文件太大,无法导入。即上传文件大小有限制。所以要去解除此限制。

2.其实这个很简单的只要更改php.ini里三个配置即可。(见下面加粗部分,改成你自己的需求即可)

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
;upload_max_filesize = 2M
upload_max_filesize = 300M

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
;memory_limit = 128M
memory_limit = 300M

; Maximum size of POST data that PHP will accept.
; http://php.net/post-max-size
;post_max_size = 8M
post_max_size = 300M

刷新一下phpMyAdmin,重新导入试试,结果还是不行。

很多朋友们肯定也是很是纳闷,春哥在此提醒大家,改完以后,一定要记得重启服务。

还有,一定是3个都得相应的修改,否则不成功。
10月24

mysql的set类型和enum类型

17:19数据库  From: 本站原创
SET类型
SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。所以SET成员值本身不能包含逗号。

例如,指定为SET('one', 'two') NOT NULL的列可以有下面的任何值:

''
'one'
'two'
'one,two'
SET最多可以有64个不同的成员。

当创建表时,SET成员值的尾部空格将自动被删除。
1月4

环境:linux,mysql5.5.21

错误:Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

原因:

  同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞;

解决方法:

1、提高允许的max_connection_errors数量(治标不治本):

  ① 进入Mysql数据库查看max_connection_errors: show variables like '%max_connection_errors%';

    ② 修改max_connection_errors的数量为1000: set global max_connect_errors = 1000;

  ③ 查看是否修改成功:show variables like '%max_connection_errors%';

2、使用mysqladmin flush-hosts 命令清理一下hosts文件(不知道mysqladmin在哪个目录下可以使用命令查找:whereis mysqladmin);

  ① 在查找到的目录下使用命令修改:/usr/bin/mysqladmin flush-hosts -h192.168.1.1 -P3308 -uroot -prootpwd;

  备注:

    其中端口号,用户名,密码都可以根据需要来添加和修改;

    配置有master/slave主从数据库的要把主库和从库都修改一遍的(我就吃了这个亏明明很容易的几条命令结果折腾了大半天);

    第二步也可以在数据库中进行,命令如下:flush hosts;

3月4
1、判断数据库是否存在

if exists (select * from sys.databases where name = '数据库名')  
 drop database [数据库名]  

2、判断表是否存在

if exists (select * from sysobjects where id = object_id(N'[表名]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)  
   drop table [表名]  

3、判断存储过程是否存在

if exists (select * from sysobjects where id = object_id(N'[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)  
   drop procedure [存储过程名]  

4、判断临时表是否存在

if object_id('tempdb..#临时表名') is not null    
   drop table #临时表名  
Tags:
8月31
在MS-SQLServer中,如何在不同的数据库之间复制表?
当表目标表存在时:
insert into 目的数据库..表(字段1...字段n) select  段1...字段n  from 源数据库..表

当目标表不存在时:
select 段1...字段n  into 目的数据库..表 from 源数据库..表
--如果在不同的SQL之间:
insert into openrowset('sqloledb','目的服务器名';'sa';'',目的数据库.dbo.表)
select * from 源数据库..表

除了上面的方法之外或者还可以用链接服务器:
1月4
         问题:Oracle的服务“OracleoraHome92Agent ”启动不了,在控制面板-服务里面启动的时候说"本地计算机上的OracleOraHome92Agent服务启动后又停止了",一些服务自动停止,如果他们没什么可做的,例如“性能日志和警报服务”".

怎么解决?

原因:出现这种错误一般是由于在装好Oracle92之后,更改计算机名造成的。

解决方法:

   方法1、将计算机名改回到安装Oracle92时的名称。

   方法2、%ORACLE_HOME%/network/agent目录下,删除所有*.q文件,删除services.ora文件,重启Agent服务;OracleOraHome92TNSListener服务可以启动,但其它服务有可能会自动被停止,还必须到%ORACLE_HOME%/network/admin目录下找到listener.oratnsnames.ora两个文件并打开,将其中的计算机名改成现在的计算机名再重启OracleOraHome92TNSListener服务即可。
Tags:
分页: 1/3 第一页 1 2 3 下页 最后页 [ 显示模式: 摘要 | 列表 ]