vlambda博客
学习文章列表

MySQL探索之旅之一:安装篇

章节提要

  • 操作系统平台选择

  • 以更专业的姿势安装MySQL

  • 弱水三千,我娶哪个发行版/版本?

  • 环境配置

  • 安装

  • 初始化实例以及启动MySQL服务

  • MySQL最最基础的命令

 

面向阅读对象
  • 有一丢丢计算机基础知识的爱好者。

  • 有一丢丢Linux操作基础。



 

Part I. 操作系统平台选择
在接下来的时光里,我们使用CentOS 7.8 x86_64 对MySQL进行学习和探索。
 
虽然Windows万般好,无他,请独爱Linux。因为在Linux下,你可以获得MySQL更好的性能表现,也可以使用更多的Linux特性来玩转MySQL,Linux值得你拥有。
MySQL支持多种Linux发行版,使用平台较多的大致有Ubuntu(Debian系)、CentOS(RedHat 红帽系)、SUSE Linux等等等等。随着计算机硬件的日益强悍,尽可能选择64位架构的操作系统平台以及的64位的MySQL发行版。

 

Part II. 以更专业的姿势安装MySQL
如果你使用过Linux,或许安装MySQL对你来说小事一桩 —— apt install mysql-server / yum install mysql-server ,一条命令搞定一切的快感令你如沐春风。
不过,这样“智能”的安装方式可以使你快速的使用数据库,却不能让你更好的玩转MySQL——安装过程里对操作系统做了哪些配置?实际安装的是哪一个版本?如何安装特定的版本?
因此,从现在开始,我们使用二进制发行版(Linux Generic)的方式对MySQL进行安装配置和探索。

 

Part III. 弱水三千,我娶哪个发行版/版本?
MySQL作为一个开源数据库项目,拥有众多分支版本,在这里我们主要使用官方版本 MySQL 5.7.30  x86_64 进行探索。
在这里我们直接在服务器进行下载:
[root@testsrv ~]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz /root

 

Part IV. 环境配置
1.建立MySQL用户"mysql"
[root@testsrv ~]# useradd -g mysql -u 2000 -s /sbin/nologin -d /usr/local/mysql -MN mysql
 
2.修改sysctl.conf
[root@testsrv ~]# echo "vm.swappiness=1" >> /etc/sysctl.conf[root@testsrv ~]# sysctl -p
无报错则继续。
 
3.配置limits.conf
[root@testsrv ~]# echo '* soft nofile 65535' >> /etc/security/limits.conf[root@testsrv ~]# echo '* hard nofile 65535' >> /etc/security/limits.conf
 
4.配置ulimit
[root@testsrv ~]# echo "ulimit -n 65535" >> /etc/rc.local[root@testsrv ~]# ulimit -n 65535
 
5.配置IO调度
[root@testsrv ~]# echo deadline > /sys/block/sda/queue/scheduler[root@testsrv ~]# grubby --update-kernel=ALL --args="elevator=deadline"
 
6.关闭NUMA
[root@testsrv ~]# sed -i '/^numa/c numa=off' /etc/default/grub[root@testsrv ~]# grub2-mkconfig -o /etc/grub2.cfg >/dev/null
 
7.关闭SELinux
[root@testsrv ~]# vi /etc/selinux/config修改内容为SELINUX=disabled

 
8.重启服务器以生效配置
[root@testsrv ~]# reboot

 

Part V. 安装

1.规划并创建MySQL的BASE DIR和DATA DIR

 

BASE DIR:MySQL的程序文件所在目录

在这里选择将MySQL解压到/opt/mysql-5.7.30-linux-glibc2.12-x86_64
[root@testsrv ~]# tar zxf /root/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz -C /opt/[root@testsrv ~]# ls /opt/mysql-5.7.30-linux-glibc2.12-x86_64bin data docs include lib LICENSE man README share support-files

DATA DIR:MySQL实例的数据文件所在目录
由于同一个服务器上极有可能运行多个MySQL实例,在这里将每个实例的目录规划为/data/mysql/{MySQL实例端口号}
我们先建立一个3306实例的目录:
[root@testsrv ~]# mkdir -p /data/mysql/mysql3306/{data,logs,tmp}
 
