2-MySQL 安装和基本使用

本贴最后更新于 1524 天前,其中的信息可能已经物是人非

2 MySQL 安装和基本使用

2.1 MySQL 介绍

2.1.1 MySQL 历史

1979 年:TcX 公司 Monty Widenius,Unireg

1996 年:发布 MySQL1.0,Solaris 版本,Linux 版本

1999 年:MySQL AB 公司,瑞典

2003 年:MySQL 5.0 版本,提供视图、存储过程等功能

2008 年:Sun 公司 以 10 亿美元收购 MySQL

2009 年:Oracle 公司以 75 亿美元收购 sun 公司

2009 年:Monty 成立 MariaDB

2.2.2 MySQL 系列

2.2.2.1 MySQL 的三大主要分支

  • mysql
  • mariadb
  • percona Server

2.2.2.2 官方网址

MySQL

2.2.2.3 官方文档

MySQL :: MySQL Documentation

2.2.2.4 版本演变

MySQL:5.1 --> 5.5 --> 5.6 --> 5.7 -->8.0

MariaDB:5.1 -->5.5 -->10.0--> 10.1 --> 10.2 --> 10.3 --> 10.4 --> 10.5

MySQL被Sun收购后,搞了个过渡的6.0版本,没多久就下线了,后来被Oracle收购后,终于迎来了像样的5.6版本,之后就是5.7、8.0版本。由于6.0版本号已被用过,7.x系列版本专用于NDB Cluster,因而新版本号从8.0开始。

2.2.3 MySQL 的特性

  • 开源免费
  • 插件式存储引擎:也称为“表类型”,存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,Mysql5.5.5 开始 innoDB 引擎是 MYSQL 默认引擎
MyISAM ==> Aria InnoDB ==> XtraDB
  • 单进程,多线程
#判断多线程 [09:57:23 root@centos8 ~]#grep -i threads /proc/1074/status Threads: 39
  • 诸多扩展和新特性
  • 提供了较多测试组件

2.2 MySQL 安装方式介绍和快速安装

2.2.1 安装方式介绍

  • 程序包管理器管理的程序包
  • 源代码编译安装
  • 二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用

2.2.2 RPM 包安装 MySQL

CentOS 安装光盘

项目官方:https://downloads.mariadb.org/mariadb/repositories/

国内镜像:https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/

Index of /mysql/yum/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

CentOS 8:安装光盘直接提供

  • mysql-server:8.0
  • mariadb-server : 10.3.17

CentOS 7:安装光盘直接提供

  • mariadb-server:5.5 服务器包
  • mariadb 客户端工具包

CentOS 6:

  • mysql-server:5.1 服务器包
  • mysql 客户端工具包

范例: CentOS 7 安装 MySQL5.7

[10:54:25 root@centos7 ~]#cat /etc/yum.repos.d/mysql57.repo [mysql57] name=mysql57 baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/ gpgcheck=0 [10:55:08 root@centos7 ~]#yum list | grep mysql57 mysql-community-client.i686 5.7.33-1.el7 mysql57 mysql-community-client.x86_64 5.7.33-1.el7 mysql57 mysql-community-common.i686 5.7.33-1.el7 mysql57 mysql-community-common.x86_64 5.7.33-1.el7 mysql57 mysql-community-devel.i686 5.7.33-1.el7 mysql57 mysql-community-devel.x86_64 5.7.33-1.el7 mysql57 mysql-community-embedded.i686 5.7.33-1.el7 mysql57 mysql-community-embedded.x86_64 5.7.33-1.el7 mysql57 mysql-community-embedded-compat.i686 5.7.33-1.el7 mysql57 mysql-community-embedded-compat.x86_64 5.7.33-1.el7 mysql57 mysql-community-embedded-devel.i686 5.7.33-1.el7 mysql57 mysql-community-embedded-devel.x86_64 5.7.33-1.el7 mysql57 mysql-community-libs.i686 5.7.33-1.el7 mysql57 mysql-community-libs.x86_64 5.7.33-1.el7 mysql57 mysql-community-libs-compat.i686 5.7.33-1.el7 mysql57 mysql-community-libs-compat.x86_64 5.7.33-1.el7 mysql57 mysql-community-server.x86_64 5.7.33-1.el7 mysql57 mysql-community-test.x86_64 5.7.33-1.el7 mysql57 [10:55:17 root@centos7 ~]#yum install mysql-community-server -y [11:00:53 root@centos7 ~]#systemctl enable --now mysqld [11:04:08 root@centos7 ~]#ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 80 [::]:3306 [::]:* LISTEN 0 128 [::]:111 [::]:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 100 [::1]:25 [::]:* [11:04:26 root@centos7 ~]#mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) [11:05:15 root@centos7 ~]#grep password /var/log/mysqld.log 2021-01-28T03:04:05.376619Z 1 [Note] A temporary password is generated for root@localhost: j9eNwN#IsToD 2021-01-28T03:05:15.225574Z 2 [Note] Access denied for user 'root'@'localhost' (using password: NO) #修改初始密码方法1 [11:37:14 root@centos7 ~]#mysql -uroot -p'j9eNwN#IsToD' mysql> alter user root@'localhost' identified by 'Zhangzhuo@0705'; Query OK, 0 rows affected (0.00 sec) mysql> status #修改初始密码方法2 [11:38:28 root@centos7 ~]#mysqladmin -uroot -p'j9eNwN#IsToD' password 'Zhangzhuo@0705'

