在本章就开始在我们的环境上进行实际搭建,此次搭建参考以下几个版本,并在其中介绍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
只替换指定的 SELINUX=enforcing
sed -i 's/SELINUX=enforcing/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
(自己运行版本)
为了防止以上两种报错情况,我们可以修改系统的软硬限制。编辑 /etc/security/limits.conf 加入限制的相关内容。
记得更改完内容之后,需要重启操作系统才能生效。
vi /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 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
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 &
6.修改密码:/usr/local/mysql/bin/mysqladmin -u root password '123456'
登录测试
/usr/local/mysql/bin/mysql -uroot -p
我们看一下图示内容:正常初始化后会出现两个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 &
修改密码
/usr/local/mysql/bin/mysqladmin -uroot -p password
登录测试
/usr/local/mysql/bin/mysql -uroot -p
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_001ca-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&
查看随机密码:可以看到我们的初始密码为 "nekpGErvF9*i"
[root@localhost data]# cat /data/mysql/log/error.log | grep password
修改密码
/usr/local/mysql/bin/mysqladmin -uroot -p password
六、登入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 is9Server version: 8.0.15 MySQL Community Server - GPLCopyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;'or'\h'for help. Type '\c' to clear the current input statement.root@db 10:36: [(none)]>
关闭数据库命令
cd /usr/local/mysql/bin
./mysqladmin -uroot -p123456 shutdown
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 &