admin管理员组

文章数量:1651802

MySQL介绍

mysql的特点

不要当做oracle,sql server,postgre sql使用

不适合的场景

不适合存储图片,文本等大对象

复杂查询,复杂运算,或全文检索

好的应用场景

小事务快速提交

数据持久化存储

高并发事务控制

cpu从低版本到高版本不断做cpu多核支持

5.1 多核很差 最多用4核心

5.5 最多24核心

5.6 最多64核心

5.7 多核利用已经不是问题

每个query对应一个线程,只能用到一个逻辑core

每个连接对应一个线程,只能用到一个逻辑core

内存简单有效,也有些不足

innodb_buffer_pool_sie,key_buffer,query_cache

sort buffer,join buffer, tmp table

官方版本中并发内存锁竞争比较严重,Mariadb, Percona做了优化

==建议==

高并发下加大物理内存,提供IO 提供TPS

关闭querycache

专业单实例机器的innodb_buffer_pool_size设置为物理内存的50%-70%,多实例设置为总数据量的20%左右

kv对象先存到redis,memcache中再持久化到mysql

I/O data file, binlog, redo log,undo log

undologI/O特征,顺序写,随机读

redolog,binlog,relaylog 顺序写,顺序读

数据文件 顺序写,顺序读

myisam是堆组织表(HOT)innodb是索引组织表(IOT)

innodb相比myisam消耗更多磁盘空间,但可以更好的支持并发事务

==建议==

加大内存

使用更高速的IO设备

其他

单进程多线程

无连接池

无sql解析cache

mysql的优点

lamp,lnmp热门组合

开源免费个性化定制

快速开发迭代

社区支持

跨平台

特别适合互联网应用

权限控制灵活

灵活多数据类型支持,没有太多强制限制,可以实现内置自动转化,且可以通过sql_mode和其他数据库系统兼容

灵活sql用法

mysql复制特性实现快速扩容

部署简单

主流语言api支持

内存分配灵活

mysql的不足

5.6之前无CBO特征,5.6有一定CBO特征,5.7可调整cost rule

每个连接,每个query只能使用到一个逻辑cpu

连接数增加性能下降,但是可以使用thread pool

online DDL比较弱(可以使用pt-osc补充)

官方版本全局锁比较多,可使用多实例或者percona分支版本

没有hash join, 少用复杂join或者无索引join

子查询弱,少用或者改写成join

优化器比较弱 多用简单sql

mysql适用场景

在线OLTP

高并发,高tps

业务模型简单

保障数据可靠性,一致性,以及持久化

安装

1.下载mysql安装包

选择 download -> community(社区) -> MySQL Community Server -> generally available(GA)版本

选择平台:linux generic。选择cpu架构:x86_64。

吴老师的命令提示符

zst_ps1()

{

Date=$(date +%F)

Time=$(date +%H:%M:%S)

PS1="\\n\[\e[1;37m[\e[m\]\[\e[1;32m\u\e[m\]\[\e[1;33m@\e[m\]\[\e[1;35m\h $Time \e[m\]\e[1;36m`pwd`\e[m\e[1;37m]\e[m\n\\$"

}

PROMPT_COMMAND=zst_ps1

2.系统配置

文件系统

推荐使用 xfs 或者 ext4

iptables 放开3306 或者数据库在内网直接关闭

iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

/etc/rc.d/init.d/iptables save

/etc/rc.d/init.d/iptables status

关闭selinux或者设置策略

当前会话关闭

setenforce 0

永久关闭

vim /etc/selinux/config

SELINUX=disabled

最大打开文件数修改为65535

查看最大打开文件数

ulimit -a

open files (-n) 65535

零时修改

ulimit -n 65535

永久修改-看这个文件里的注释很详细

vim /etc/security/limits.conf

* soft nofile 65535

* hard nofile 65535

max user process 修改 一个用户最多运行的进程数

vim /etc/security/limits.conf

@mysql hard nproc 65535

@mysql soft nproc 65535

修改 IO 调度器设置io 调度器修改为 deadline,如果是 SSD 或者 PCIe-SSD 设备,则修改为 noop

查看核实下 io 调度器的配置,

cat /sys/block/sda/queue/scheduler

noop anticipatory deadline [cfq]

这时表示 io 调度器采用的是 cfq,而非我们要求的 deadline,需要及时调整。

下列两种方式修改:

a) 在线动态修改,重启失效

echo deadline > /sys/block/sdb/queue/scheduler

这里的 sdb 修改为实际的设备名称,例如 sda,或者 sdc。

b) 修改 /etc/grub.conf,永久生效修改 /etc/grub.conf 配置文件,在 kernel 那行增加elevator一个配置

例如: kernel /vmlinuz-2.6.18-308.el5 ro root=LABEL=/1

elevator=deadline rhgb quiet

修改 swappiness

swappiness 是 Linux 的一个内核参数,用来控制 Linux 物理 RAM 内存进行 SWAP页交换的相对权重,

尽量减少系统的页缓存被从内存中清除的情况。

设置 vm.swappiness = 0并且将该设置写入 /etc/sysctl.conf ,重启后也能生效。sysctl -p

取值范围是 0~100,vm.swappiness 的值越低,Linux 内核会尽量不进行 SWAP 交换页的操作,vm.swappiness 的值越高,linux 会越多的使用 SWAP 空 间。

Linux 系统的默认值是 60,当系统需要内存时,有 60%的概率使用 SWAP。对于大多数桌面系统,设置为 100 可以提高系统的整体性能;对于数 据库应用服务器,设置为 0,可以提高物理内存的使用率,进而提高数据库服务的响应性能。

不过需要注意的是,RHEL 7 以上版本,如果 vm.swappiness = 0,有可能会由于 OOM 问题,导致 mysqld 进程被 OOM-Killer 进程杀掉

关闭 NUMA 特性 (bios中和操作系统中都设置), C-states, C1E

新一代架构的 NUMA 不适用于跑数据库的场景。它本意是为了提高内存利用率,但实际效果不好,反而可能导致一个 CPU 的内存尚有剩余,但另一个不够用,发生 SWAP 的问题,

因此建议直接关闭或者修改 NUMA 的调度机制。

a) 修改 /etc/grub.conf,关闭 NUMA,重启后生效

修改 /etc/grub.conf 配置文件,在 kernel 那行增加一个配置后重启生效,例如: kernel /vmlinuz-2.6.18-308.el5 ro root=LABEL=/1 elevator=deadline numa=off rhgb quiet

b) 修改 /etc/init.d/mysql 或者 mysqld_safe 脚本,设定启动 mysqld 进程时的 NUMA 调度机制,例如:

numactl --interleave=all

/usr/bin/mysqld_safe --datadir="$datadir" --socket="$socketfile" \

--log-error="$errlogfile" --pid-file="$mypidfile" --user=mysql >/dev/null 2>&1 &

别忘记 innodb_flush_method=O_DIRECT

内存分配库(可选)

内存优化这块可以考虑使用jemalloc( tokudb,percona都有使用这个方式,官方版本需要自已加载)

关闭cpu节能模式 (bios中设置)

检查

/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

确认这里显示是不是ondemand,是则启用了节能模式。

另外检查/proc/cpuinfo并对比cpu MHZ的数字和”model name”后面显示的数字是否一样

阵列卡策略适用force-wb,关闭预读

阵列卡的cache相对于内存来说小很多一般2G-4G左右,所以这些空间用于缓存写比较实用,缓存读关闭转移到内存(innodb_buffer_pool)

如果硬盘是ssd的话那么直接读盘不一定比从cache读快

机械盘做raid10

SSD做raid1或者raid5

vm.dirty_ratio <= 5

脏数据比例达到5%停下所有任务刷脏数据-硬性

vm.dirty_background_ratio <= 10

脏数据比例达到10%开始刷脏数据-软性

安装

新建/opt/mysql目录,并把包放入,解压。

创建软连接

cd /usr/local/

ln -s /opt/mysql/mysql-5.6.23-linux-glibc2.5-x86_64 mysql

添加环境变量

echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile

source /etc/profile

添加用户和组

groupadd mysql

useradd -M -g mysql -s /sbin/nologin -d /usr/local/mysql mysql

基于配置文件定的环境,创建基本的目录 basedir,datadir,backupdir,binlogdir最好自己指定

mkdir -p /data/mysql/mysql3306

cd /data/mysql/mysql3306/

mkdir data

mkdir logs

mkdir tmp

chown -R mysql:mysql /data/mysql/mysql3306

创建/etc/myf 配置文件

/data

`-- mysql

`-- mysql3306

|-- data

|-- logs

`-- tmp

==/data最好单独挂一个独立存储==

创建配置文件 /etc/myf

初始化mysql

// 5.7

mysqld --defaults-file=/data/mysql/mysql3308/my_3308f --initialize

--initialize 这个选项一定要在最后放着,要不会报datadir不为空

// 5.6

/scripts/mysql_install_db

5.7初始化完成后会有一个密码,在我们配置文件中指定的错误日志中找到password后面密码就是

初始化完后要先看errlog里有没有err级别错误

==5.7初始化有2种方式==

[root@localhost ~]# mysqld --help --verbose |grep init

--initialize Create the default database and exit. Create a super user

--initialize-insecure

our server id. Default value is 0 (to break infinite

// 第一种是安全的 也就是会生成密码 必须改密码才可以后续操作

// 第二种不安全 启动起来连上去什么都能干

创建启动脚本 并 启动服务

安装包里support-file目录中

cp mysql.server /etc/init.d/mysql

/etc/init.d/mysql start|stop|restart

进入mysql更改密码

初始化完后error.log中有密码。

mysql -S /home/mysql/mysql.sock -p

// 进去之后什么也干不了,只能改密码

"(unknown)@localhost Thu Mar 16 23:53:04 2017 23:53:04 [(none)]>alter user user() identified by '123456';

// 命令提示符变了

"root@localhost Thu Mar 16 23:55:53 2017 23:55:53 [(none)]>

==sock文件在myf中查找 密码就是初始化时候生成的密码==

至此安装完成

补充

开发环境常用设置

开发环境:

开启log_queries_not_using_indexes // 记录没使用索引的sql

开启慢查询

分析slow log

授权和生产环境一致

关闭query cache

设置小的innodb_buffer_pool_size, key_buffer_size

mysql.user 表示一个myisam表

也就是所我们可以把别的地方的表文件直接复制过来(同版本)就可以使用,这是个安全漏洞,可以绕过权限验证

安装完加固

5.6之前

删除所有非root,非localhost的账号

delete from mysql.user where user != 'root' or host != 'localhost';

flush privileges;

重设密码

alter user user() identified '123456'

删除test库

drop database test;

truncate mysql.db;

5.7不用了

查看进程是否正常

我们通过 ==端口==, ==进程== 查看一个程序是否运行正常。

centos7.0后废弃了netstat 因为它有很多bug, 取代的是ss

[root@localhost ~]# ss -ntpl |grep 3306

0 0 :::3306 :::* users:(("mysqld",11612,33))

本文标签: 中文开源技术交流页面社区