范例:centos7 安装 Mariadb

[11:42:44 root@centos7 ~]#cat /etc/yum.repos.d/mariadb.repo [mariadb105] name=mariadb105 baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.5/centos/7/x86_64/ gpgcheck=0 [11:47:06 root@centos7 ~]#yum install -y MariaDB-server [11:47:43 root@centos7 ~]#systemctl enable --now mariadb.service [11:48:08 root@centos7 ~]#mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.5.8-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> status ------------------------ mysql Ver 15.1 Distrib 10.5.8-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 3 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server: MariaDB Server version: 10.5.8-MariaDB MariaDB Server Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 18 sec Threads: 2 Questions: 4 Slow queries: 0 Opens: 16 Open tables: 10 Queries per second avg: 0.222

2.3 初始化脚本提高安全性

运行脚本:mysql_secure_installation

设置数据库管理员root口令 禁止root远程登录 删除anonymous用户帐号 删除test数据库

2.4 MYSQL 组成

2.4.1 客户端程序

  • mysql: 交互式或非交互式的 CLI 工具
  • mysqldump:备份工具,基于 mysql 协议向 mysqld 发起查询请求,并将查得的所有数据转换成 insert 等写操作语句保存文本文件中
  • mysqladmin:基于 mysql 协议管理 mysqld
  • mysqlimport:数据导入工具

MyISAM 存储引擎的管理工具:

  • myisamchk:检查 MyISAM 库
  • myisampack:打包 MyISAM 表,只读

2.4.2 服务器端程序

  • mysqld_safe
  • mysqld
  • mysqld_multi 多实例 ,示例:mysqld_multi --example

2.4.3 用户账号

mysql 用户账号由两部分组成:

'USERNAME'@'HOST'

说明:

HOST 限制此用户可通过哪些远程主机连接 mysql 服务器

支持使用通配符:

% 匹配任意长度的任意字符,相当于shell中*, 示例: 172.16.0.0/255.255.0.0 或 172.16.%.% _ 匹配任意单个字符,相当于shell中?

2.4.4 mysql 客户端命令

2.4.4.1 mysql 运行命令类型

  • 客户端命令:本地执行,每个命令都完整形式和简写格式
mysql> \h, help mysql> \u,use mysql> \s,status mysql> \!,system
  • 服务端命令:通过 mysql 协议发往服务器执行并取回结果,命令末尾都必须使用命令结束符号,默认为分号
#示例: mysql>SELECT VERSION();

2.4.4.2 mysql 使用模式

  • 交互模式
  • 脚本模式:
mysql -uUSERNAME -pPASSWORD < /path/somefile.sql cat /path/somefile.sql | mysql -uUSERNAME -pPASSWORD mysql>source /path/from/somefile.sql

2.4.4.3 mysql 命令使用格式

mysql [OPTIONS] [database]

mysql 客户端常用选项:

-A, --no-auto-rehash 禁止补全 -u, --user= 用户名,默认为root -h, --host= 服务器主机,默认为localhost -p, --passowrd= 用户密码,建议使用-p,默认为空密码 -P, --port= 服务器端口 -S, --socket= 指定连接socket文件路径 -D, --database= 指定默认数据库 -C, --compress 启用压缩 -e “SQL“ 执行SQL命令 -V, --version 显示版本 -v --verbose 显示详细信息 --print-defaults 获取程序默认使用的配置

登录系统:

[11:50:57 root@centos7 ~]#mysql -uroot -p123456 #默认不写空密码

运行 mysql 命令:

mysql>use mysql mysql> select user(); mysql>SELECT User,Host,Password FROM user;

范例:mysql 的配置文件,修改提示符

[12:30:27 root@centos7 ~]#vim /etc/my.cnf #添加这行 [mysql] prompt="\\r:\\m:\\s(\\u@\\h) [\\d]>\\_" [12:30:27 root@centos7 ~]#mysql -uroot -p'Zhangzhuo@0705' 12:31:06(root@localhost) [(none)]>

范例:配置所有 MySQL 客户端自动登录

