针对MySQL分表和表分区和mysql分表和分区有什么区别这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Can''tconnecttolocalMySQLserverthroughsock
针对MySQL 分表和表分区和mysql分表和分区有什么区别这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)、Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''、CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?等相关知识,希望可以帮助到你。
本文目录一览:- MySQL 分表和表分区(mysql分表和分区有什么区别)
- Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)
- Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''
- CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
- centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?
MySQL 分表和表分区(mysql分表和分区有什么区别)
为什么要分表和分区?
日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
什么是分表?
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD 数据文件,.MYI 索引文件,.frm 表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app 读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
什么是分区?
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app 读写的时候操作的还是大表名字,db 自动去组织分区的数据。
mysql 分表和分区有什么联系呢?
1. 都能提高 mysql 的性高,在高并发状态下都有一个良好的表现。
2. 分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果 merge 这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。
3. 分表技术是比较麻烦的,需要手动去创建子表,app 服务端读写时候需要计算子表名。采用 merge 好一些,但也要创建子表和配置子表间的 union 关系。
4. 表分区相对于分表,操作方便,不需要创建子表。
今天统计数据的时候发现一张表使用了表分区,借此机会记录一下。
1. 什么是表分区?
表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。
2. 表分区与分表的区别
分表:指的是通过一定规则,将一张表分解成多张不同的表。比如将用户订单记录根据时间成多个表。 分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。
3. 表分区有什么好处?
1)分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。 2)和单个磁盘或者文件系统相比,可以存储更多数据 3)优化查询。在 where 语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及 sum 和 count 语句时,也可以在多个分区上并行处理,最后汇总结果。 4)分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。 5)可以使用分区表来避免某些特殊的瓶颈,例如 InnoDB 的单个索引的互斥访问,ext3 问价你系统的 inode 锁竞争等。
4. 分区表的限制因素
1)一个表最多只能有 1024 个分区 2) MySQL5.1 中,分区表达式必须是整数,或者返回整数的表达式。在 MySQL5.5 中提供了非整数表达式分区的支持。 3)如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。 4)分区表中无法使用外键约束 5)MySQL 的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。
5. 如何判断当前 MySQL 是否支持分区?
命令:show variables like ''% partition%'' 运行结果:
mysql> show variables like ''%partition%''; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+ 1 row in set (0.00 sec)
have_partintioning 的值为 YES,表示支持分区。
6. MySQL 支持的分区类型有哪些?
1)RANGE 分区:按照数据的区间范围分区
2)LIST 分区:按照 List 中的值分区,与 RANGE 的区别是,range 分区的区间范围值是连续的。
3)HASH 分区
4)KEY 分区
说明 在 MySQL5.1 版本中,RANGE,LIST,HASH 分区要求分区键必须是 INT 类型,或者通过表达式返回 INT 类型。但 KEY 分区的时候,可以使用其他类型的列(BLOB,TEXT 类型除外)作为分区键。
7. Range 分区
利用取值范围进行分区,区间要连续并且不能互相重叠。 语法:
partition by range(exp)( //exp可以为列名或者表达式,比如to_date(created_date) partition p0 values less than(num) )
例如:
mysql> create table emp(
-> id INT NOT null, -> store_id int not null -> ) -> partition by range(store_id)( -> partition p0 values less than(10), -> partition p1 values less than(20) -> );
上面的语句创建了 emp 表,并根据 store_id 字段进行分区,小于 10 的值存在分区 p0 中,大于等于 10,小于 20 的值存在分区 p1 中。 注意 每个分区都是按顺序定义的,从最低到最高。上面的语句,如果将 less than (10) 和 less than (20) 的顺序颠倒过来,那么将报错,如下:
ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition
RANGE 分区存在的问题
- range 范围覆盖问题:当插入的记录中对应的分区键的值不在分区定义的范围中的时候,插入语句会失败。 上面的例子,如果我插入一条 store_id = 30 的记录会怎么样呢? 我们上面分区的时候,最大值是 20,如果插入一条超过 20 的记录,会报错:
提示 30 这个值没有对应的分区。 解决办法 A. 预估分区键的值,及时新增分区。 B. 设置分区的时候,使用 values less than maxvalue 子句,MAXVALUE 表示最大的可能的整数值。 C. 尽量选择能够全部覆盖的字段作为分区键,比如一年的十二个月等。mysql> insert into emp(id,store_id) values(2,30); ERROR 1526 (HY000): Table has no partition for value 30
- Range 分区中,分区键的值如果是 NULL,将被作为一个最小值来处理。
8. LIST 分区
List 分区是建立离散的值列表告诉数据库特定的值属于哪个分区。 语法:
partition by list(exp)( //exp为列名或者表达式 partition p0 values in (3,5) //值为3和5的在p0分区 )
与 Range 不同的是,list 分区不必生命任何特定的顺序。例如:
mysql> create table emp1(
-> id int not null, -> store_id int not null -> ) -> partition by list(store_id)( -> partition p0 values in (3,5), -> partition p1 values in (2,6,7,9) -> );
注意 如果插入的记录对应的分区键的值不在 list 分区指定的值中,将会插入失败。并且,list 不能像 range 分区那样提供 maxvalue。
9. Columns 分区
MySQL5.5 中引入的分区类型,解决了 5.5 版本之前 range 分区和 list 分区只支持整数分区的问题。 Columns 分区可以细分为 range columns 分区和 list columns 分区,他们都支持整数,日期时间,字符串三大数据类型。(不支持 text 和 blob 类型作为分区键) columns 分区还支持多列分区(这里不详细展开)。
10. Hash 分区
Hash 分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布。 MySQL 支持两种 Hash 分区:常规 Hash 分区和线性 Hash 分区。 A. 常规 Hash 分区:使用取模算法 语法:
partition by hash(store_id) partitions 4;
上面的语句,根据 store_id 对 4 取模,决定记录存储位置。 比如 store_id = 234 的记录,MOD (234,4)=2, 所以会被存储在第二个分区。
常规 Hash 分区的优点和不足 优点:能够使数据尽可能的均匀分布。 缺点:不适合分区经常变动的需求。假如我要新增加两个分区,现在有 6 个分区,那么 MOD (234,6) 的结果与之前 MOD (234,4) 的结果就会出现不一致,这样大部分数据就需要重新计算分区。为解决此问题,MySQL 提供了线性 Hash 分区。
B. 线性 Hash 分区:分区函数是一个线性的 2 的幂的运算法则。 语法:
partition by LINER hash(store_id) partitions 4;
与常规 Hash 的不同在于,“Liner” 关键字。 算法介绍:假设要保存记录的分区编号为 N,num 为一个非负整数,表示分割成的分区的数量,那么 N 可以通过以下步骤得到:
Step 1. 找到一个大于等于 num 的 2 的幂,这个值为 V,V 可以通过下面公式得到:
V = Power(2,Ceiling(Log(2,num)))
例如:刚才设置了 4 个分区,num=4,Log (2,4)=2,Ceiling (2)=2,power (2,2)=4, 即 V=4
Step 2. 设置 N=F (column_list)&(V-1)
例如:刚才 V=4,store_id=234 对应的 N 值,N = 234&(4-1) =2
Step 3. 当 N>=num, 设置 V=Ceiling (V/2),N=N&(V-1)
例如:store_id=234,N=2<4, 所以 N 就取值 2,即可。
假设上面算出来的 N=5,那么 V=Ceiling (4/2)=2,N=5&(2-1)=1, 即在第一个分区。
线性 Hash 的优点和不足 优点:在分区维护(增加,删除,合并,拆分分区)时,MySQL 能够处理得更加迅速。 缺点:与常规 Hash 分区相比,线性 Hash 各个分区之间的数据分布不太均衡。
11. Key 分区
类似 Hash 分区,Hash 分区允许使用用户自定义的表达式,但 Key 分区不允许使用用户自定义的表达式。Hash 仅支持整数分区,而 Key 分区支持除了 Blob 和 text 的其他类型的列作为分区键。 语法:
partition by key(exp) partitions 4;//exp是零个或多个字段名的列表
key 分区的时候,exp 可以为空,如果为空,则默认使用主键作为分区键,没有主键的时候,会选择非空惟一键作为分区键。
12. 子分区
分区表中对每个分区再次分割,又成为复合分区。
13. 分区对于 NULL 值的处理
MySQ 允许分区键值为 NULL,分区键可能是一个字段或者一个用户定义的表达式。一般情况下,MySQL 在分区的时候会把 NULL 值当作零值或者一个最小值进行处理。
注意
Range 分区中:NULL 值被当作最小值来处理
List 分区中:NULL 值必须出现在列表中,否则不被接受
Hash/Key 分区中:NULL 值会被当作零值来处理
14. 分区管理
分区管理包括对于分区的增加,删除,以及查询。
- 增加分区:
对于 Range 分区和 LIst 分区来说:
values 后面的内容根据分区的类型不同而不同。alter table table_name add partition (partition p0 values ...(exp))
对于 Hash 分区和 Key 分区来说:
上面的语句,指的是新增 8 个分区 。alter table table_name add partition partitions 8;
- 删除分区
对于 Range 分区和 List 分区:
删除了分区,同时也将删除该分区中的所有数据。同时,如果删除了分区导致分区不能覆盖所有值,那么插入数据的时候会报错。alter table table_name drop partition p0; //p0为要删除的分区名称
对于 Hash 和 Key 分区:
coalesce [ˌkəʊəˈles] vi. 联合,合并alter table table_name coalesce partition 2; //将分区缩减到2个
- 分区查询 1)查询某张表一共有多少个分区
即,可以从 information_schema.partitions 表中查询。mysql> select -> partition_name, -> partition_expression, -> partition_description, -> table_rows -> from -> INFORMATION_SCHEMA.partitions -> where -> table_schema=''test'' -> and table_name = ''emp''; +----------------+----------------------+-----------------------+------------+ | partition_name | partition_expression | partition_description | table_rows | +----------------+----------------------+-----------------------+------------+ | p0 | store_id | 10 | 0 | | p1 | store_id | 20 | 1 | +----------------+----------------------+-----------------------+------------+
2)查看执行计划,判断查询数据是否进行了分区过滤
上面的结果:partitions:p1 表示数据在 p1 分区进行检索。mysql> explain partitions select * from emp where store_id=10 \G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: emp partitions: p1 type: system possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1 Extra: 1 row in set (0.00 sec)
[参考资料] 《深入 MySQL 数据库开发、优化与管理维护(第 2 版)》
《高性能 MySQL》
============================================
分表的几种方式:
1、mysql 集群
它并不是分表,但起到了和分表相同的作用。集群可分担数据库的操作次数,将任务分担到多台数据库上。集群可以读写分离,减少读写压力。从而提升数据库性能。
2、自定义规则分表
大表可以按照业务的规则来分解为多个子表。通常为以下几种类型,也可自己定义规则。
Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。
Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。
Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。
Composite(复合模式) –以上模式的组合使用
分表规则与分区规则一样,在分区模块详细介绍。
下面以 Range 简单介绍下如何分表(按照年份表)。
假设表结构有 4 个字段:自增 id,姓名,存款金额,存款日期
把存款日期作为规则分表,分别创建几个表
2011 年:account_2011
2012 年:account_2012
……
2015 年:account_2015
app 在读写的时候根据日期来查找对应的表名,需要手动来判定。
var getTableName = function() {
var data = {
name: ''tom'',
money: 2800.00,
date: ''201410013059''
};
var tablename = ''account_'';
var year = parseInt(data.date.substring(0, 4));
if (year < 2012) {
tablename += 2011; // account_2011
} else if (year < 2013) {
tablename += 2012; // account_2012
} else if (year < 2014) {
tablename += 2013; // account_2013
} else if (year < 2015) {
tablename += 2014; // account_2014
} else {
tablename += 2015; // account_2015
}
return tablename;
}
merge 分表,分为主表和子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。3、利用 merge 存储引擎来实现分表
我们可以通过主表插入和查询数据,如果清楚分表规律,也可以直接操作子表。
子表 2011 年
CREATE TABLE `account_2011` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0;
子表 2012 年
CREATE TABLE `account_2012` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0;
主表,所有年
CREATE TABLE `account_all` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MRG_MYISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
UNION=(`account_2011`,`account_2012`)
INSERT_METHOD=LAST
ROW_FORMAT=DYNAMIC;
创建主表的时候有个 INSERT_METHOD,指明插入方式,取值可以是:0 不允许插入;FIRST 插入到 UNION 中的第一个表; LAST 插入到 UNION 中的最后一个表。
通过主表查询的时候,相当于将所有子表合在一起查询。这样并不能体现分表的优势,建议还是查询子表。
分区的几种方式
Range:
create table range(
id int(11),
money int(11) unsigned not null,
date datetime
)partition by range(year(date))(
partition p2007 values less than (2008),
partition p2008 values less than (2009),
partition p2009 values less than (2010)
partition p2010 values less than maxvalue
);
List:
create table list(
a int(11),
b int(11)
)(partition by list (b)
partition p0 values in (1,3,5,7,9),
partition p1 values in (2,4,6,8,0)
);
Hash:
create table hash(
a int(11),
b datetime
)partition by hash (YEAR(b)
partitions 4;
Key:
create table t_key(
a int(11),
b datetime)
partition by key (b)
partitions 4;
分区管理
新增分区
ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
删除分区
-- 当删除了一个分区,也同时删除了该分区中所有的数据。
ALTER TABLE sale_data DROP PARTITION p201010;
分区的合并
下面的 SQL,将 p201001 - p201009 合并为 3 个分区 p2010Q1 - p2010Q3
ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);
http://www.2cto.com/database/201503/380348.html
Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)
ERROR 2002 (HY000): Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)
原因:系统盘满了
[root@localhost opt]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
18G 17G 0 100% /
tmpfs 504M 0 504M 0% /dev/shm
/dev/sda1 477M 80M 372M 18% /boot
[root@localhost opt]#
解决:
删除大文件后,重启系统解决
[root@localhost mysql]# /opt/lampp/lampp status
Version: XAMPP for Linux 1.8.3-3
Apache is not running.
MySQL is not running.
ProFTPD is running.
df: 未处理文件系统
[root@localhost opt]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
18G 17G 0 100% /
tmpfs 504M 0 504M 0% /dev/shm
/dev/sda1 477M 80M 372M 18% /boot
[root@localhost opt]#
[root@localhost ~]# /opt/lampp/lampp status
Version: XAMPP for Linux 1.8.3-3
Apache is not running.
MySQL is running.
ProFTPD is running.
转
xampp 无法启动mysql 找不到mysql.sock
(2016-02-24 23:21:24)
分类: 技术 |
如果xampp中的mysql启动不了,出现ERROR 2002 (HY000): Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)报错,
停止xampp的时候报:
-bash-4.1# /opt/lampp/lampp stop
Stopping XAMPP for Linux 1.8.2-6...
XAMPP: Stopping Apache...ok.
XAMPP: Stopping MySQL...ok.
XAMPP: Stopping ProFTPD...kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
fail.
解决办法:
如果网上一些方法不好用的话,可以试试以下方法:
1. 确定系统盘是否满了
#df -h
2. 删除/opt/lampp目录中的pid文件(删掉后xampp重启时会重建,如果不放心,可以先备份lampp目录)
删除mysql相关缓存:
#rm -rf /opt/lampp/var/mysql/VM_*
删除proftp相关缓存:
#rm -rf /opt/lampp/var/proftpd.pid
如果找不到pid文件,可以搜一下:
#find /opt/lampp -name ''*.pid''
Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''
MySQL已经被我移到数据盘了,本地连接数据库会报错:Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''
但是远程是可以连接的,my.cnf设置mysql的根目录也改成了数据盘的地址,还要在加上client的参数,设置如下:
[client]
socket = /home/data/mysql/mysql.sock
之后重启下mysql就可以了
CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’
亲,是不是忘记了开MysqL服务,service MysqLd startcentos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?
centos7 设置 mysql 自启动的配置文件中
[Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE = 5000 #Restart=on-failure #RestartPreventExitStatus=1 #PrivateTmp=false
这里的
[Service]
User=mysql
Group=mysql,
user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?还是其他呢?
今天关于MySQL 分表和表分区和mysql分表和分区有什么区别的分享就到这里,希望大家有所收获,若想了解更多关于Can''t connect to local MySQL server through socket ''/opt/lampp/var/mysql/mysql.sock'' (2)、Can''t connect to local MySQL server through socket ''/var/lib/mysql/mysql.sock''、CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?等相关知识,可以在本站进行查询。
本文标签: