回顾

各位朋友好,很高兴又和大家见面,经过上一章的学习,我们简单的认识了一下Mysql,学习了Mysql的发展历程,Mysql的分支公司,Mysql的优势所在及简单解剖了Mysql的组成部分。

按照上章节安装完成所需环境之后(如果是初学Linux的同学在安装操作系统上有什么疑问可以直接将问题发送至我的邮箱,联系小助手微信:cto51boke 获取),在本章就开始在我们的环境上进行实际搭建,此次搭建参考以下几个版本,并在其中介绍5.6与5.7的区别所在,应之前朋友们的要求,此处将8.0的安装也一并进行演示安装

Mysql5.6.34(Mysql稳定版本)
Mysql5.7.20(Mysql稳定版本) Mysql8.0.15(官方最新GA版本)

安装介绍

之前我们说过Mysql很轻量,那么Mysql的安装就一定很简单吗? 答:是的,很简单,但是死板的安装大家上网上找篇文章谁都能搭建出来,无非就是时间长短问题罢了,所以考虑到以后大家在生产环境上安装,我们直接就将需要考虑到的准备工作做全,在安装Mysql之前我们也需要对自己的环境进行优化之后再进行安装,这样就像一个出生的婴儿,他可以在一个温暖家庭出生及生长,费话不多说,先看一下我的基础环境(三个版本我是分三个虚机安装,条件有限的朋友可以尝试重复安装)

机器1:
网络:桥接
OS:CentOS7.4
CPU:4核
内存:8G 磁盘:100G 机器2: 网络:桥接 OS:CentOS7.4 CPU:4核 内存:8G 磁盘:100G 机器3: 网络:桥接 OS:CentOS7.4 CPU:4核 内存:8G 磁盘:100G

环境准备

5.6、5.6、8.0的环境准备均是一样的

1.网络环境:因为我们目前是学习使用,所以可以将服务器的防火墙、selinux进行关闭,避免影响到我们学习时一些通讯问题,文件权限写入问题等等,一般生产上selinux也是不开的,防火墙也是在硬件上进行维护,所以大家关闭即可,关闭方式如下:

CentOS7:
防火墙临时关闭:systemctl stop firewalld
关闭防火墙开机自启:systemctl disable firewalld
selinux临时关闭:setenforce 0
selinux永久关闭:sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux

CentOS6:
防火墙临时关闭:service iptables stop 关闭防火墙开机自启:chkconfig iptables off selinux临时关闭:setenforce 0 selinux永久关闭:sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux

建议大家将四部分全部执行操作,不然服务可能还是处于开启状态,如selinux 修改了配置文件并不会立即生效

Selinux简单带一下:防火墙的作用大家都清楚,是对外保护的服务,Selinux通俗的说其主要保护的是对Linux文件写入、修改、删除进行保护的,其有一套特定的规则可以进行配置,有兴趣了解的朋友可以研究一下,现在生产上用的很少,所以也不用当作重点

2.CPU IO调度模型:IO调度模式对数据库也至关重要,Mysql是通过CPU进行IO调度去磁盘获取数据,但IO调度也有适应的不同场景,比如SAS磁盘和固态盘的不同选择,让我们一起看下,

查看当前IO调度模式:[]内为默认
[root@localhost /data/server]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq 
[root@localhost /data/server]# 

1)cfg模式为比较通用的算法,保证所有任务尽量公平
此模式会给进程任务分配一个请求队列与时间片
在此时间片内由进程向设备文件进行请求,时间片消耗完后被挂起等待调度
2)deadline模式是在cfg的基础上,确保了在一个截止时间内服务请求,这个截止时间是可调整的 而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象 deadline是数据库服务器IO模型的最好选择 优先处于读请求 比较适合于SAS似机械磁盘 3)noop模式只有一个队列,每当有新的请求进来会将其与最近请求进行合并设备文件 此模式优先写而饿死读操作,与deadline相点相反的意思 此模式如果是机械磁盘极度不建议使用,如果是固态磁盘则可以尝试 修改当前IO调度模式: Centos7:grubby --update-kernel=ALL --args="elevator=deadline" Centos6:vi /etc/grub.conf 尾行添加 elevator=deadline echo deadline > /sys/block/sda/queue/scheduler 

3.SWAP使用力度:SWAP是一个对操作系统内存的保护机制,是磁盘上文件到内存的映射,在内存不足或内存任务不活跃时操作系统会将这些任务唤出到SWAP中,以防止系统负载过高,导致操作系统直接挂起,操作系统就是你的大脑,大脑烧掉了,身上的零件就都没啥用了,但过多使用SWAP就会降低数据库的性能,因为其本身并不是内存,所以我们取一个权衡值,既保障有SWAP使用,但尽量不使用(如果你的公司不差钱,机器的性能都特别高,那可以直接将swap设置为0,主库如果down机直接进行切换从库,性能至上)