[12:35:05 root@centos7 ~]#vim /etc/my.cnf [client] user=root password=Zhangzhuo@0705

2.4.4.4 mysqladmin 命令

mysqladmin 命令格式

mysqladmin [OPTIONS] command command....

范例:

#查看mysql服务是否正常,如果正常提示mysqld is alive [12:36:10 root@centos7 ~]#mysqladmin -uroot -p'Zhangzhuo@0705' ping mysqladmin: [Warning] Using a password on the command line interface can be insecure. mysqld is alive #关闭mysql服务,但mysqladmin命令无法开启 [12:36:30 root@centos7 ~]#mysqladmin -uroot -p'Zhangzhuo@0705' shutdown #创建数据库testdb [12:37:39 root@centos7 ~]#mysqladmin -uroot -p'Zhangzhuo@0705' create testdb #删除数据库testdb [12:38:21 root@centos7 ~]#mysqladmin -uroot -p'Zhangzhuo@0705' drop testdb #修改root密码 [12:39:26 root@centos7 ~]#mysqladmin -uroot -p'Zhangzhuo@0705' password 'Admin@123' #日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N [12:39:33 root@centos7 ~]#mysqladmin -uroot -p'Admin@123' flush-logs

2.4.4.5 服务器端配置

服务器端(mysqld):工作特性有多种配置方式

  • 命令行选项:
  • 配置文件:类 ini 格式,集中式的配置,能够为 mysql 的各应用程序提供配置信息

服务器端配置文件:

  • /etc/my.cnf #Global 选项
  • /etc/mysql/my.cnf #Global 选项
  • ~/.my.cnf #User-specific 选项

配置文件格式:

  • [mysqld]
  • [mysqld_safe]
  • [mysqld_multi]
  • [mysql]
  • [mysqldump]
  • [server]
  • [client]

格式:

parameter = value

说明:

_和- 相同 1,ON,TRUE意义相同, 0,OFF,FALSE意义相同,无区分大小写

2.4.4.6 socket 地址

服务器监听的两种 socket 地址:

  • ip socket: 监听在 tcp 的 3306 端口,支持远程通信 ,侦听 3306/tcp 端口可以在绑定有一个或全部接口 IP 上
  • unix sock: 监听在 sock 文件上,仅支持本机通信, 如:/var/lib/mysql/mysql.sock)说明:host 为 localhost 时自动使用 unix sock

2.4.4.7 关闭 mysqld 网络连接

只侦听本地客户端, 所有客户端和服务器的交互都通过一个 socket 文件实现,socket 的配置存放

在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf 修改

范例:

vim /etc/my.cnf [mysqld] skip-networking=1 #表示关闭网络连接1关闭0开启 bind_address=127.0.0.1 #绑定端口

2.5 通用二进制格式安装 MySQL

2.5.1 准备用户

[12:48:56 root@centos7 ~]#useradd -r -s /sbin/nologin -d /data/mysql mysql

2.5.2 准备数据目录,建议使用逻辑卷

#可选做,后面的脚本mysql_install_db可自动生成此目录 [12:50:20 root@centos7 ~]#mkdir -p /data/mysql [12:50:24 root@centos7 ~]#chown mysql: /data/mysql/

2.5.3 准备二进制程序

[13:56:35 root@centos7 ~]#tar xvf mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ [13:56:35 root@centos7 ~]#cd /usr/local/ [13:57:43 root@centos7 local]#ln -sv mysql-5.6.50-linux-glibc2.12-x86_64 mysql [13:58:14 root@centos7 local]#chown -R root: /usr/local/mysql

2.5.4 准备配置文件

[14:16:18 root@centos7 mysql]#cd /usr/local/mysql [14:16:20 root@centos7 mysql]#cp -d support-files/my-default.cnf /etc/my.cnf [14:17:54 root@centos7 mysql]#vim /etc/my.cnf [mysqld] datadir = /data/mysql innodb_file_per_table = on #在mariadb5.5以上版的是默认值,可不加 skip_name_resolve = no #禁止主机名解析,建议使用

2.5.5 创建数据库文件

[14:21:09 root@centos7 mysql]#./scripts/mysql_install_db --datadir=/data/mysql --user=mysql [14:28:12 root@centos7 mysql]#ls /data/mysql/ -l total 110600 -rw-rw---- 1 mysql mysql 12582912 Jan 28 14:28 ibdata1 -rw-rw---- 1 mysql mysql 50331648 Jan 28 14:28 ib_logfile0 -rw-rw---- 1 mysql mysql 50331648 Jan 28 14:28 ib_logfile1 drwx------ 2 mysql mysql 4096 Jan 28 14:28 mysql drwx------ 2 mysql mysql 4096 Jan 28 14:28 performance_schema drwx------ 2 mysql mysql 6 Jan 28 14:27 test

2.5.6 准备服务脚本,并启动服务

[14:28:17 root@centos7 mysql]#cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [14:28:58 root@centos7 mysql]#chkconfig --add mysqld [14:29:22 root@centos7 mysql]#service mysqld start #如果有对应的service 文件可以执行下面 cp /usr/local/mysql/support-files/systemd/mariadb.service /usr/lib/systemd/system/ systemctl daemon-reload systemctl enable --now mariadb

2.5.7 PATH 路径

[14:30:50 root@centos7 mysql]#echo 'PATH=/usr/local/mysql/bin:$PATH' >/etc/profile.d/mysql.sh [14:32:09 root@centos7 mysql]#. /etc/profile.d/mysql.sh

2.5.8 安全初始化

[14:34:03 root@centos7 mysql]#mysql_secure_installation

2.6 实战案例:一键安装 mysql-5.6 二进制包的脚本

2.6.1 离线安装 mysql-5.6 二进制包的脚本

#!/bin/bash # #******************************************************************** #Author:zhangzhuo #QQ: 1191400158 #Date: 2021-01-28 #FileName:install_mysql5.6.sh #URL: https://www.zhangzhuo.ltd #Description:The test script #Copyright (C): 2021 All rights reserved #******************************************************************** NAME=$1 NAME=`echo $NAME | grep -Eo '[^/]+$'` DIRNAME=`echo $NAME | sed -rn 's/(.*).tar.*/\1/p'` DIR=/usr/local DATADIR=/data/mysql install_mysql_user(){ if id mysql &>/dev/null;then echo "MYSQL用户已经存在,无需从新创建!" else useradd -r -s /sbin/nologin -d $DATADIR mysql fi } install_mysql_datadir(){ if [ -d $DATADIR ];then echo "${DATADIR}目录已经存在,无需从新创建!" else mkdir -p $DATADIR chown mysql: $DATADIR fi } install_mysql_my(){ cat /etc/profile.d/mysql.sh . /etc/profile.d/mysql.sh cp $DIR/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld service mysqld start else echo -e "\033[1;31m二进制文件不存在请检查\033[0m";exit fi } install_mysql_user install_mysql_datadir install_mysql

2.6.2 在线安装 mysql-5.6 二进制包的脚本

#!/bin/bash # #******************************************************************** #Author:zhangzhuo #QQ: 1191400158 #Date: 2021-01-28 #FileName:install_online_mysql5.6_for_centos.sh #URL: https://www.zhangzhuo.ltd #Description:The test script #Copyright (C): 2021 All rights reserved #******************************************************************** . /etc/init.d/functions DIR=`pwd` URL=https://repo.huaweicloud.com/mysql/Downloads/MySQL-5.6/mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz NAME=`echo $URL | grep -Eo '[^/]+$'` DIRNAME=`echo $NAME | sed -rn 's/(.*).tar.*/\1/p'` DATA_DIR=/data/mysql FULL_NAME=${DIR}/${NAME} install_mysql_wget(){ rpm -q wget &>/dev/null || yum install -y wget yum install -y -q libaio perl-Data-Dumper autoconf if [ -f ${FULL_NAME} ];then action "安装文件已经存在不需要下载" else action "安装文件不存在开始下载" false wget $URL || { action "下载失败,异常退出" false;exit 10; } fi } install_mysql_user(){ if id mysql &>/dev/null;then action "MYSQL用户已经存在,无需从新创建!" else useradd -r -s /sbin/nologin -d $DATA_DIR mysql action "mysql用户创建成功" fi } install_mysql_datadir(){ if [ -d $DATA_DIR ];then action "${DATA_DIR}目录已经存在,无需从新创建!" chown mysql: $DATA_DIR else mkdir -p $DATA_DIR chown mysql: $DATA_DIR fi } install_mysql_my(){ cat /dev/null echo "PATH=/usr/local/mysql/bin":'$PATH' >/etc/profile.d/mysql.sh cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld service mysqld start source /etc/profile.d/mysql.sh mysqladmin ping && action "服务启动成功" || action "服务启动失败请检查" false fi } install_mysql_wget install_mysql_user install_mysql_datadir install_mysql

2.7 实战案例:二进制安装安装 MySQL 5.7 和 MySQL8.0

2.7.1 安装相关包

[18:20:20 root@centos7 ~]#yum install libaio numactl-libs

2.7.2 用户和组

[18:27:30 root@centos7 ~]#useradd -r -s /sbin/nologin -d /data/mysql mysql [18:46:02 root@centos7 local]#mkdir -p /data/mysql [18:46:10 root@centos7 local]#chown mysql: /data/mysql

2.7.3 准备程序文件

[18:29:25 root@centos7 ~]#wget https://repo.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz [18:35:03 root@centos7 ~]#tar xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ [18:36:36 root@centos7 ~]#cd /usr/local/ [18:36:59 root@centos7 local]#ln -s mysql-5.7.31-linux-glibc2.12-x86_64 mysql [18:37:37 root@centos7 local]#chown -R root: /usr/local/mysql

2.7.4 准备环境变量

[18:38:55 root@centos7 local]#echo 'PATH=/usr/local/mysql/bin:$PATH' >/etc/profile.d/mysql.sh [18:39:08 root@centos7 local]#. /etc/profile.d/mysql.sh

2.7.5 准备配置文件

[18:43:53 root@centos7 local]#grep -Ev '^#|$^' /etc/my.cnf [mysqld] datadir=/data/mysql skip_name_resolve=1 socket=/date/mysql/mysql.sock log-error=/var/log/mysql.log [client] socket=/data/mysql/mysql.sock !includedir /etc/my.cnf.d [18:51:01 root@centos7 local]#touch /var/log/mysql.log [18:51:16 root@centos7 local]#chown mysql: /var/log/mysql.log

2.7.6 生成数据库文件,并提取 root 密码

[18:46:25 root@centos7 local]#mysqld --initialize --user=mysql --datadir=/data/mysql [18:52:20 root@centos7 local]#grep password /var/log/mysql.log 2021-01-28T10:51:39.397031Z 1 [Note] A temporary password is generated for root@localhost: ggtorsg(H6wj

2.7.7 准备服务脚本和启动

[19:17:02 root@centos7 ~]#cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [19:17:27 root@centos7 ~]#chkconfig --add mysqld [19:27:59 root@centos7 ~]#service mysqld start

2.7.8 修改口令

[19:28:59 root@centos7 ~]#mysqladmin -uroot -p'gEG?>*c=E8oL' password 123456

2.7.9 测试登录

[19:53:56 root@centos7 ~]#mysql -uroot -p123456

2.8 实战案例:一键安装 MySQL5.7 和 MySQL8.0 二进制包的脚本

2.8.1 在线安装脚本

#!/bin/bash # #******************************************************************** #Author:zhangzhuo #QQ: 1191400158 #Date: 2021-01-28 #FileName:install_mysql5.7-8.0.sh #URL: https://www.zhangzhuo.ltd #Description:The test script #Copyright (C): 2021 All rights reserved #******************************************************************** . /etc/init.d/functions DIR=`pwd` URL=https://repo.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz NAME=`echo $URL | grep -Eo '[^/]+$'` DIRNAME=`echo $NAME | sed -rn 's/(.*).tar.*/\1/p'` DATA_DIR=/data/mysql FULL_NAME=${DIR}/${NAME} PASSWORD=123456 install_mysql_wget(){ rpm -q wget &>/dev/null || yum install -y wget yum install -y -q libaio perl-Data-Dumper autoconf if [ -f ${FULL_NAME} ];then action "安装文件已经存在不需要下载" else action "安装文件不存在开始下载" false wget $URL || { action "下载失败,异常退出" false;exit 10; } fi } install_mysql_user(){ if id mysql &>/dev/null;then action "MYSQL用户已经存在,无需从新创建!" else useradd -r -s /sbin/nologin -d $DATA_DIR mysql action "mysql用户创建成功" fi } install_mysql_datadir(){ if [ -d $DATA_DIR ];then action "${DATA_DIR}目录已经存在,无需从新创建!" chown mysql: $DATA_DIR else mkdir -p $DATA_DIR chown mysql: $DATA_DIR action "${DATA_DIR}目录创建完成!" fi } install_mysql_my(){ cat /etc/profile.d/mysql.sh source /etc/profile.d/mysql.sh mysqld --initialize --user=mysql --datadir=/data/mysql &>/dev/null cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld service mysqld start && action "服务启动完成" || action "服务启动失败" false mysql_set_passwd fi } install_mysql_wget install_mysql_user install_mysql_datadir install_mysql

2.9 源码编译安装 MySQL 5.6

建议:内存 4G 以上,CPU 核数越多越好

2.9.1 安装相关依赖包

yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel perl-Data-Dumper

2.9.2 做准备用户和数据目录

useradd -r -s /sbin/nologin -d /data/mysql mysql

2.9.3 准备数据库目录

mkdir /data/mysql chown mysql.mysql /data/mysql

2.9.4 源码编译安装

编译安装说明

利用 cmake 编译,而利用传统方法,cmake 的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译

编译选项:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

2.9.4.1 下载并解压缩源码包

2.9.4.2 源码编译安装 mariadb