将目录所有者指定为操作系统mysql用户
[root@testsrv ~]# chown -R mysql:mysql /data/mysql/mysql3306/{data,logs,tmp}
 
目录解释:
/data/mysql/└── mysql3306 #实例端口号作为实例DATA DIR的一部分,便于管理和识别 ├── data #实例数据文件的存放目录(datadir就是它)    ├── logs   #实例日志文件的存放目录 └── tmp #实例的临时文件目录

2.为mysql3306实例编写参数文件

同样的,我们也使用实例的端口号来命名实例的参数文件,便于管理和识别。
[root@testsrv ~]# vi /data/mysql/mysql3306/my3306.cnf


将下列参数写入到文件并保存。不同于以往MySQL教程的长篇大论,在这里我们先使用尽可能少的配置来让MySQL运行起来。
[mysqld]user                                =mysqlbasedir                             =/opt/mysql-5.7.30-linux-glibc2.12-x86_64/datadir                             =/data/mysql/mysql3306/data/server_id                           =1003306port                                =3306bind-address                        =127.0.0.1character_set_server                =utf8mb4explicit_defaults_for_timestamp     =onlog_timestamps                      =systemlower_case_table_names              =1default_time_zone                   ='+08:00'socket                              =/data/mysql/mysql3306/tmp/mysql.socksecure_file_priv                    =/data/mysql/mysql3306/tmp/binlog_format                       =rowlog_bin                             =/data/mysql/mysql3306/logs/mysql-binbinlog_rows_query_log_events        =onlog_slave_updates                   =onlog_error                           =/data/mysql/mysql3306/logs/error.loggeneral_log                         =offgeneral_log_file                    =/data/mysql/mysql3306/logs/general.logslow_query_log                      =onslow_query_log_file                 =/data/mysql/mysql3306/logs/slow_query.loglog_queries_not_using_indexes       =onlong_query_time                     =1.000000gtid_mode                           =onenforce_gtid_consistency            =on


3.检查MySQL的依赖

[root@testsrv ~]# ldd /opt/mysql-5.7.30-linux-glibc2.12-x86_64/bin/mysqld
 没有提示NOT FOUND 就可以下一步了。如果发现有依赖组件NOT FOUND,使用yum等方式安装依赖,直到通过检测。

4.创建软连接并配置PATH
[root@testsrv ~]# ln -sf /opt/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql[root@testsrv ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile

5.使PATH生效
[root@testsrv ~]# . /etc/profile[root@testsrv ~]# which mysql/usr/local/mysql/bin/mysql
 
Part VI. 奔跑吧皮卡丘!初始化实例以及启动MySQL服务

忙了这么久,做了这么多mysql3306的准备,在这一步都会体现价值。

 

1.随机密码方式初始化实例

使用随机密码方式初始化实例,mysqld初始化过程中会随机为root@localhost创建密码,可以在errorlog中查看密码明文。
登陆后强制要求变更密码。
[root@testsrv ~]# mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf --initialize

 

耐心的等待一会,没有报错的话就是可以啦(没有消息就是最好的消息)!

如果有报错,根据报错做一下排查:

  • datadir的目录中有文件(目录不为空拒绝初始化)?

  • 是缺依赖包(xxx not found.)?

  • 还是目录权限不对(permisson denied.)?

  • 还是配置文件中的datadir目录里存在文件?

  • 亦或是命令选项敲错了(误将 defaults-file 打成了 default-files)?

 

查看一下初始化后的结果

[root@testsrv ~]# ls /data/mysql/mysql3306/dataauto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sysca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ib_logfile2 performance_schema public_key.pem server-key.pem
[root@testsrv ~]# cat /data/mysql/mysql3306/logs/error.log2020-07-10T17:43:51.243252+08:00 0 [Warning] CA certificate ca.pem is self signed.2020-07-10T17:43:51.551619+08:00 1 [Note] A temporary password is generated for root@localhost: QsJqBL+7*;de

 

2.启动mysqld进程以启动实例

完成初始化后,就可以启动实例了
简单语法:mysqld --defaults-file=${mycnf_file} &--defaults-file 指定mysql cnf 配置文件路径

