安装MySQL8.0

目录

 

 一、MySQL 8.0新特性

二、安装前准备工作

三、安装MySQL 8.0


 一、MySQL 8.0新特性

截止今日,MySQL 最新的GA版是 MySQL-8.0.12,这个版本是 MySQL 数据库又一个开拓时代的开始。

MySQL 不像 Oracle 数据库的版本跳度那么大,Oracle 是 8i、9i、10g、11g、12c 这样的一个版本迭代速度,而 MySQL 在大版本上一直没用什么变化。从5.0、5.1、5.5、5.6 直到目前最成熟的 MySQL 5.7 都是基于 5 这个大版本。这次新的 MySQL 8.0 无疑是一个新时代的开始,虽然 MySQL 8.0 在新特性上没有新的元素加入,但是它对MySQL的源代码进行了重构,最突出的一点就是对 MySQL Optimizer 优化器的改进,支持隐藏索引等功能。针对优化器的改进是在之前的版本中从来没有触碰过的。而且 MySQL 8.0 为了对优化器做更多的特性支持,还加入了性能直方图这个新的元素,让 MySQL Server 层和存储引擎层配合得更加紧密。而且在 MySQL 8.0 之后我们真的要和 MyISAM 存储引擎 say goodbye 了!

来具体看一下 MySQL 8.0的主要新特性吧!

1.MySQL 8.0 的速度要比 MySQL 5.7 快2倍。MySQL 8.0 在读写工作负载、I/O 密集型工作负载、以及高竞争工作负载上有着更好的性能。

 2.新增了事务类型的数据字典,所有元数据信息,都用 InnoDB 存储引擎进行存储。8.0 之前的版本中,Server 层和 InnoDB 存储引擎有两套数据字典。其中 Server部分的数据字典,存储在 .frm 文件里面。而 InnoDB 存储引擎层也有自己的数据字典表,在 information_schema 库下面的 tables 表中进行存储。

3.角色管理,使用角色可以方便地对用户权限进行管理。

创建角色:

root@localhost 01:55: [(none)]> create role 'db_read','db_write';

角色授权:

root@localhost 02:11: [(none)]> grant select on hello.* to 'db_read';

root@localhost 02:12: [(none)]> grant insert,update,delete on hello.* to 'db_write';

给用户赋予角色:

root@localhost 02:14: [(none)]> grant 'db_read' to 'qkc_ro'@'localhost';

root@localhost 02:14: [(none)]> grant 'db_read','db_write' to 'qkc_rw'@'localhost';

4.配置持久化,MySQL的设置可以在运行时通过 SET GLOBAL 命令来更改,但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。  MySQL 8.0 新增了 SET PERSIST 命令,该命令的配置会保存到数据目录下的 mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件。

root@localhost 02:15: [(none)]> set persist sync_binlog = 1;

5.字符集:从 MySQL 8.0 开始,数据库的缺省编码将改为 utf8mb4,这个编码包含了所有的 emoji 字符。

6.隐藏索引:开始支持 invisible index,在优化SQL的过程中可以设置索引为不可见,MySQL优化器便不会利用不可见索引。我们可以通过隐藏该索引,来观察对数据库性能的影响。

alter table alter index column_idx invisible;

二、安装前准备工作

先到 MySQL 官网下载MySQL 8.0的二进制包,二进制包中官方已经将所需要的功能都配置好了,我们直接拿来用就OK了,一般生产或测试都会选择GA版本,即常规可用的版本。 https://www.mysql.com/

软件包下载完成后,最好先对其进行一次 MD5 校验,保证下载过程中没有出现任何问题。

# md5sum mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz
58bcd8af8b9d966140430ae4c846df73  mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz

OS版本

# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

安装前的准备工作规划为六大步骤:

  • 关闭防火墙和SElinux

  • I/O scheduler

  • swap分区设置

  • 文件系统选择

  • 操作系统限制

  • 关闭NUMA

(1)关闭防火墙和SElinux,SElinux修改后需要重启生效。

# systemctl stop firewalld && systemctl disable firewalld

# sed -i 's@SELINUX=enforcing@SELINUX=disabled@g' /etc/selinux/config

(2)I/O scheduler

这里强烈建议使用 deadline 模式。centos 7.x默认 deadline,centos 6.x默认 cfq。deadline 确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限。这样就防止了写操作因为不能被读取而饿死的现象。deadline 对数据库环境(Oralce RAC,MySQL等)是最好的选择。

查看当前系统的 I/O 调度算法,centos 7 保持默认即可。

# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

(3)swap分区设置

swappiness 值的大小对如何使用 swap 分区有着很大的影响。它有 0 和 100 两个极限值,0代表最大限度的使用物理内存,然后才使用swap分区,这种行为可能导致系统出现 OOM(out of memor) 的错误,从而导致 MySQL 被意外 kill 掉,因此需要谨慎设置。100 则是积极的使用 swap 分区,并且把内存上面的数据即使搬到 swap 分区里(不建议)。这里建议不使用 swap 分区,或者分配 4GB 就足够了。

# vim /etc/sysctl.conf

vm.swappiness = 60

# sysctl -p

(4)文件系统选择

强烈建议使用 xfs。相比 ext4,它更方便管理,支持动态扩容,删除文件也很方便。

(5)操作系统限制

操作系统的限制上要注意 open files 和 max user processes 的值,如果设置不合理,而当前服务器的连接过多或表过多时,就有可能会出现打不开表或者访问不了表的现象。

默认情况下,Linux单个进程最多可以访问 1024 个文件句柄。如要超过默认值,就会出现文件句柄超限的错误 “too many open files”。

有时候我们要跑多实例,max user processes 参数如果不够,就创建不了新的连接,会出现 “resource temporarily unavailable” 的错误,表示没有足够的资源。

为了防止以上两种报错的情况,可以修改操作系统的软硬限制。

# vim /etc/security/limits.conf

*    soft    nproc   65535
*    hard   nproc   65535
*    soft    nofile    65535
*    hard   nofile   65535

(6)关闭NUMA

简单来讲关闭 NUMA 功能,可以更好的分配内存,不需要采用 swap 的方式来获取内存。swap 导致的数据库性能下降是非常恶心人的事情。关闭方法也分在 BIOS、操作系统中关闭,或者是在数据库启动过程中关闭。

# numa --interleave=all /usr/local/mysql/bin/mysqld_safe -defaults-files=/etc/my.cnf &

三、安装MySQL 8.0

(1)创建mysql用户和组

# groupadd mysql

# useradd -M -s /sbin/nologin -g mysql mysql

(2)解压MySQL软件包,做好软链,方便日后升级

# tar xf mysql-8.0.12-linux-glibc2.12-x86_64.tar.xz -C /usr/local/

# cd /usr/local/

# ln -s mysql-8.0.12-linux-glibc2.12-x86_64/ mysql

(3)创建MySQL数据目录,并一同授予权限,MySQL家目录和数据目录都需要给予权限

# ls /usr/local/mysql

# mkdir -pv /usr/local/mysql/data

# chown -R mysql:mysql /usr/local/mysql

# chown -R mysql:mysql /usr/local/mysql/data

(4)配置MySQL的配置文件(按需调整)

# vim /etc/my.cnf

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

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

[mysqld]
user    = mysql
port    = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data/
socket  = /tmp/mysql.sock
pid-file = db.pid
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit    = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
#query_cache_size = 0
#query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/data/slow.log
log-error = /usr/local/mysql/data/error.log
long_query_time = 0.1
server-id = 3306101
log-bin = /usr/local/mysql/data/mysql-bin
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M

lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30

transaction_isolation = REPEATABLE-READ
#innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_max_undo_log_size = 4G

innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_neighbors = 0
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
#innodb_file_format = Barracuda
#innodb_file_format_max = Barracuda
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0

[mysqldump]
quick
max_allowed_packet = 32M

(5)初始化数据库

无密码初始化:

# mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=mysql --initialize-insecure

有密码初始化:生成的临时密码记录在log-error中

# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --initialize

获取临时密码

# grep -i 'password' /usr/local/mysql/data/error.log
2018-09-17T17:22:18.648807Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: sOqotergq7)L

(6)启动MySQL数据库

MySQL读取配置文件的顺序依次是 /etc/my.cnf —> /etc/mysql/my.cnf —> /usr/local/mysql/etc/my.cnf —> ~/.my.cnf,mysqld在启动过程中可以自己启动任何位置的配置文件,--defaults-file参数用于指定配置文件的位置,以该配置文件来启动一个mysqld。

 # /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &

验证启动是否成功,如果启动失败,就去查 log-error

# ps aux | grep mysql

# netstat -atnulp | grep mysql

(7)登录MySQL数据库,并修改MySQL的root用户密码

 # /usr/local/mysql/bin/mysql -uroot -p'sOqotergq7)L'

root@localhost 01:30: [(none)]> alter user root@'localhost' identified by 'pwd@123';

(8)关闭MySQL

正常关闭

# /usr/local/mysql/bin/mysqladmin -uroot -p'pwd@123' shutdown

非正常关闭的话,就先查看 MySQL 进程号,然后 kill 掉 MySQL 进程就好了。

 

安装完成之后,可以观察到 8.0 数据目录下的文件相比之前的版本发生了一些变化,多了很多 .pem 文件,没有了 .frm 文件。而且 undo 日志文件从系统表空间拆分出来了。系统表和数据字段信息都存储在 mysql.ibd 文件中。

# ls /usr/local/mysql/data/
auto.cnf         client-key.pem  ibdata1      mysql             mysql-bin.000004    private_key.pem  slow.log
ca-key.pem       db.pid          ib_logfile0  mysql-bin.000001  mysql-bin.index     public_key.pem   sys
ca.pem           error.log       ib_logfile1  mysql-bin.000002  mysql.ibd           server-cert.pem  undo_001
client-cert.pem  ib_buffer_pool  ibtmp1       mysql-bin.000003  performance_schema  server-key.pem   undo_002

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值