cmake . -DCMAKE_INSTALL_PREFIX=/apps/mysql -DMYSQL_DATADIR=/data/mysql/ -DSYSCONFDIR=/etc/ -DMYSQL_USER=mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITHOUT_MROONGA_STORAGE_ENGINE=1 -DWITH_DEBUG=0 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DENABLED_LOCAL_INFILE=1 -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci [21:17:56 root@centos7 mysql-5.6.49]#make [21:20:36 root@centos7 mysql-5.6.49]#make install

提示:如果出错,执行 rm -f CMakeCache.txt

2.9.5 准备环境变量

[21:22:01 root@centos7 mysql-5.6.49]#echo 'PATH=/apps/mysql/bin:$PATH' >/etc/profile.d/mysql.sh [21:22:08 root@centos7 mysql-5.6.49]#source /etc/profile.d/mysql.sh

2.9.6 生成数据库文件

[21:22:29 root@centos7 mysql]#scripts/mysql_install_db --datadir=/data/mysql --user=mysql

2.9.7 准备配置文件

[21:23:44 root@centos7 mysql]#cp -b /apps/mysql/support-files/my-default.cnf /etc/my.cnf

2.9.8 准备启动脚本,并启动服务

[21:24:46 root@centos7 mysql]#cp /apps/mysql/support-files/mysql.server /etc/init.d/mysqld [21:25:18 root@centos7 mysql]#chkconfig --add mysqld [21:25:30 root@centos7 mysql]#service mysqld start Starting MySQL.Logging to '/data/mysql/centos7.err'. . SUCCESS!

2.9.9 安全初始化

[21:26:52 root@centos7 mysql]#mysql_secure_installation

2.10 基于 dockcer 容器创建 MySQL

范例:

[14:39:24 root@centos7 ~]#docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

2.11 MySQL 多实例

2.11.1 多实例介绍

  • 什么是数据库多实例

    • MySQL 多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306、3307 等),同时运行多个 MySQL 服务进程,这些服务进程通过不同的 Socket 监听不同的服务端口来提供服务。多实例可能是 MySQL 的不同版本,也可能是 MySQL 的同一版本实现
  • 多实例的好处

    • 可有效利用服务器资源。当单个服务器资源有剩余时,可以充分利用剩余资源提供更多的服务,且可以实现资源的逻辑隔离节约服务器资源。例如公司服务器资源紧张,但是数据库又需要各自尽量独立的提供服务,并且还需要到主从复制等技术,多实例就是最佳选择
  • 多实例弊端

    • 存在资源互相抢占的问题。比如:当某个数据库实例并发很高或者 SQL 查询慢时,整个实例会消耗大量的 CPU、磁盘 I/O 等资源,导致服务器上面其他的数据库实例在提供服务的质量也会下降,所以具体的需求要根据自己的实际情况而定。

2.11.2 实战案例 1: CentOS 8 实现 MySQL 8.0 二进制安装的多实例

本案例适用于以版本

mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz

实战目标

CentOS8 二进制安装MySQL8.0,并实现三个实例

环境说明

一台系统CentOS 8.X主机

前提准备

关闭SElinux 关闭防火墙 时间同步

2.11.2.1 实现步骤

下载 MySQL 二进制文件并解压缩

[14:48:49 root@centos8 ~]##wget http://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.23-linux-glibc2.12-x86_64.tar [14:49:55 root@centos8 ~]#tar -xvf mysql-8.0.21-linux-glibc2.12-x86_64.tar -C /usr/local/ [14:50:06 root@centos8 ~]#cd /usr/local/ [14:50:11 root@centos8 local]#ln -sv mysql-8.0.21-linux-glibc2.12-x86_64 mysql [14:50:46 root@centos8 local]#ll mysql/ total 408 drwxr-xr-x 2 7161 31415 4096 Jun 17 2020 bin drwxr-xr-x 2 7161 31415 55 Jun 17 2020 docs drwxr-xr-x 3 7161 31415 282 Jun 17 2020 include drwxr-xr-x 6 7161 31415 201 Jun 17 2020 lib -rw-r--r-- 1 7161 31415 404759 Jun 17 2020 LICENSE drwxr-xr-x 4 7161 31415 30 Jun 17 2020 man -rw-r--r-- 1 7161 31415 687 Jun 17 2020 README drwxr-xr-x 28 7161 31415 4096 Jun 17 2020 share drwxr-xr-x 2 7161 31415 77 Jun 17 2020 support-files

创建用户和组配置权限

[14:50:58 root@centos8 local]#useradd -r -s /sbin/nologin mysql [14:51:45 root@centos8 local]#chown -R mysql: /usr/local/mysql/ [14:52:17 root@centos8 local]#ll /usr/local/mysql/ total 408 drwxr-xr-x 2 mysql mysql 4096 Jun 17 2020 bin drwxr-xr-x 2 mysql mysql 55 Jun 17 2020 docs drwxr-xr-x 3 mysql mysql 282 Jun 17 2020 include drwxr-xr-x 6 mysql mysql 201 Jun 17 2020 lib -rw-r--r-- 1 mysql mysql 404759 Jun 17 2020 LICENSE drwxr-xr-x 4 mysql mysql 30 Jun 17 2020 man -rw-r--r-- 1 mysql mysql 687 Jun 17 2020 README drwxr-xr-x 28 mysql mysql 4096 Jun 17 2020 share drwxr-xr-x 2 mysql mysql 77 Jun 17 2020 support-files