[root@testsrv ~]# mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf &

 

查看进程
[root@testsrv ~]# ps -ef | grep mysqldmysql 527 465 1 09:20 pts/0 00:00:00 mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf


 

启动完成,如果查看不到进程,可以检查一下errorlog,看看是什么问题导致启动失败。

 

3.登陆mysql3306实例

MySQL实例初始化完毕后,默认会创建root@localhost用户,下面我们使用这个用户登陆到数据库实例。
简单语法:mysql -u root -p123 -h 127.0.0.1 -P 3306 -S xxxx.sock-u mysql user,不指定则以当前OS username-p mysql user的密码-h mysql实例的服务器地址/IP,可能与-P连用-P mysql实例的服务器端口,默认为3306-S 本地socket方式登陆时用来指定socket文件地址,用-S就不需要-h 和-P了


使用本地socket方式登陆(建议)
[root@testsrv ~]# mysql -S /data/mysql/mysql3306/tmp/mysql.sock -u root -pEnter password: # 此处密码不会显示,将初始化时errorlog中的临时密码:QsJqBL+7*;de 输入或粘贴进去即可Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 4Server version: 5.7.30-log
Copyright (c) 2000, 2020, 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.
mysql>
先退出mysql> exitBye

 

使用TCP方式登陆
[root@testsrv ~]# mysql -h 127.0.0.1 -u root -p Enter password: # 此处密码不会显示,将初始化时errorlog中的临时密码:QsJqBL+7*;de 输入或粘贴进去即可Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2Server version: 5.7.30-log
Copyright (c) 2000, 2020, 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.
mysql>

 

4.修改root@localhost密码

使用临时密码登陆实例后,进行任何操作时都会弹出密码修改的提示,同时操作被阻止。
mysql> show databases;ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

修改密码为 hellomysql

mysql> alter user user() identified by 'hellomysql';Query OK, 0 rows affected (0.06 sec)


再进行操作就可以了

mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql || performance_schema || sys |+--------------------+4 rows in set (0.00 sec)
后续登陆都使用新密码。

 

附.无密码方式初始化实例

mysqld初始化阶段可以使用--initialize-insecure 方式替代--initialize ,这样在实例初始化过程中,root@localhost用户密码为空,方便的同时也存在一些安全隐患。

 

如果已经使用1.随机密码方式初始化实例,再次进行初始化操作会报错。在这里我们删除掉前面初始化的结果,使用无密码方式重新初始化一遍。

 

删除前一次初始化的内容
[root@testsrv ~]# rm -fr /data/mysql/mysql3306/data/*[root@testsrv ~]# rm -fr /data/mysql/mysql3306/logs/*[root@testsrv ~]# rm -fr /data/mysql/mysql3306/tmp/*

 

无密码方式初始化实例
[root@testsrv ~]# mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf --initialize-insecure

 

查看一下初始化后的结果
[root@testsrv ~]# ls /data/mysql/mysql3306/dataauto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sysca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ib_logfile2 performance_schema public_key.pem server-key.pem
[root@testsrv ~]# cat /data/mysql/mysql3306/logs/error.log2020-07-10T17:33:54.606511+08:00 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

 

启动实例后可直接无密码登陆
[root@testsrv ~]# mysql -S /data/mysql/mysql3306/tmp/mysql.sock -u rootWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2Server version: 5.7.30-log
Copyright (c) 2000, 2020, 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.
mysql>

 

建议无密码初始化后,手动设定密码,养成良好的安全意识以确保安全

 

Part VII. MySQL最最最最基础的命令
  • 初始化实例

随机密码:mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf --initialize无密码:mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf --initialize-insecure

  • 启动实例

mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf &
  • 登陆实例

mysql -S /data/mysql/mysql3306/tmp/mysql.sock -u root -p
  • 修改密码

mysql> alter user username identified by 'newpassword';如果修改当前用户密码,username可以直接使用user() 函数。
  • 查看实例状态

mysql> \s (清晰简要)mysql> show status\G (长篇大论)
  • 关闭实例

mysql> shutdown ; exit;



好了,本次的探索之旅已经结束,我是你们的老司机孔个个,请期待我们后续的旅程!