本文档系统性地介绍了MySQL数据库的核心知识体系,涵盖数据库基本概念、分类对比、安装部署、多版本管理、用户权限配置、连接管理以及SQL语言基础。内容从理论概述到实践操作,详细讲解了二进制安装、多实例部署、版本升级策略、权限安全管理等关键运维技能,并深入解析了DDL、DCL、DML等SQL语言类型及元数据管理方法。文档适用于数据库初学者、运维工程师及开发人员,旨在提供一套完整的MySQL学习与实践参考。
一、概述
1.什么是数据库?
数据库是一个存放企业核心数据(钱、游戏装备、订单、用户),使其存取高效以及存储安全的软件。
数据库(database DB),是一种存储数据的仓库,在实际应用过程具有如下特征:
数据库是根据数据结构组织、存储和管理数据的; 数据库能够长期、高效的管理和存储数据; 数据库的目的就是能够存储(写)和提供(读)数据
2.数据库分类
2.1 关系型数据库
2.1.1 概述
把复杂的数据结构归结为简单的二元关系,即二维表格形式(二维表);会注重数据存储的持久性,但存储效率低;
此类性数据库服务,类似于excel表格的存储数据方式,多采用SQL语言方式进行操作管理;
2.1.2 关系型数据库四层结构信息
序号 数据库结构 描述说明 01 数据库管理系统(DBMS) 进行数据存储应用管理的操作环境或命令 02 数据库(DB) 数据存储的承载环境 03 数据表(Table) 数据关系的构建环境 04 数据字段(Field) 实际数据信息展现形式
2.1.3 常见的关系数据库
序号 数据库程序 应用说明 01 MySQL 互联网公司应用最广泛 02 Mariadb 企业场景应用较少(20%),主要用于教学环境较多 03 Oracle 传统企业和部分国企应用较多,但也逐步被国产数据库替代
说明:关系型数据库的极致追求:数据存储的安全性,但是在某种程度会损失数据存储和读取的性能。
2.2 非关系型数据库
2.2.1 概述
没有具体模型的数据结构,英文简称NoSQL(Not Only SQL),意为"不仅仅是SQL",比较注重数据读取的效率;
2.2.2 常见的非关系数据库
序号 数据库程序 应用说明 01 Redis 可以利用内存存储数据,也可以采用磁盘存储数据,数据常见展示形式为key-value形式 02 Mongodb 属于面向文档数据存储的数据库 03 ES 主要用于做日志数据的收集与检索的数据库(ELK ELFK)
说明:非关系型数据库的极致追求:数据存储的高效性,但是在某种程序会牺牲数据存储的安全性。
2.3 企业新型数据库
2.3.1 概述
属于近些年,由国人研发设计出的数据库服务,可以满足很多国内高并发量网站数据存储和读取业务的需求;
2.3.2 常见的新型数据库
序号 数据库程序 应用说明 01 TiDB 开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理的融合型分布式数据库产品 02 OceanBase 是由蚂蚁集团完全自主研发的国产原生分布式数据库,兼顾分布式架构的扩展性与集中式架构的性能优势 03 PolarXDB 是由阿里巴巴自主研发的云原生分布式数据库,是一款基于云架构理念分布式数据库产品,专注海量数据处理 04 RDS/TDSQL 阿里云/腾讯云平台基于SaaS云计算服务环境构建的数据库产品
3.数据库排行耪
3.1 中国数据库排行榜
https://www.modb.pro/dbRank
3.2 全球数据库排行榜
DB-Engines Ranking - popularity ranking of database management systems
4.MySQL数据库优势
MySQL数据库服务性能卓越,服务稳定,很少出现异常宕机的情况; MySQL数据库服务是开放源代码且无版权制约,自主性强,且使用成本低; MySQL数据库服务使用历史悠久,社区及用户非常活跃,遇到问题可以获取大量帮助; MySQL数据库服务软件体积小,安装使用简单,并且易于维护管理,安装及维护成本低; MySQL数据库服务业界口碑好,使得企业无需考虑就能直接使用; MySQL数据库服务架构应用广泛,可以用于构建LAMP LNMP LNMT等流行web架构; MySQL数据库服务支持多种操作系统,提供多种API接口,支持多种开发语言利用驱动接口调用;
5.MySQL数据库版本分析
5.6 : 5.6.40 + 双数版,经典版,官方即将停止更新,当下最新5.6.51
5.7 : 5.7.22/30 + 双数版,主流,逐步过渡到8.0,当下最新5.7.39
8.0 : 8.0.30 + 双数版,开始评测,小规模边缘业务数据库使用,当下最新8.0.31
当下互联网企业MySQL5.6正逐步淘汰, 5.7为绝对主流,8.0时代已到来。
二、MySQL安装部署
官网下载地址:https://downloads.mysql.com/archives/community/
1.MySQL安装方式及选择
1.1 Linux系统中常见的部署安装方式
序号 安装方式 特征说明 01 采用二进制方式安装 直接解压缩二进制程序包,进行简单的配置和初始化操作即可 02 采用rpm包方式安装 需要从官方网站下载rpm程序包,并且需要考虑系统环境的兼容性,解决软件程序包依赖 03 采用yum包方式安装 需要根据官方网站说明,配置yum下载的仓库源信息,在联网情况下进行安装部署 04 采用源码包方式安装 需要从官方网站下载源码程序包,并且需要解决程序包依赖问题,以及需要采用编译安装
1.2 采用二进制方式安装
1.2.1 下载地址
https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
1.2.2 环境准备 1)查看系统环境 [root@db01 ~]# cat /etc/redhat-release #<==操作系统版本。 CentOS Linux release 7.9.2009 (Core) 2)关闭selinux: setenforce 0 #临时关闭selinux getenforce #查看关闭selinux sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config 3)卸载mariadb依赖包 yum remove mariadb-libs -y #<==卸载系统已经安装的mariadb依赖包。 4)安装相关依赖包 yum install ncurses ncurses-devel libaio-devel openssl openssl-devel -y 5)临时及永久关闭防火墙 systemctl stop firewalld systemctl disable firewalld 复制代码
1.2.3 安装MySQL8.0.26 1)创建mysql用户 -s 表示指定用户所用的shell -M 表示不创建用户主目录 [root@db01 ~]# useradd mysql -s /sbin/nologin -M [root@db01 ~]# id mysql 2)下载、解压mysql软件包,并做好软链接mysql。 [root@db01 ~]# cd /liux/softwares/ [root@db01 softwares]# tar xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz [root@db01 softwares]# du -sh mysql-8.0.26-linux-glibc2.12-x86_64 1.5G mysql-8.0.26-linux-glibc2.12-x86_64 [root@db01 softwares]# mv mysql-8.0.26-linux-glibc2.12-x86_64/* /usr/local/mysql 3)创建MySQL数据目录、配置文件(/etc/my.cnf)并授权 [root@db01 softwares]# mkdir -p /data/3306/data [root@db01 softwares]# chown -R mysql.mysql /data [root@db01 softwares]# ls -ld /data [root@db01 softwares]# cat>/etc/my.cnf<<'EOF' [mysqld] user=mysql basedir=/usr/local/mysql datadir=/data/3306/data port=3306 socket=/tmp/mysql.sock [client] socket=/tmp/mysql.sock EOF 4)配置PATH环境变量 [root@db01 ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' >>/etc/profile [root@db01 ~]# source /etc/profile [root@db01 ~]# echo $PATH /usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 5)初始化MySQL数据库 5.7/8.0 mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data -- 安全初始化- root用户有临时密码信息(修改临时密码),如果不改临时密码,是没有数据库操作权限 mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data -- 不安全初始化,root用户没有密码 5.6 初始化方法: mysql_install_db --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/3356/data 是否看到两个 ok提示 复制代码
1.2.4 配置并启动数据库 #1.设置MySQL启动脚本 cd /usr/local/mysql/support-files/ cp mysql.server /etc/init.d/mysqld #<==拷贝mysql启动脚本到启动路径。 systemctl enable mysqld #<==等价chkconfigmysqldon(c7把服务设置开机自启动命令) #2.启动MySQL数据库 systemctl start mysqld #3.检查MySQL数据库是否启动。 netstat -lntup|grep 330 #4.查看MySQL数据库启动结果日志。 cat/data/3306/data/db01.err #5.登录数据库 mysql #6.设置密码 方法一:没有密码设置密码 mysqladmin password 'liuxing' 方法二:已有密码修改密码 -- 未登录数据库 修改密码信息 mysqladmin -uroot -pliuxing password 'liuxing666' -- 已登录数据库 修改密码信息 (8.0) alter user root@'localhost' identified by 'liuxing666'; flush privileges; 复制代码
1.2.5 MySQL安装常见故障分析及解决 问题1:初始化报错libaio [root@liuxopt]#mysqld--initialize-insecure--user=mysql\ --basedir=/usr/local/mysql--datadir=/data/3306/data mysqld:errorwhileloadingsharedlibraries:libaio.so.1:cannotopen sharedobjectfile:Nosuchfileordirectory 原因:缺少libaio-devel依赖包 解决:yuminstalllibaio-devel-y 如果不知道包名,可以执行yumprovideslibaio-y查. 问题2:初始化报错数据文件目录不为空 2021-11-09T04:08:57.631792Z0[ERROR][MY-010457][Server]--initialize specifiedbutthedatadirectoryhasfilesinit.Aborting. 2021-10-09T04:08:57.631803Z0[ERROR][MY-013236][Server]Thedesignated datadirectory/data/3306/data/isunusable.Youcanremoveallfilesthat theserveraddedtoit. 解决:rm-rf/data/3306/data/* 问题3:启动后初始无法登录 [root@liux~]#mysql ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(using password:NO) 原因:此问题一般都是数据库初始化问题或者数据库文件损坏以及目录权限问题。 解决办法:删除初始化目录,然后重新初始化数据库,剩余过程不变。 rm -rf/data/3306/data/* mysqld --initialize-insecure--user=mysql--basedir=/usr/local/mysql--datadir=/data/3306/data 问题4:Accessdenied问题原因: 1.数据库初始化问题 2.目录权限问题 3.系统数据库文件损坏 4.用户密码不对 5.授权的主机范围不对. 复制代码
1.2.6 无法启动数据库排错流程 1)需要关注错误日志文件 /data/3306/data/db-01.err 2) 需要关注配置文件信息 /etc/my.cnf 3) 关注数据库的数据目录 /data/3306/data 数据信息 -- 重新初始化 4)关注启动脚本文件 /etc/init.d/mysqld 大小(10576) 是否有执行权限 5)关注是否有冲突问题 是否已经有其他数据库服务启动,占用了默认数据库服务端口 3306 复制代码
2.编写数据库服务启动脚本 vim /usr/lib/systemd/system/mysql.service [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=5000 [root@db01 ~]# systemctl daemon-reload 复制代码
3.MySQL多版本安装(5.6、5.7、8.0)
3.1 上传解压软件包 #5.6 [root@db01 softwares]# tar xf mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz [root@db01 softwares]# mkdir /usr/local/mysql56 [root@db01 softwares]# mv mysql-5.6.48-linux-glibc2.12-x86_64/* /usr/local/mysql56 #5.7 [root@db01 softwares]# tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz [root@db01 softwares]# mkdir /usr/local/mysql57 [root@db01 softwares]# mv mysql-5.7.30-linux-glibc2.12-x86_64/* /usr/local/mysql57 #8.0省略 [root@db01 softwares]# tar xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz [root@db01 softwares]# mkdir /usr/local/mysql [root@db01 softwares]# mv mysql-8.0.26-linux-glibc2.12-x86_64 /usr/local/mysql 复制代码
3.2 创建数据目录以及初始化 #创建数据目录以及授权 mkdir -p /data/{3356,3357,3380}/data chown -R mysql.mysql /data #移除已有配置文件,不然初始化会报错 mv /etc/my.cnf /tmp/ #3356初始化 /usr/local/mysql56/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/3356/data/ #3357初始化 /usr/local/mysql57/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/3357/data/ #3380初始化 /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3380/data/ 复制代码
3.3 编写配置文件信息my.cnf cat >/data/3356/my.cnf <<EOF [mysqld] user=mysql basedir=/usr/local/mysql56 datadir=/data/3356/data socket=/tmp/mysql3356.sock port=3356 EOF cat >/data/3357/my.cnf <<EOF [mysqld] user=mysql basedir=/usr/local/mysql57 datadir=/data/3357/data socket=/tmp/mysql3357.sock port=3357 EOF cat >/data/3380/my.cnf <<EOF [mysqld] user=mysql basedir=/usr/local/mysql datadir=/data/3380/data socket=/tmp/mysql3380.sock port=3380 EOF 复制代码
3.4 启动数据库服务程序 1.编写systemctl配置文件 # 数据库服务多实例启动文件信息:5.6 cat >/etc/systemd/system/mysqld3356.service<<EOF [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql56/bin/mysqld --defaults-file=/data/3356/my.cnf LimitNOFILE=5000 EOF # 数据库服务多实例启动文件信息:5.7 cat >/etc/systemd/system/mysqld3357.service<<EOF [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql57/bin/mysqld --defaults-file=/data/3357/my.cnf LimitNOFILE=5000 EOF # 数据库服务多实例启动文件信息:8.0 cat >/etc/systemd/system/mysqld3380.service<<EOF [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3380/my.cnf LimitNOFILE=5000 EOF 2.重载配置、启动服务 systemctl daemon-reload systemctl start mysqld3356.service systemctl start mysqld3357.service systemctl start mysqld3380.service 3.登录数据库验证版本信息 [root@db01 ~]# mysql -S /tmp/mysql3356.sock [root@db01 ~]# mp/mysql3357.sock [root@db01 ~]# mysql -S /tmp/mysql3380.sock 复制代码
三、数据库基础管理
1.数据库用户管理
1.1 用户基础操作命令 1)创建用户blog,以远程方式登录数据库 create user blog@'10.0.0.%' identified by '12366'; grant all on *.* to blog@'%'; #给blog用户赋权 用户名@’10.0.0.0/255.255.255.0’ 用户名@’10.0.0.0/24’ 用户名@’10.0.0.%’ % 任意 == * 通配符 用户名@’%’ 允许所有主机连接 0.0.0.0 2)创建用户blog,只能以本地方式登录数据库 create user blog@'localhost' identified by '12366'; 用户名@’localhost’ 用户名@’127.0.0.1’ 3)查看用户 --查看所有用户信息 select user,host,authentication_string from mysql.user\G; --查看当前登录用户信息 select user(); 4)修改用户密码 alter user blog@'%' identified by '123456'; flush privileges; 5)锁定用户/解锁 alter user blog@'localhost' account lock; alter user blog@'localhost' account unlock; 复制代码
1.2 用户密码忘记重置密码 1.重新启动数据库服务 --授权表 user db tables_priv -- 跳过授权表(数据库启动不要加载授权表) --禁止远程用户登录 -- tcp 地址 3306 (数据库服务启动不要有监听端口) [root@db01 ~]# mysqld --help --verbose |grep skip-grant [root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking & 2.重置用户密码信息 flush privileges; alter user root@'localhost' identified by '123456'; 3.杀掉数据库进程,重新正常启动数据库 pkill mysql /etc/init.d/mysqld start 复制代码
2.数据库权限管理
2.1 查看权限信息 -- 查看所有权限信息 MySQL> show privileges; -- 查看指定用户权限信息 MySQL> show grants for blog@'%'; 复制代码
说明:all privileges(all)包含查看的所有权限信息,但是唯独缺了Grant option,不能授权用户,此权限只能给root@local用户
2.2 常见的授权表
序号 授权表名称 解释说明 01 user 主要用于存储用户、主机域、密码、加密插件等信息,同时还存储了*.*级别的权限(全局权限) 02 db 主要用于存储用户、主机域等信息,同时还存储了单库级别的权限(某个库权限) 03 tables_priv 主要用于存储用户、主机域等信息,同时还存储了单表级别的权限(某个表权限)
2.3 设置数据库用户授权 进行用户授权操作: MySQL> grant all on * . * to blog@'10.0.0.%'; 授权 权限 库信息 表信息 用户 主机域 进行用户权限回收: MySQL> revoke delete on * . * from blog@'10.0.0.%'; 回收 权限 库信息 表信息 用户 主机域 -- 1.表示对所有的数据库和所有的表进行授权 MySQL> grant all on *.* grant all on * . * to liux@'10.0.0.%'; grant Insert,Delete,Update,Select on * . * to liux@'10.0.0.%'; #查看授权信息 show grants for liux@'10.0.0.%'; -- 2.表示对指定的数据库中所有的表进行授权 MySQL> grant all on liux.* -- 3.表示对指定的数据库中指定的表进行授权 MySQL> grant all on liux.t1 企业生产库表授权一定要更小,最小的授权最大的安全,给业务用户常规授权,包含对内容的增删改查; # 生产常规授权实践 MySQL> create database bbs; -- 创建数据库操作 MySQL> create user bbs@'10.0.0.%' identified by '123'; -- 创建管理数据库用户 MySQL> grant insert,select,update,delete on bbs.* to bbs@'10.0.0.%'; -- 进行管理用户授权 # 授权等价于root管理用户 MySQL> grant all on *.* to liux@'localhost' identified by '123' with grant option; MySQL> flush privileges; 复制代码
2.4 角色权限设置(8.0新特性)
# 指定用户操作特定数据库时,具有共性相同的权限:分为运维权限(rw) 分为开发权限(ro) 1.查看role创建的方法 mysql>help create role; ... CREATE ROLE 'admin', 'developer'; CREATE ROLE 'webapp'@'localhost'; #创建role信息的语句结构信息,不加@信息表示角色白名单为%方式,实际还要根据具体用户定义 2.创建两个不同的role信息 mysql> create role liux_rw,liux_ro; 给角色liux_rw添加权限: liux.* rw(select,update,insert,delete) 给角色liux_ro添加权限: liux.* r(select) 3.进行role权限信息设定 #给liux_ro角色赋予查询权限 mysql> grant select on liux.* to liux_ro; #给liux_ro角色赋予查询权限 mysql> grant select,update,insert,delete on liux.* to liux_rw; 4.将指定role信息与相应的用户信息进行捆绑 mysql> create user user01@'%' identified by '123'; mysql> create user user02@'%' identified by '123'; #角色与用户绑定 mysql> grant liux_ro to user01@'%'; mysql> grant liux_rw to user02@'%'; 5.角色信息激活 # 方式一:手动激活角色 mysql> set default role all to user01@'%'; mysql> set default role all to user02@'%'; mysql> select current_role(); +----------------+ | current_role() | +----------------+ | `liux_ro`@`%` | +----------------+ #方式二:实现自动激活用户角色信息 mysql > set global activate_all_roles_on_login=on; [root@db-01 ~]# mysql -uuser01 -p123 -h10.0.0.51 mysql> select current_role(); +----------------+ | current_role() | +----------------+ | `liux_ro`@`%` | +----------------+ 6.用户操作验证 mysql> select * from liux.t1; 复制代码
3.数据库连接管理 1.利用数据库自带的客户端工具连接服务端 mysql mysqldump mysqladmin 1)方式:本地连接(利用socket连接) mysql -uroot -p123456 -S /tmp/mysql.sock 2)方式:远程连接 (利用tcp/ip协议通讯) mysql -uroot -p123 -h10.0.0.51 -P3307 2.利用第三方软件工具连接 sqlyog navicat workbench-*(免费) dbeaver:https://dbeaver.io/download/ 补充:8.0和5.7之前的版本 数据库密码加密方式变化了 密码加密方式变换了,为什么导致连接不上数据库 客户端(数据包 用户名 密码123(加密-原始 abc)) --- 网络 -- 服务端(用户 密码 123(新的 - sfd)) 方式一:修改客户端加密方式 方式二:修改服务端加密方式 * 查看服务端加密方式: show variables like '%auth%'; mysql> show variables like '%auth%'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | caching_sha2_password | +-------------------------------+-----------------------+ caching_sha2_password -- 新版密码加密方式 mysql_native_password -- 旧版密码加密方式 方式一:针对用户调整 create user root@'%' identified with mysql_native_password by '123'; 方式二:全局调整: set global default_authentication_plugin='mysql_native_password'; --- 数据库中有些变量配置信息是只读的,不能在数据库中进行set修改 配置文件中修改: vi /etc/my.cnf [mysqld] default_authentication_plugin=mysql_native_password -- 重启数据库服务 mysql> show variables like '%auth%'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | mysql_native_password | +-------------------------------+-----------------------+ 3.利用程序代码连接数据库 复制代码
4.数据库多实例管理
4.1 MySQL多实例概述
一般在一个系统环境中,可以运行多个相同的服务程序信息,并且产生不同的进程和网络端口信息,就可以称为多实例。
在一台服务器上同时开启多个不同的服务端口(如:3306/3307),同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。
在数据库服务运行过程中,也可以启动多个数据库服务程序,产生多个数据库服务进程和不同的服务端口,形成多实例;
多个数据库服务实例信息中存储的数据库信息是相互隔离和独立的,并且利用数据库服务多实例可以实现测试与分布式架构需求;
4.2 多实例环境部署 1.创建数据库多实例所需目录以及授权 mkdir -p /data/330{7..8}/data chown -R mysql.mysql /data/* 2.多实例初始化配置前调整操作 mv /etc/my.cnf /tmp 3. 多实例初始化操作过程 mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data #初始化完毕后可以检查数据库目录中,是否已经存在了数据库初始化产生的数据文件信息; 4.多实例配置文件编写 cat >/data/3307/data/my.cnf<<EOF [mysql] socket=/tmp/mysql3307.sock [mysqld] user=mysql port=3307 basedir=/usr/local/mysql datadir=/data/3307/data socket=/tmp/mysql3307.sock EOF cat >/data/3308/data/my.cnf<<EOF [mysql] socket=/tmp/mysql3308.sock [mysqld] user=mysql port=3308 basedir=/usr/local/mysql datadir=/data/3308/data socket=/tmp/mysql3308.sock EOF cat >/data/3309/data/my.cnf<<EOF [mysql] socket=/tmp/mysql3309.sock [mysqld] user=mysql port=3309 basedir=/usr/local/mysql datadir=/data/3309/data socket=/tmp/mysql3309.sock EOF 5.多实例服务运行启动 mysqld_safe --defaults-file=/data/3307/data/my.cnf & mysqld_safe --defaults-file=/data/3308/data/my.cnf & mysqld_safe --defaults-file=/data/3309/data/my.cnf & ss -lntup|grep mysqld 6.登录不同多实例 mysql -S /tmp/mysql3307.sock #<==登录3307,默认无密码。 mysql -S /tmp/mysql3308.sock #<==登录3308,默认无密码。 mysql -S /tmp/mysql3309.sock #<==登录3309,默认无密码。 7.多实例服务启动配置systemctl [root@db01 ~]# vim /etc/systemd/system/mysqld3307.service [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/data/my.cnf LimitNOFILE=5000 [root@db01 ~]# systemctl daemon-reload [root@db01 ~]# systemctl start mysqld3307.service 复制代码
5.数据库版本升级管理
5.1 升级方式
第一种方法:本地升级(数据库服务5.6-5.7-8.0) 停库 第二种方法:迁移升级(数据库服务数据迁移到另一台新的数据库服务中) 旧版数据库服务地址 10.0.0.51 网络停止 新版数据库服务地址 10.0.0.51 8.0 读取旧版中的数据
5.2 升级注意事项
数据库服务版本升级时,只支持在GA(General Availability)版本之间进行升级 数据库服务版本升级时,支持从数据库5.6到5.7再到8.0,跨版本升级,但是需要先将5.6升级到最新小版本,在进行跨版本升级 数据库服务版本升级时,需要提前考虑好版本回退的方案,最好升级前做好数据备份(特别是向8.0版本升级) 数据库服务版本升级时,制定的升级方案和升级步骤,需要尽可能降低数据库服务停机的时间 官方资料:https://dev.mysql.com/doc/refman/8.0/en/upgrade-paths.html
5.3 升级过程规划(inplace)
数据备份保存(可以采用热备和冷备两种方案,冷备是需要停止业务后备份,热备是无需停止业务备份)
最新程序安装(最新版本数据库服务安装过程时,无需停止原有数据库旧版服务)
原有程序关闭(网站显示维护页面)
最新程序启动(加载原有程序数据实现挂库升级,并采用跳过授权表和跳过网络方式启动)
升级数据结构(数据库服务升级程序后,还需要升级数据系统结构信息,因此升级时间和数据量无关)
是否正常重启(数据库服务升级完毕后,确认数据库服务是可以正常完成重启操作)
功能测试验证(反复核实验证与数据库服务相关的各项功能是否正常)
升级工作完毕(取消网站维护页面,恢复正常网站线上运营业务)
5.4 演示5.6.48 ->5.7.30 本地升级
5.4.1 数据备份 [root@db01 ~]# cd /data/ [root@db01 data]# tar zcvf 3356_backup.tar.gz ./3356/ 复制代码
5.4.2 原有程序关闭 #企业实战环境,需要添加此配置参数信息在配置文件中,实现优雅关闭数据库服务 [root@db01 local]# vim /data/3356/my.cnf innodb_fast_shutdown=0 # 关闭5.6版本 #配置文件加入以上参数后,此时关闭数据库服务,会采用优雅关闭服务,而不是采用快速关闭数据库服务方式 [root@db01 local]# systemctl stop mysqld3356 复制代码
5.4.3 最新程序启动 #修改旧版本(5.6)数据库配置文件,使用5.7版本程序目录加载原有5.6数据库中数据目录 [root@db01 local]# vim /data/3356/my.cnf [mysqld] user=mysql basedir=/usr/local/mysql57 datadir=/data/3356/data socket=/tmp/mysql3356.sock port=3356 server_id=16 innodb_fast_shutdown=0 # 启动新版本数据库程序服务 [root@db01 local]# /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3356/my.cnf --skip-grant-tables --skip-networking & #查看数据库进程信息 ps -ef|grep mysqld 复制代码
5.4.4 升级数据结构 # 实现对原有数据库(5.6)中数据信息的挂库升级操作 [root@db01 local]# /usr/local/mysql57/bin/mysql_upgrade -S /tmp/mysql3356.sock --force ...省略部分信息... Upgrade process completed successfully. Checking if update is needed. -- 显示以上信息内容,表述数据库中数据结构信息升级成功 复制代码
5.4.5 重启数据库 # 关闭升级状态的数据库服务 [root@db01 local]# /usr/local/mysql57/bin/mysqladmin -S /tmp/mysql3356.sock shutdown # 修改服务启动脚本 [root@db01local]# vim /etc/systemd/system/mysqld3356.service ExecStart=/usr/local/mysql57/bin/mysqld --defaults-file=/data/3356/my.cnf -- 修改此配置信息,将原有数据库服务启动文件中程序目录修改为新版本数据库服务程序目录 # 启动服务 [root@db01local]# systemctl daemon-reload [root@db01local]# systemctl start mysqld3356 # 检查升级完毕后是否正常启动 [root@db01local]# ps -ef|grep mysql [root@db01local]# netstat -lntp|grep mysql [root@db01local]# /usr/local/mysql57/bin/mysql -S /tmp/mysql3356.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.30 MySQL Community Server (GPL) mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.30 | +-----------+ 1 row in set (0.00 sec) 复制代码
5.5 演示5.7.30 ->8.0.26本地升级)
5.5.1 数据备份 [root@db01 ~]# cd /data/ [root@db01 data]# tar zcvf 3356_backup.tar.gz ./3356/ 复制代码
5.5.2 原有程序关闭 #企业实战环境,需要添加此配置参数信息在配置文件中,实现优雅关闭数据库服务 [root@db01 local]# vim /data/3356/my.cnf innodb_fast_shutdown=0 # 关闭5.6版本 #配置文件加入以上参数后,此时关闭数据库服务,会采用优雅关闭服务,而不是采用快速关闭数据库服务方式 [root@db01 local]# systemctl stop mysqld3356 复制代码
5.5.3 最新程序启动 #修改旧版本(5.6)数据库配置文件,使用5.7版本程序目录加载原有5.6数据库中数据目录 [root@db01 local]# vim /data/3356/my.cnf [mysqld] user=mysql basedir=/usr/local/mysql datadir=/data/3356/data socket=/tmp/mysql3356.sock port=3356 server_id=16 innodb_fast_shutdown=0 # 启动新版本数据库程序服务 mysql为80的安装目录 [root@db01 local]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/3356/my.cnf --skip-grant-tables --skip-networking & #查看数据库进程信息 ps -ef|grep mysqld 复制代码
5.5.4 升级数据结构(此步省略) 说明:在数据库版本从5.7升级到8.0时,可以省略mysql_upgrade升级改变数据结构信息操作,因为8.0版本会自动完成此步骤 复制代码
5.5.5 重启数据库 # 关闭升级状态的数据库服务 [root@db01 local]# /usr/local/mysql/bin/mysqladmin -S /tmp/mysql3356.sock shutdown # 修改服务启动脚本 [root@db01 data]# vim /etc/systemd/system/mysqld3356.service ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3356/my.cnf -- 修改此配置信息,将原有数据库服务启动文件中程序目录修改为新版本数据库服务程序目录 # 启动服务 [root@db01 data]# systemctl daemon-reload [root@db01 data]# systemctl start mysqld3356 # 检查升级完毕后是否正常启动 [root@db01 data]# ps -ef|grep mysql [root@db01 data]# netstat -lntp|grep mysql [root@db01 data]# /usr/local/mysql/bin/mysql -S /tmp/mysql3356.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.26 MySQL Community Server - GPL ... 复制代码
5.6 升级版本预检查功能
5.6.1 概述
MySQL8.0之后,提供了一个mysqlshell命令功能,利用命令功能中的特殊函数,可以在升级前对当前环境版本进行验证; 简而言之:就是数据库服务8.0之后,利用mysqlshell中的函数,可以实现数据库服务升级的预检查功能
5.6.2 部署操作 [root@db01 softwares]# tar xf mysql-shell-8.0.26-linux-glibc2.12-x86-64bit.tar.gz [root@db01 softwares]# mkdir /usr/local/mysqlsh [root@db01 softwares]# mv mysql-shell-8.0.26-linux-glibc2.12-x86-64bit/* /usr/local/mysqlsh [root@db01 softwares]# cd /usr/local/mysqlsh/bin [root@db01 ~]# systemctl start mysqld3357.service [root@db01 ~]# mysql -uroot -S /tmp/mysql3357.sock mysql> grant all on *.* to root@'%' identified by '12366'; [root@db01 bin]# ./mysqlsh root:12366@10.0.0.51:3357 -e "util.checkForServerUpgrade()" ... Errors: 0 Warnings: 1 Notices: 1 没有errors报错表示可以进行升级操作 复制代码
5.7 版本回滚(8.0->5.6)
5.7.1 编写配置文件 [root@db01 local]# vim /data/3356/my_rollback.cnf [mysqld] user=mysql basedir=/usr/local/mysql56 #升级前做的旧版本冷备数据 datadir=/data/3356_back/data socket=/tmp/mysql3356.sock port=3356 innodb_fast_shutdown=0 复制代码
5.7.2 数据库服务重新回退启动 [root@db01 local]# /usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/3356/my_rollback.cnf & # 查看数据库服务启动进程信息 [root@db01 local]# ps -ef|grep mysqld -- 此时数据库服务启动成功后,只会显示进程信息,不会显示网络端口信息 #登录查看版本信息 [root@db01 bin]# mysql -S /tmp/mysql3356.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.48 MySQL Community Server (GPL) 复制代码
5.7.3 重启数据库 # 关闭升级状态的数据库服务 [root@db01 local]# pkill mysql # 修改服务启动脚本 [root@db01 data]# vim /etc/systemd/system/mysqld3356.service ExecStart=/usr/local/mysql56/bin/mysqld --defaults-file=/data/3356/my_rollback.cnf -- 修改此配置信息,将原有数据库服务启动文件中程序目录修改为新版本数据库服务程序目录 # 启动服务 [root@db01 data]# systemctl daemon-reload [root@db01 data]# systemctl start mysqld3356 # 检查升级完毕后是否正常启动 [root@db01 data]# ps -ef|grep mysql [root@db01 data]# netstat -lntp|grep mysql [root@db01 bin]# /usr/local/mysql56/bin/mysql -S /tmp/mysql3356.sock Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.48 MySQL Community Server (GPL) ... 复制代码
四、数据库SQL基础
1.mysql中获取帮助信息 # 获取帮助信息_基本帮助信息 mysql > \h # 获取帮助信息_语句分类帮助 mysql > help contents mysql > ? contents # 获取帮助信息_具体语句帮助 mysql > ? create mysql > ? create database 复制代码
2.SQL语言类型
DDL Data Definition Language(数据定义语言)
CREATE(创建)、ALTER(修改)、DROP(删除)等; mysql> ? Data Definition; DCL Data Control Language(数据控制语言)
GRANT(用户授权)、REVOKE(权限回收)、COMMIT(提交)、ROLLBACK(回滚) mysql> ? Account Management DML Data Manipulation Language(数据操作语言) 增删改查
SELECT(查)、INSERT(增)、DELETE(删)、UPDATE(改) mysql> ? Data Manipulation
2.1 DDL
01 数据库操作语句 1.创建数据库 #创建新的数据库 mysql > create database liux; mysql > create schema liux; #创建新的数据库,并修改字符编码 mysql > create database liux character set utf8mb4; mysql > create database liux charset utf8 collate utf8_general_mysql500_ci; 2.查看数据库 #查看是否已经创建好 mysql > show databases; #查看创建库的语句信息 mysql > show create database liux; mysql > show databases like '%liux%'; 3.修改数据库 mysql > alter database test charset utf8mb4; mysql > alter database test charset utf8 collate utf8_general_mysql500_ci; 4.删除数据库 mysql > drop database test; mysql > drop schema test; 5.切换数据库 mysql > use liux Database changed mysql > select database(); 复制代码
02 数据表操作语句 1.创建表语句 CREATE TABLE student ( id int NOT NULL COMMENT '学号信息', name varchar(45) NOT NULL COMMENT '学生名', age tinyint unsigned NOT NULL COMMENT '学生年龄', gender enum('M','F','N') NOT NULL DEFAULT 'N' COMMENT '学生性别', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表' 2.查看数据表信息 mysql > show tables; mysql > desc student; mysql > show create table student; 3.删除数据表信息 #删除操作过程,会将定义的表结构和表中数据内容一并删除 mysql > drop table student; #删除操作过程,只是清空表中数据内容,但保留定义的表结构信息 mysql > truncate table student; 复制代码
3.数据库字符集 1.查看数据库可用字符集 mysql> show charset; 2.查看数据库默认字符集 mysql> show variables like "%character%"; 3.修改服务配置文件字符集 设置服务端字符集编码为utf8mb4 [root@db01 ~]# vim /etc/my.cnf [mysqld] character-set-server=utf8mb4 4.修改客户配置文件参数信息 设置客户端字符集编码为utf8mb4 [root@db01 ~]# vim /etc/my.cnf [mysql] socket=/tmp/mysql.sock default-character-set=utf8mb4 5.重启数据库 [root@db01 ~]# /etc/init.d/mysqld restart 复制代码
数据库最新8.0版本的字符集为utf8mb4,早期数据库版本字符集编码为latin1;
说明:企业生产环境中,建议客户端与服务端字符集要统一;
序号 区别说明 解释说明 01 两种字符集的字符存储量不同 utf8 最多存储3字节长度字符 张-3字节 utf8mb4 最多存储4字节长度字符(表情字符emoji) 张-4字节
4.禁止修改命令不加条件信息执行命令
服务端禁止不带where条件操作数据库表: 利用sql_safe_updates配置参数,表示在delete,update操作中,没有where条件,当where条件中列没有索引可用,且无limit限制时会拒绝更新。 # 方法1:临时执行 mysql> set global sql_safe_updates=1; # 方法2:永久生效 [root@db01 ~]# vi /etc/my.cnf [mysqld] init-file=/opt/init.sql [root@db01 ~]# echo 'set global sql_safe_updates=1;' >/opt/init.sql [root@db01 ~]# chmod +x /opt/init.sql [root@db01 ~]# /etc/init.d/mysqld restart 复制代码
# 方法一:把safe_updates=1加入到my.cnf的client标签下 [root@db01 ~]# vim /etc/my.cnf [mysql] socket=/tmp/mysql.sock safe_updates=1 # 方法2:设置数据库别名操作方式 [root@db01 ~]# alias mysql='mysql -U' -U, --safe-updates Only allow UPDATE and DELETE that uses keys -- 表示以安全更新模式登录数据库,并放入/etc/profile永久生效。 复制代码
5.解释说明drop 、delete、truncate语句之间的区别
区别分析 drop table stu; truncate table stu; delete from stu; 功能效果 删除表结构+数据 删除表数据(释放空间) 删除表数据(标记删除) 删除逻辑 彻底删除 物理删除(段区页层面删除) 逻辑删除(逐行删除) 删除效率 效率快(和数据量无关) 效率快(和数据量无关) 效率慢(和数据量有关) 自增影响 新增自增序列 重置自增序列(释放高水位线) 延续自增序列 数据恢复? 利用日志文件恢复 利用备份恢复/延时从库恢复 利用日志文件恢复(快速)
6.元数据
6.1 概念
元数据就是结构化数据,例如存储在数据库里的数据,规定了字段的长度、类型等; 元数据就是描述数据的数据,在MySQL中就是描述database的数据,属性,状态等相关信息;
表示在数据库服务中有哪些数据库,库中有哪些表,表中有多少字段,字段是什么类型等等,这样的数据就是数据库的元数据;
6.2 元数据获取方法
01 利用命令获取(show) -- 查询数据库服务中的所有数据库信息(数据库名称-元数据) mysql> show databases; -- 查询数据库服务中的相应数据表信息(数据表名称-元数据) mysql> show tables; mysql> show tables from mysql; -- 查询数据库服务中的建库语句信息 (建库语句参数-元数据 建库语句就是DDL语句,定义建立数据库的属性信息) mysql> show create database <库名>; -- 查询数据库服务中的建表语句信息 (建表语句参数-元数据 建表语句就是DDL语句,定义建立数据表的属性信息) mysql> show create table <表名>; -- 查询数据库服务中的数据表的结构(数据表的列定义信息-元数据) mysql> desc <表名>; mysql> show columns from <表名>; -- 查询数据库服务中的相应数据表状态 (数据表的状态信息/统计信息-元数据) mysql> show table status from <库名>; -- 查看数据库服务中的具体数据库表的状态信息(属于单库或单表查询) mysql> show table status from world like 'city' \G -- 查询数据库服务中的相应数据表的索引情况(了解即可) mysql> show index from world.city; -- 查询数据库服务中的用户权限属性配置信息 mysql> show grants for root@'localhost'; -- 查询数据库服务的系统状态信息,表示当前数据库的所有连接情况 mysql> show [full] processlist; -- 查询数据库服务的所有配置信息 mysql> show variables; mysql> show variables like '%xx%'; -- 查询数据库服务的系统整体状态,表示当前数据库服务运行的即时状态情况 mysql> show status; mysql> show status like '%lock%'; -- 查询数据库服务的所有二进制日志信息(binlog日志) mysql> show binary logs; -- 查询数据库服务正在使用的二进制日志 mysql> show master status; -- 查询数据库服务具体二进制日志内容事件信息 mysql> show binlog events in 'binlog.000009'; -- 查询数据库服务存储引擎相关信息 mysql> show engine innodb status \G -- 在数据库服务主库查看从库信息 mysql> show slave hosts; -- 查询数据库服务主从状态信息 mysql> show slave status; 复制代码
说明:使用show语句虽然可以快速得到相应的数据库元数据信息,但是查询功能过于单一,想查询全面信息,就需要执行多条语句;
02 利用库中视图(information_schema)
information_schema库中的内存表都是每次数据库服务启动时生成的,里面存储了查询元数据基表的视图信息;
视图概念:
将查询基表元数据语句信息方法封装在一个变量或别名中,这个封装好的变量或别名就成为视图,视图信息都是存储在内存中的表
# 切换进入information_schema数据库中查看表信息 mysql> use information_schema; mysql> show tables; -- 此时看到的所有表信息,其实都是视图信息 # 查看获取视图信息创建语句 mysql> show create view tables; -- 查看tables这个视图表的创建过程 # 查看视图表信息应用 # 统计数据库资产信息(数据资产),获取每个库中表的个数和名称信息(业务相关) mysql> desc information_schema.tables; -- 查看information_scheam中的tables表的结构信息; mysql> select table_schema,count(*),group_concat(table_name) from information_schema.tables group by table_schema; -- 获取相应数据库中表的个数,与数据库中拥有的表信息 mysql> select table_schema,count(*),group_concat(table_name) from information_schema.tables where table_schema not in ('mysql','sys','performance_schema','information_') group by table_schema; # 统计数据库资产信息(数据资产),获取每个数据库数据占用磁盘空间 mysql> select table_schema,sum(table_rows*avg_row_length+index_length)/1024/1024 from information_schema.tables where table_schema not in ('mysql','sys','performance_schema','information_') group by table_schema; # 统计数据库资产信息(数据资产),获取具有碎片信息的表 mysql> select table_schema,table_name,data_free from information_schema.tables where table_schema not in ('mysql','sys','performance_schema','information_') and data_free >0 ; -- 碎片信息过多会导致索引信息失效,以及统计信息不真实的情况 # 统计数据库资产信息(数据资产),处理具有碎片信息的表 mysql> alter table t1 engine=innodb; -- 可以对已经是innodb存储引擎的表做操作,实现整理碎片功能 mysql> select concat("alter table ",table_schema,".",table_name," engine=innodb") from information_schema.tables where table_schema not in ('mysql','sys','performance_schema','information_') and data_free >0 ; -- 可以对已经是innodb存储引擎的表做操作,实现批量整理碎片功能 # 统计数据库资产信息(数据资产),获取数据库中非innodb表信息 mysql>select table_schema,table_name,engine from information_schema.tables where table_schema not in ('mysql','sys','performance_schema','information_') and engine!='innodb'; -- 获取非innodb数据库引擎表 mysql> use school; mysql> create table t1 (id int) engine=myisam; mysql> create table t2 (id int) engine=myisam; mysql> create table t3 (id int) engine=myisam; -- 模拟创建一些myisam引擎数据表 # 统计数据库资产信息(数据资产),修改数据库中非innodb表信息替换成innodb mysql> alter table world.t1 engine=innodb; -- 可以对不是innodb存储引擎的表做操作,实现数据表引擎修改 mysql> select concat("alter table ",table_schema,".",table_name," engine=innodb") from information_schema.tables where table_schema not in ('mysql','sys','performance_schema','information_') and engine !='innodb'; mysql> select concat("alter table ",table_schema,".",table_name," engine=innodb;") from information_schema.tables where table_schema not in ('mysql','sys','performance_schema','information_') and engine!='innodb' into outfile '/tmp/alter.sql'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement vim /etc/my.cnf [mysqld] secure-file-priv=/tmp -- 修改配置文件参数信息,实现将数据库操作的数据信息导入到系统文件中,配置完毕重启数据库服务 mysql> source /tmp/alter.sql -- 可以对不是innodb存储引擎的表做操作,实现数据表批量化引擎修改,调用数据库脚本信息 复制代码
五、总结
本指南全面梳理了MySQL数据库从基础概念到高级运维的核心知识要点。关键学习路径包括:
核心概念清晰 :明确了关系型与非关系型数据库的本质区别,MySQL因其开源、稳定、社区活跃、成本低等优势,在互联网领域占据主导地位。部署能力扎实 :重点掌握了二进制安装方式,这是生产环境中最常见、最可控的部署方法。同时,通过多实例、多版本并存的部署实践,为环境隔离、测试和版本评估奠定了基础。管理技能全面 :涵盖了用户、权限、连接、多实例等日常管理任务。特别强调了安全实践,如最小权限原则、角色管理(8.0)、防止无WHERE条件更新等,是保障数据库安全稳定运行的基石。运维思维深入 :版本升级与回滚的完整演练,体现了变更管理的严谨性,包括备份、预检查、灰度验证等关键步骤。故障排错流程则提供了系统化的问题定位方法论。SQL与元数据精通 :DDL/DCL/DML的区分是操作数据库的语言基础。通过SHOW命令和information_schema库两种方式高效获取元数据,是实现自动化运维、资产管理和性能优化的重要能力。
学习建议 :MySQL的学习应遵循“理论-实践-深化”的循环。首先理解架构与核心概念,然后通过手动安装配置、SQL操作、用户权限管理等实验加深理解,最后通过研究性能优化、高可用架构(如主从复制、MHA、Group Replication)等主题进行深化。始终关注官方文档和社区动态,特别是8.0版本引入的新特性(如窗口函数、通用表表达式、角色、原子DDL等),以保持技术视野的先进性。