配置环境变量

[14:52:29 root@centos8 local]#echo 'export PATH=/usr/local/mysql/bin:$PATH' >/etc/profile.d/mysql.sh [14:53:33 root@centos8 local]#. /etc/profile.d/mysql.sh

创建各实例数据存放的目录

[14:53:42 root@centos8 local]#mkdir -p /mysql/{3306,3307,3308} [14:54:46 root@centos8 local]#chown -R mysql: /mysql/ [14:55:13 root@centos8 local]#ll /mysql/ total 0 drwxr-xr-x 2 mysql mysql 6 Jan 30 14:54 3306 drwxr-xr-x 2 mysql mysql 6 Jan 30 14:54 3307 drwxr-xr-x 2 mysql mysql 6 Jan 30 14:54 3308 [14:55:18 root@centos8 local]#tree /mysql/ /mysql/ ├── 3306 ├── 3307 └── 3308

初始化各实例数据库文件

#针对每个实例初始化 [14:55:22 root@centos8 local]#mysqld --initialize-insecure --user=mysql --datadir=/mysql/3306 [14:56:34 root@centos8 local]#mysqld --initialize-insecure --user=mysql --datadir=/mysql/3307 [14:56:46 root@centos8 local]#mysqld --initialize-insecure --user=mysql --datadir=/mysql/3308 [14:57:38 root@centos8 local]#tree /mysql/ -d /mysql/ ├── 3306 │ ├── #innodb_temp │ ├── mysql │ ├── performance_schema │ └── sys ├── 3307 │ ├── #innodb_temp │ ├── mysql │ ├── performance_schema │ └── sys └── 3308 ├── #innodb_temp ├── mysql ├── performance_schema └── sys

准备配置文件/etc/my.cnf

[14:57:50 root@centos8 local]#file `which mysqld_multi` /usr/local/mysql/bin/mysqld_multi: Perl script text executable [14:59:17 root@centos8 local]#vim /etc/my.cnf [mysqld_multi] mysqld=/usr/local/mysql/bin/mysqld_safe mysqladmin=/usr/local/mysql/bin/mysqladmin [mysqld3306] datadir=/mysql/3306 port=3306 socket=/mysql/3306/mysql3306.sock pid-file=/mysql/3306/mysql3306.pid log-error=/mysql/3306/mysql3306.log [mysqld3307] datadir=/mysql/3307 port=3307 socket=/mysql/3307/mysql3307.sock pid-file=/mysql/3307/mysql3307.pid log-error=/mysql/3307/mysql3307.log [mysqld3308] datadir=/mysql/3308 port=3308 socket=/mysql/3308/mysql3308.sock pid-file=/mysql/3308/mysql3308.pid log-error=/mysql/3308/mysql3308.log

启动多实例

#说明:用 mysqld_multi start N 启动多个实例, #注意数字N和my.cnf中的[mysqldN]对应,示例:1-3就是启动[mysqld1]、[mysqld2]、[mysqld3]配置段的MySQL实例 #启动三个MySQL实例 [root@centos8 ~]#mysqld_multi start 3306 [root@centos8 ~]#mysqld_multi start 3307 [root@centos8 ~]#mysqld_multi start 3308 # 或者用下面命令批量启动多个实例 [15:25:47 root@centos8 ~]#mysqld_multi start 3306-3308 [15:24:45 root@centos8 ~]#ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:111 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 70 *:33060 *:* LISTEN 0 128 *:3306 *:* LISTEN 0 128 *:3307 *:* LISTEN 0 128 *:3308 *:* LISTEN 0 128 [::]:111 [::]:* LISTEN 0 128 [::]:22 [::]:*

关闭多实例

[15:25:47 root@centos8 ~]#mysqld_multi stop 3306-3308

安全加固

#批量修改多个实例root密码 [15:28:43 root@centos8 ~]#for i in {3306..3308};do mysqladmin -S /mysql/$i/mysql$i.sock password 123456;done #批量验证密码连接 [15:28:46 root@centos8 ~]#for i in {3306..3308};do mysqladmin -uroot -p123456 -S /mysql/$i/mysql$i.sock ping;done

配置开机启动多实例

[15:29:46 root@centos8 ~]#vim /etc/rc.d/rc.local . /etc/profile.d/mysql.sh mysqld_multi start 3306-3308 [15:31:18 root@centos8 ~]#chmod +x /etc/rc.d/rc.local rc.local文件中首行必须有shebang机制才可以生效 #!/bin/bash