查看当前分配比例:
[root@localhost /data/server]# cat /proc/sys/vm/swappiness
30
[root@localhost /data/server]# 

修改使用优先级比例:
当前修改:echo 10 > /proc/sys/vm/swappiness 开机调用:echo -e "echo 10 > /proc/sys/vm/swappiness" >> /etc/rc.d/rc.local

4.文件系统:CentOS6的默认文件系统为ex4,7的默认为XFS,进行数据库业务选择时我们建议使用XFS,后续学到Mysql索引时会了解到Mysql是B+TREE的结构,而XFS也是这种存储方式,与Mysql结合更好,并且此文件系统类型更稳定

CentOS6格式化XFS需要操作如下:
1.yum install -y xfsprogs xfsdump 2.将文件系统格式化为xfs格式 

5.系统参数:Mysql本身就是为应用提供服务的,所以生产上会有大量的连接到Mysql上,并且并发进行文件数据读取,而Linux本身为了防止并发进程过多导致系统崩溃,对进行参数进行了限制,我们直接进行修改即可

查看:ulimit -a
1.打开文件的句柄数:open files(防止too many open files错误) 
2.针对用户数量限制:max user processes (防止单机多实例,连接数过多拒绝新连接)

修改:
echo -e "* soft nproc 65535\n* hard nproc 65535\n* soft nofile 65535\n* hard nofile 65535\n" >> /etc/security/limits.conf 生效:退出当前终端重新登陆ulimit –a查看两项参数是否已变更为65535 

以上我们就完成了基础环境准备,下面就一起开始进行Mysql安装


Mysql5.6安装

一、环境准备:
1.目录创建:mkdir -p /data/{software,mysql}
           mkdir -p /data/mysql/{data,log,tmp}

2.用户创建:useradd mysql

3.安装依赖包:yum install perl perl-devel perl-Data-Dumper libaio-devel -y

二、安装:
1.下载包文件:cd /data/software/
         wget https://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz
         tar -zxvf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz
         mv mysql-5.6.34-linux-glibc2.5-x86_64 /usr/local/mysql

2.权限赋值:chown -R mysql:mysql /usr/local/mysql /data/mysql/*

三、配置文件: vi /etc/my.cnf
大家也可以在群里找我要文件发送给大家(后续我们一一讲解参数的意义)

[client]
port    = 3306
socket  = /data/mysql/tmp/mysql.sock

[mysql]
prompt="\u@db \R:\m:\s [\d]> "
no-auto-rehash

[mysqld]

user    = mysql
port    = 3306
basedir = /usr/local/mysql
datadir = /data/mysql/data
socket  = /data/mysql/tmp/mysql.sock
pid-file = /data/mysql/tmp/mysql.pid
character-set-server=utf8
collation-server = utf8_general_ci
#skip-character-set-client-handshake=true
#init_connect='insert into auditlog.accesslog(ConnectionID,ConnUserName,PrivMatchName,LoginTime) values(connection_id(),user(),current_user(),now());'
skip_name_resolve=1
event_scheduler = on
sql_mode='NO_UNSIGNED_SUBTRACTION,NO_ENGINE_SUBSTITUTION'

open_files_limit = 65535
innodb_open_files = 65535 
back_log=1024
max_connections = 512 
max_connect_errors=1000000 
interactive_timeout=300 
wait_timeout=300 
max_allowed_packet = 1024M

table_open_cache=2048 
table_definition_cache=2048 
table_open_cache_instances = 32
thread_cache_size = 128 
thread_stack = 512K 
external-locking = FALSE 

max_tmp_tables=200 
tmp_table_size=100M 
max_heap_table_size=100G 
explicit_defaults_for_timestamp = 1
lock_wait_timeout = 3600 
auto_increment_increment = 1 
auto_increment_offset = 1 
autocommit = ON 
secure_file_priv='' 
read_only = OFF 
lower_case_table_names=1 
innodb_fast_shutdown = 0
innodb_force_recovery=0
innodb_buffer_pool_dump_at_shutdown = 1 
innodb_buffer_pool_load_at_startup = 1 

log-error=/data/mysql/log/error.log 

slow_query_log=ON 
slow_query_log_file=/data/mysql/log/slow_mysql.log 
long_query_time=2

innodb_flush_log_at_trx_commit=1 
innodb_log_file_size =1G 
innodb_log_files_in_group=3 
innodb_log_group_home_dir=./ 

sync_binlog = 1  
binlog_cache_size = 16M 
max_binlog_cache_size = 1G 
max_binlog_size=1G 
expire_logs_days = 30

default-storage-engine = INNODB 
#internal_tmp_disk_storage_engine = INNODB
transaction_isolation=REPEATABLE-READ
innodb_max_dirty_pages_pct = 50 
innodb_adaptive_flushing = ON 
innodb_flush_method = O_DIRECT 

sort_buffer_size=8M 
join_buffer_size=8M 
query_cache_size=0 
query_cache_type=0 
read_buffer_size = 8M
optimizer_switch="index_condition_pushdown=on,mrr=on,mrr_cost_based=on,batched_key_access=off,block_nested_loop=on" read_rnd_buffer_size = 8M innodb_old_blocks_pct=35 #innodb_additional_mem_pool_size= 128M innodb_buffer_pool_size= 1G innodb_buffer_pool_instances = 16 innodb_log_buffer_size =32M bulk_insert_buffer_size=128M innodb_change_buffer_max_size = 50 innodb_doublewrite=on innodb_adaptive_hash_index = on innodb_file_per_table =1 innodb_data_file_path = ibdata1:1024M:autoextend innodb_page_size = 16k #innodb_checksum_algorithm =crc32 innodb_lock_wait_timeout = 35 innodb_rollback_on_timeout = on innodb_sync_spin_loops = 100 innodb_spin_wait_delay = 30 innodb_lru_scan_depth = 4000 innodb_thread_concurrency = 0 innodb_write_io_threads = 2 innodb_read_io_threads = 2 innodb_purge_threads = 2 innodb_io_capacity = 800 innodb_io_capacity_max = 1600 server-id = 3306110 log-bin= /data/mysql/log/binlog-mysql binlog_format=row 四、初始化Mysql 1.查看初始化使用帮助:/usr/local/mysql/scripts/mysql_install_db --help 2.初始化当前Mysql:/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql/data --defaults-file=/etc/my.cnf --user=mysql 3.初始化完成后会提示你修改密码:/usr/local/mysql/bin/mysqladmin -u root password '123456' 4.查看初始化后数据库文件:ls /data/mysql/data/ 如果包括mysql、information_schema、test目录即可以视为初始化成功 [root@localhost data]# ls ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 ib_logfile2 mysql test undo001 undo002 undo003 5.最后我们启动mysql:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &

我们看一下图示内容:正常初始化后会出现两个OK的提示,并提示我们使用mysqladmin命令进行密码的初次配置,最后使用mysqld_safe方式启动Mysql,我们在启动时手工指定了配置文件的位置,其实也可以不用指定,但你需要知道Mysql找寻配置文件时的顺序,如下:

/etc/my.cnf 
/etc/mysql/my.cnf 
/usr/local/mysql/etc/my.cnf


Mysql5.7安装

Mysql5.7的安装与5.6的安装方式基本一致,不同的地方在于初始化部分,我们来看一下不同的地方

5.7初始化Mysql:
初始化操作:/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize

查看随机密码:可以看到我们的初始密码为 "Eiv*/Dy!I44t"
[root@localhost data]# cat /data/mysql/log/error.log  | grep password
2019-02-21T10:45:24.067928Z 1 [Note] A temporary password is generated for root@localhost: Eiv*/Dy!I44t 5.启动mysql:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &

5.6与5.7区别总结:此处仅介绍初始化后的不同,更多特性上的不同后续我们进行讲解

Mysql5.6:
1.初始化命令为mysql_install_db,初始化之后会由我们自己来进行密码的初次修改
2.数据目录下包含mysql information_schema test performache_schema四个数据库

Mysq.5.7:
1.初始化命令为mysqld,并多了一个initialize参数
初始化之后默认会生成一个随机密码至error.log文件中
后续我们使用这个密码进行二次修改
这个密码只是Mysql提供给我们初次使用的
登陆之后会提示我们密码过期问题
所以我们一般在初始化之后直接对密码进行二次修改使用如下命令:

/usr/local/mysql/bin/mysqladmin -uroot -p password
输入刚刚的随机密码,再输入两次你需要的密码即可

2.数据目录下包含mysql information_schema sys performache_schema四个数据库
5.7初始化参数介绍:

initialize参数:当我们添加这个参数时Mysql会默认帮我们生成一个随机密码到error.log文件内 initialize-insecure:如果我们在5.7初始化时指定这个参数,那么此时会和5.6初始化后结果相同,不会为我们生成随机密码由用户进行第一次的密码配置 

Mysql8.0安装

一、环境准备:
1.目录创建:mkdir -p /data/{software,mysql}
                     mkdir -p /data/mysql/{data,log,tmp}

2.用户创建:useradd mysql

3.安装依赖包:yum install perl perl-devel perl-Data-Dumper libaio-devel -y 二、安装: 1.下载包文件:cd /data/software/ wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz xz -d mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz tar -xvf mysql-8.0.15-linux-glibc2.12-x86_64.tar mv mysql-8.0.15-linux-glibc2.12-x86_64 /usr/local/mysql 2.权限赋值:chown -R mysql:mysql /usr/local/mysql /data/mysql/* 三、配置文件: vi /etc/my.cnf 大家可以继续使用上面的配置文件内容 但需要将部分参数进行删减,因为有部分特性至Mysql8.0已经彻底废弃了,如下: max_tmp_tables=200 query_cache_size=0 query_cache_type=0 后续讲解8.0新特性时我们会添加一些新的配置参数 四、初始化 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize 查看初始化后数据库文件:ls /data/mysql/data/ 包括 [root@localhost data]# ls auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 ibtmp1 mysql performance_schema public_key.pem server-key.pem undo_001 ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ib_logfile2 #innodb_temp mysql.ibd private_key.pem server-cert.pem sys undo_002 [root@localhost data]# 五、最后我们启动mysql:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf & 六、登入Mysql: [root@localhost log]# /usr/local/mysql/bin/mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 8.0.15 MySQL Community Server - GPL Copyright (c) 2000, 2019, 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. root@db 10:36: [(none)]> 

Mysql密码重置

至此,Mysql的安装我们学习完成了,那安装完成之后如果我们不小心把error.log文件搞丢了那就查看不到password信息了,或者二次进行修改密码时输入问题导致密码登陆不上了,那应该怎么办,此时我们也可以使用如下的方式进行密码重置,操作很简单,思路是将Mysql的密码权限表跳过,直接可以不用家门钥匙就能进到家门里面了,而且可以为所欲为,这时我们就可以去家里找到我们的钥匙,或者把钥匙和锁都换一把,我们来实际操作一下

注:生产中可能我们不会进行此操作,密码都会由DBA或DBA经理进行严格保管,基本没有丢失情况发生,并且一般业务都是禁止停库操作的,但万事也不能保证100% 如果在维护中不够规范导致密码丢失时,可以选择性进行密码重置


1)关闭Mysql:killall mysqld   或  ps aux | grep mysql | grep -v grep |awk '{print $2}' |xargs kill -9 (不建议使用此类方式停止Mysql,但目前为非常情况因为没有Mysql密码,所以不能使用mysqladmin shutdown的正常关库方式关闭Mysql) 2)使用跳过密码权限表的方式启动Mysql: /usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf –skip-grant-tables & 参数:--skip-grant-tables是跳过了mysql.user表的权限验证信息,让我们可以直接进入Mysql进行数据库操作 3)登陆:mysql (敲mysql命令就直接可以登入了) 4)查看用户:select user,host from mysql.user;(查看一下我们需要修改的用户信息) 5)修改密码:(Mysql的权限我们后续会再次进行讲解,先了解一下是由用户%主机+密码方式验证的) update mysql.user set authentication_string=PASSWORD('new-password') where user='root' and host='localhost'; 注意:此处我们使用的版本是5.7,以前版本使用如下命令,5.7之后密码的存储字段发生了变化: update mysql.user set password=PASSWORD('new-password') where user='root' and host='localhost'; 6)刷新权限:flush privileges;(Mysql修改user表后不会立即生效,需要执行此命令进行权限的刷新) 7)重启Mysql: 1.关闭Mysql:killall mysqld 或 ps aux | grep mysql | grep -v grep |awk '{print $2}' |xargs kill -9 2.启动Mysql:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf & 

小结

在本章中我们学习了Mysql5.6、Mysql5.7、Mysql8.0每个版本的安装过程,并介绍了在安装Mysql之前我们应该先对操作系统进行优化的知识点,同时若在工作中或练习中忘记了root的密码应该怎么进行处理,建议大家在练习时一定要进行反复练习,并且在前期学习最好是手敲方式练习,不要复制粘贴,这样效率虽然高,但是我们现在是学习阶段,不要追求快,多敲几遍这样才记得牢固,包括后面一些知识点学习中遇到问题可以有一个处理思路,Mysql的安装其实很简单,一共就分为5部分,很多的应用服务也基本都可以总结为这5部分:环境准备、安装、配置、初始化、启动,在安装过程中如果遇到问题先去检查一下自己的操作是否是按照老师的操作过程来的,然后再去检查一下自己的环境是不是有问题,多去思考动脑,在下章中我们就开始学习Mysql.user这张表,以及其他一些针对权限方面的控制,权限控制在生产环境中是必然的,如果控制不好用户及开发人员的权限,那出了问题就是你DBA的问题,同时会介绍一些8.0中带入的新特性,我们下章再会!