2.12.3 实战案例 2:CentOS 8 实现 mariadb 的 yum 安装的多实例

实战目的

CentOS 8 yum安装mariadb-10.3.17并实现三个实例

环境要求

一台系统CentOS 8.X主机

前提准备

关闭SElinux 关闭防火墙 时间同步

2.12.3.1 实现步骤

安装 mariadb

[10:27:54 root@centos8 ~]#yum install -y mariadb-server

准备三个实例的目录

[10:27:54 root@centos8 ~]#mkdir -pv /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid} [10:28:29 root@centos8 ~]#chown -R mysql:mysql /mysql [10:28:35 root@centos8 ~]#tree /mysql/ /mysql/ ├── 3306 │ ├── bin │ ├── data │ ├── etc │ ├── log │ ├── pid │ └── socket ├── 3307 │ ├── bin │ ├── data │ ├── etc │ ├── log │ ├── pid │ └── socket └── 3308 ├── bin ├── data ├── etc ├── log ├── pid └── socket 21 directories, 0 files

生成数据库文件

[10:30:21 root@centos8 ~]#mysql_install_db --user=mysql --datadir=/mysql/3306/data [10:30:21 root@centos8 ~]#mysql_install_db --user=mysql --datadir=/mysql/3307/data [10:30:21 root@centos8 ~]#mysql_install_db --user=mysql --datadir=/mysql/3308/data

准备配置文件

[10:30:28 root@centos8 ~]#vim /mysql/3306/etc/my.cnf [mysqld] port=3306 datadir=/mysql/3306/data socket=/mysql/3306/socket/mysql.sock log-error=/mysql/3306/log/mysql.log pid-file=/mysql/3306/pid/mysql.pid #重复上面步骤设置3307,3308 [10:34:49 root@centos8 ~]#sed 's/3306/3307/' /mysql/3306/etc/my.cnf >/mysql/3307/etc/my.cnf [10:35:01 root@centos8 ~]#sed 's/3306/3308/' /mysql/3306/etc/my.cnf >/mysql/3308/etc/my.cnf

准备启动脚本

[10:58:36 root@centos8 ~]#vim /mysql/3306/bin/mysqld #!/bin/bash port=3306 mysql_user="root" mysql_pwd="123456" cmd_path="/usr/bin" mysql_basedir="/mysql" mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock" function_start_mysql(){ if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &>/dev/null & else printf "MySQL is running...\n" exit fi } function_stop_mysql(){ if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit else printf "Stoping MySQL...\n" ${cmd_path}/mysqladmin -u${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown fi } function_restart_mysql(){ printf "Restarting MySQL...\n" function_stop_mysql sleep 2 function_start_mysql } case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage:${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n" esac [10:59:22 root@centos8 ~]#chmod +x /mysql/3306/bin/mysqld #重复上述过程,分别建立3307,3308的启动脚本

启动服务

[11:06:50 root@centos8 ~]#/mysql/3306/bin/mysqld start [11:06:50 root@centos8 ~]#/mysql/3307/bin/mysqld start [11:06:50 root@centos8 ~]#/mysql/3308/bin/mysqld start [11:06:50 root@centos8 ~]#ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:111 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 80 *:3306 *:* LISTEN 0 80 *:3307 *:* LISTEN 0 80 *:3308 *:* LISTEN 0 128 [::]:111 [::]:* LISTEN 0 128 2.8.3.4.7 登录实例 [::]:22 [::]:*

登录实例

[11:07:51 root@centos8 ~]#mysql -h 127.0.0.1 -P 3308 确认登录的端口 MariaDB [(none)]> show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 3308 | +---------------+-------+ 1 row in set (0.001 sec) #关闭数据库,需要手动输入root的密码请吧stop中的-p后面的变量删除 [11:09:53 root@centos8 ~]#/mysql/3308/bin/mysqld stop Stoping MySQL... Enter password:

修改 root 密码

#加上root的口令 [11:12:18 root@centos8 ~]#mysqladmin -uroot -S /mysql/3306/socket/mysql.sock password 123456 [11:12:18 root@centos8 ~]#mysqladmin -uroot -S /mysql/3307/socket/mysql.sock password 123456 [11:12:18 root@centos8 ~]#mysqladmin -uroot -S /mysql/3308/socket/mysql.sock password 123456 #或者登录mysql,执行下面也可以 Mariadb>update mysql.user set password=password("centos") where user='root'; Mariadb>flush privileges;

测试连接

[11:12:40 root@centos8 ~]#mysql -uroot -p -S /mysql/3306/socket/mysql.sock Enter password: #提示输入口令才能登录
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...