前言
【杏仁】写在前面的话(总目录)
有缘人:
您好!
首先,请原谅我把模块化思维用到写文章上,前言部分独立抽离出来写了篇文章,这样【杏仁】系列的文章就可以重复引用了。
偷懒,始终是程序员最棒的优点。
偷懒,是一门很高深的艺术,很容易误入歧途,请君三思而行!
整理生活
然后启程
去感受更宽广的世界
怕吗
有时候我和你一样
迷茫中不知所措
可我无时不在想
想看看这个世界
还有
有你的世界
——杏仁奶昔随笔
目录
一、关于MySQL
1.简介
2.发展史
3.题外话
二、准备工作
1.Windows系统准备工作
2.Linux系统准备工作
三、Windows安装与配置MySQL
1.安装
2.安装错误解决方案
3.修改密码解决方案
4.环境变量配置
5.图形化管理
四、Linux安装与配置MySQL
1.安装
2.安装错误解决方法
3.远程访问常见问题
五、相关拓展
1.常用数据库语句
2.数据库设计与优化
3.设置主从实现读写分离
注:菜单设置有锚点,点击可直达相关内容。【杏仁】总目录在前言部分,点击可直达
正文
一、关于MySQL[1]
1、简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
注:相关知识请点击标蓝文字,不做赘述
2、发展史
【MySQL 1.0】
1996年,MySQL 1.0版本发布。
【MySQL 3.0】
1996年10月,MySQL 3.11.1版本发布,没有2.x版本。一个月后,Linux版本出现了。此时的MySQL还非常简陋,除了在一个表上做一些Insert,Update,Delete和Select 操作,没有其他更多的功能。
后继发布的MySQL3.22版本应该是一个标志性的版本,提供了基本的SQL支持。还带有一个复杂的优化器,新版本速度很快,且非常稳定。尽管如此,它还是不支持事务、子查询、外键、存储过程和视图,只存在表级别的锁。
2001年,MySQL3.23版本发布,该版本已经支持大多数的基本的SQL 操作,而且还集成了MyISAM和InnoDB 存储引擎。
【MySQL 4.0】
2003年3月,MySQL 4.0版本发布。新增特性:除了MySQL/InnoDB组合,还有查询缓存(Query Cache),优化器的改良,客户端/服务器间的协议用SSL加密。
2004年10月,MySQL 4.1版本发布。新增子查询,空间索引支持也加到了MyISAM引擎中。Unicode支持也被实现了。客户端/服务器协议也有了大量的改动,而且支持预处理语句(prepared statement)
【MySQL 5(5.0 ~ 5.5)】
2005年10月,发布了里程碑的一个版本,MySQL 5.0,加入了游标,存储过程,触发器,视图和事务的支持。在5.0 之后的版本里,MySQL明确地表现出迈向高性能数据库的发展步伐。
2008年1月16号 Sun公司收购MySQL。
2008年11月,MySQL5.1版本发布,其中加入很多新的改进,如表分区(table data partitioning),基于行的复制(row-based replication),事件调度器(event schedular),以及基于磁盘的NDB集群系统,和让新存储引擎和其它插件轻松集成的标准化插件API,同时修复了大量的Bug。
2009年4月20,Oracle收购Sun公司,MySQL 转入Oracle 门下。
2010年04月22 发布MySQL 5.5版本, MySQLcluster 7.1。其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。由于MySQL 5.5版本被广泛使用,甚至到目前为止,Oracle公司仍然对这个版本进行着维护。
【MySQL 6(5.6)】
2011年4月,MySQL 5.6发布,作为被Oracle收购后,第一个正式发布并做了大量变更的版本(5.5版本主要是对社区开发的功能的集成),对复制模式,优化器等做了大量的变更,其中最重要的主从GTID复制模式,大大降低了MySQL高可用操作的复杂性,除此之外,由于对源代码进行了大量的调整,到2013年,5.6版本才正式GA。
【MySQL 7 (5.7)】
2013年4月,MySQL5.7版本发布。5.6版本GA后,新特性的变更,开始作为独立的5.7分支进行进一步开发,在并行控制,并行复制等方面,进行了大量的优化调整,正式GA于2015年10月份,这个版本也是稳定版本分支。
【MySQL 8】
2016年9月12日,Mysql8.0.0版本发布。Oracle决定跳过MySQL 5.x命名系列,并抛弃之前的MYSQL 6,7两个分支(从来没有对外发布的两个分支),直接进入MySQL 8版本命名,也就是MySQL 8.0版本的开发。MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载、IO 密集型工作负载、以及高竞争("hot spot"热点竞争问题)工作负载。NoSQL:MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的 ACID 合规性。支持多线程,充分利用CPU资源,支持多用户,优化的SQL查询算法,有效地提高查询速度,提供TCP/IP、ODBC和JDBC等多种数据库连接途径。提供用于管理、检查、优化数据库操作的管理工具。可以处理拥有上千万条记录的大型数据库。
3、题外话
本教程主要针对5.6和5.7版本,这两个版本还是有许多差异的,包括基础的修改数据库密码的方式也变更了,安装的时候还要注意很多东西,特别是Windows用户。目前绝大多数使用MySQL的企业都还停留在5.6版本,最近已经逐渐过度到5.7,预估未来几年,5.7还是主流,所以大家可已入手5.7,展望8.x。还是那句话,掌握其方法,关注其动态,任他升级去吧。就像Vue大神尤雨溪说:学不动是你的事,反正我就是要更新vue4.0。
技术的升级在所难免,世界瞬息万变,啃老本是不可取的,终有一天坐吃山空。
当然,讲道理,富二代惹不起,该干嘛干嘛去,这里就是探讨技术、梦想和世界。
二、准备工作[2]
1、Windows系统准备工作
①MySQL安装包:官方下载5.7.25
注:官方下载链接可能会失效,下载好就保存一份到自己电脑留着吧。当然,版本的选择你可以自由选择,教程就选择当前5.7里最新的版本
②系统修复工具DirectXRepairV3.7:玩大型游戏的朋友,应该听说过这个软件,其实这个工具就是检测系统的一下系统配置、依赖的安装情况,是整套的安装,可能有些是没用到的,不过没关系,装上就是了。(安装MySQL5.6的的朋友可以跳过这个,这个针对5.7版本的)
下载链接:(预留位,如果没补上可以自行百度)
③缺失的系统动态链接库文件包:msvcp120.dll、msvcr120.dll(这个也是针对5.7版本用的)安装的时候如果报错提示缺少这两个文件,就要下载并放到C:\Windows\System32目录下。
下载链接:(预留位,如果没补上可以自行百度)
④图形化管理软件:Navicat for MySQL、正版化Navicat Premium
下载链接:(预留位,如果没补上可以自行百度)
2、Linux系统准备工作
本文依旧使用线上服务器部署最常用的CentOS系统做演示,版本CentOS7。
①MySQL安装包:官方下载5.7.25
选择系统版本的时候要注意一下,因为用的是CentOS,所以我们选用Red Hat Enterprise Linux,俗称红帽子系统,而CentOS是属于红帽子的一个免费简约版分支,因为免费,所以服务器部署都喜欢用CentOS。
然后我要讲的安装方式是用的gz包安装方式,和JDK一样,统一用的gz这种解压后配置即可用的方式。
请认准官方安装包下载列表里,gz后缀的,其实只有两个,一个680.6M,一个28.8M,很显然了,680.6M的就是我们需要的MySQL安装包,下载就行了。
Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit), Compressed TAR Archive
(mysql-5.7.25-el7-x86_64.tar.gz)
注:虽然是官方给出的下载链接,也是有可能失效的,如果失效了,不要慌,稳住,进甲骨文的官网www.oracle.com,再找到相关的下载地址即可,甲骨文真是伟大,有木有。当然,我相信你会首选百度,去吧,皮卡丘!
三、Windows安装与配置MySQL[3]
1、安装
本机系统环境:2019LTSC企业版Win10
将下载好的mysql-5.7.25-winx64安装包,解压到你想要安装的目录。我这里是在D盘根目录下新建了一个叫Dev的文件夹,打算以后所有开发相关软件都扔这里。当然,你可以随心所欲,想装哪都行的,需要注意的是,装C盘时,有些目录会报权限问题,所以解压后如果运行报错,请记得让管理员获取全部权限。
新建my.ini文件,记得在文件夹选项开启不隐藏文件后缀。
用记事本或者其他编辑软件,修改my.ini文件内容:
[mysql]
#默认编码格式
default-character-set=utf8
[mysqld]
#端口号
port = 3306
#数据库ID,可以不加,用于数据库读写分离,数据库集群时的区分,多个数据库之间不能重复,范围1~2^32
server_id=123
#二进制日志,可以不加,这个也是数据库读写分离时要用的,传输复制同步主库表内容
log_bin=mysql-bin
#安装包的路径
basedir=D:/Dev/mysql-5.7.25-winx64
#安装包下data目录路径
datadir=D:/Dev/mysql-5.7.25-winx64/data
#允许的最大链接数
max_connections=200
#编码设置
character-set-server=utf8
#默认存储引擎
default-storage-engine=INNODB
#数据库模式
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
将上面的内容复制进my.ini文件内就行,如果你项目还没涉及到多个数据库对接,有两个配置可以缺省,当然还有其他的很多配置,有需要的话我会加上来的。建议这些都保留着吧,省事。
正式安装:
1.打开CMD运行窗口(最好是以管理员身份打开),输入以下
win+r 输入cmd 回车
2.进入D盘,输入以下
D:
3.进入安装目录下的bin目录,输入以下
cd \Dev\mysql-5.7.25-winx64\bin
4.执行安装,输入以下
mysqld.exe -install
此处大概率报错,窗口放着不管,先看下面的报错处理,直到执行上面这句代码后,显示Success
报错请查看下面的错误解决方案,直到不报错再继续往下执行
安装成功标记:5.6 的可能是显示:Service successfully installed,5.7 的就很简洁:Success
5.初始化MySQL,输入以下
mysqld.exe --initialize --user=mysql
执行这句话后,MySQL安装目录下会出现一个新的data目录,这个目录就是你以后存数据库的
CMD运行窗会打印出一串话,在最后的位置,大概是:...root@localhost:一串英文(初始密码)
6.启动MySQl服务
net start mysql
5.7后好像默认随系统自启的,如果重启后不自启,win+r 输入services.msc 回车,找到MySQl服务,右键,属性,启动类型,自动。
7.修改MySQL密码
mysql.exe -u root -p
#提示输入密码
输入步骤5打印出来的初始密码,登录成功
成功进入MySQL控制台模式,显示模式:mysql>
修改密码,输入以下,一行一句,一句一句来。如果有问题,登录时密码输入一直错,或者执行修改了,一直修改不成功,参考下面的修改密码解决方案:
#进入内置mysql表
use mysql;
#更新root用户密码(5.6版本)
update user set password=password('123456新密码') where user='root';
#更新root用户密码(5.7版本)
update user set authentication_string=password('123456新密码') where user='root';
#刷新权限
flush privileges;
#退出MySQL控制台模式
exit
#若第一次登陆账号提示修改密码
alter user 'root'@'localhost' identified by '123456新的密码';
8.再次登录,校验是否成功
mysql.exe -u root -p
#提示输入密码
输入新设置的密码,登录成功
成功进入MySQL控制台模式,显示模式:mysql>
9.设置可用IP远程访问MySQl
有没有发现,此时的数据库,本地localhost登录是可以的,但是你用本机IP去登录就会报错了,如果是部署到线上的数据库,不设置这个,那就是自己和自己玩泥巴。
#8步骤登录成功后
#进入内置mysql表
use mysql;
#修改root用户Host选项
update user set host='%' where user='root';
#如果还不行,把下面两个也改了(5.7,5.6改上面一个就行)
update user set host='%' where user='mysql.session';
update user set host='%' where user='mysql.sys';
#刷新权限
flush privileges;
#退出MySQL控制台模式
exit
2、安装错误解决方案
错误1:
首先报的错应该是缺少msvcp120.dll、msvcr120.dll,如果报缺少这两个文件,将准备工作中准备好的这两个文件复制进C:\Windows\System32目录即可,再执行4步骤安装。
错误2:
报的错应该是没有安装NET Framework...,此时可以按照提示,按步骤:
计算机 》卸载或安装程序 》启用或关闭Windows功能 》勾选NET Framework3.0或以上的版本,确定后系统会进行联网安装。
推荐处理方法:准备工作中给出的系统修复工具DirectXRepairV3.7,免安装的,解压后,执行DirectX Repair.exe,里面会有提示,修复完成,还有个加强扩展功能,如果还报错,把加强扩展勾上,然后执行修复即可。
到此,99%的错误都已经解决了。当然,还有一种报错的可能,之前安装的MySQL卸载不干净。
错误3:
卸载残留导致
计算机 》卸载或安装程序 》程序或功能 》找到所有和MySQL相关的组件,右键卸载,或者使用360软件助手,卸载相关组件。
win+r 输入regedit 回车,打开对应注册表,删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL文件夹HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL文件夹
注:如果还不行,只有祭出我们打遍天下无敌手的重装系统大法了:此处预留,【杏仁】Windows/Linux重装系统
3、修改密码解决方案
1.忘记密码的情况
win+r 输入services.msc 回车,找到MySQl服务,右键,停止服务。(停止MySQL服务的方法很多,你也可以用kill + 进程ID的方法,反正能停掉就好)
跳过登录进入MySQL方法1:
打开安装目录下的my.ini,在最后添加:
#跳过密码验证
skip-grant-tables
然后再次启动MySQL服务,执行步骤7修改密码,登录的时候要输入密码时不用输,直接回车就能进。改完密码记得把上面这句代码删掉。
跳过登录进入MySQL方法2:
执行到步骤3,mysqld.exe --skip-grant-tables
然后启动MySQL服务,即可免密码登录,再执行步骤7修改密码即可。(这个方法有可能不行,没试过,因为Linux有个类似的方法可以,而且不用修改文件,方便)
4、环境变量配置
安装的时候,想执行mysql命令必须要进安装目录下的bin目录,输入mysqld.exe才能执行,是不是很麻烦呢。那是因为没配置系统环境变量,像JDK安装篇一样,只要设置了系统环境变量,你在任何位置,打开CMD运行框后,就能直接使用mysql的命令了,例:mysqld -version 查看MySQL版本。
很简单,还是一样的配方:右键我的电脑——点击—》属性——点击—》高级系统设置——点击—》环境变量——点击—》新建
新建MYSQL_HOME(名称可以自定义),内容填入C:\Program Files\Java\jdk1.8.0_201(你的MySQL安装目录),
——点击—》确定保存——双击—》Path——点击—》新建
在Path里加记录:%MYSQL_HOME%\bin
#打开cmd查看版本
mysql --version
5、图形化管理
图形化管理软件很多,用哪个都行,个人用得比较顺手的就是Navicat for MySQL(正版收费)
现在最新版一个已经是12.x以上了,不过其实我用11.x就好
安装流程:
1.运行准备工作下载好的安装包里的.exe文件,选择安装路径,一直下一步就好。
2.正版化:使用Navicat Premium这个工具,打开PatchNavicat.exe,选中前面Navicat for MySQL安装目录下的navicat.exe,提示成功。就可以正常使用Navicat for MySQL图形化管理软件去管理你的MySQL数据库了。
四、Linux安装与配置MySQL[4]
1、安装
安装环境:CentOS 7.1810
1.传输安装包到CentOS
通过SSH软件MobaXterm将安装包mysql-5.7.25-el7-x86_64.tar.gz传输到CentOS服务器上的/usr/localhost目录。
注:传输方法请参考Linux安装JDK,稍后将此内容独立出一篇文章,讲解CentOS的安装与Linux常用指令。
2.解压安装包
解压后的目录名很长,mysql-5.7.25-el7-x86_64,所以建议执行修改目录名为mysql,方便后面的配置
#进入/usr/local目录
cd /usr/local
#解压安装包
tar -xzvf mysql-5.7.25-el7-x86_64.tar.gz
#更改安装目录名称,注意当前目录在/usr/local/,命令:mv 旧名称 新名称
mv mysql-5.7.25-el7-x86_64 mysql
3.修改全局my.cnf配置文件
当然,你可以自定义自己的my.cnf文件,和Windows的my.ini是一样的,Linux可以不手动创建而已。
#用vim编辑器打开全局my.cnf
vi /etc/my.cnf
#进入编辑模式
i
这里给出我的配置
[client]
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock
[mysql]
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock
[mysqld]
port=3306
server-id=1
log-bin=mysql-bin
binlog-format=Row
max-connections=200
character-set-server=utf8
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock
explicit_defaults_for_timestamp=true
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mysql/mysqld.log
pid-file=/var/lib/mysql/mysqld.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
当然,里面的几个目录,你根据自己的需求修改就行,特别是socket,个人觉得可以和安装目录放一起,设置用户组和权限时就可以方便一点。socket、log-error、pid-file目录都可以设置到/usr/local/mysql。
4.创建mysql组和mysql用户
其实也可以不创建,全部都是用root身份就是了,但是如果数据库是给专门的人员管理的话,你不设置用户组,他一个不小心把你其他的东西搞没了,就呵呵了。
#添加mysql用户组
groupadd mysql
#添加mysql用户
useradd -r -g mysql mysql
#修改mysql目录归属于mysql
chown -R mysql:mysql /usr/local/mysql
#以下为相关扩展指令
#查看用户组情况
cat /etc/group | grep mysql
cat /etc/passwd |grep mysql
#删除用户
userdel -r mysql
5.初始化MySQL
作用和Windows那一样的,也是会创建data文件夹什么的。这里有个坑,5.7要先装个组件。
#安装libaio组件
yum install -y libaio
#初始化MySQL
./mysqld --initialize --user=mysql
#没设置basedir和datadir时用这个
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql--datadir=/usr/local/mysql/data
是的,初始化完成后,也会打印出一个初始密码,不要清屏,后面拿来登录,然后修改密码。
6.启动MySQL服务
这里要注意,因为没配置环境变量,必须先cd进bin目录。启动小知识,必须记得安全启动,而不是直接start,保持这个习惯。
#进入mysql下的bin目录
cd /usr/local/mysql/bin
#安全启动MySQL
./mysqld_safe --user=mysql &
#这里会显示几行字,回车结束显示
回车
#查看MySQL服务是否启动
ps -ef | grep mysql
如果只显示一行
root 9262 1 0 15:18 ? 00:00:00 /bin/sh ./mysqld_safe --user=mysql
说明没启动成功
如果有什么3306字样,就是启动成功了,如下:
root 9262 1 0 15:18 ? 00:00:00 /bin/sh ./mysqld_safe --user=mysql
mysql 9496 9262 0 15:18 ? 00:00:05 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/var/log/mysql/mysqld.log --pid-file=/var/lib/mysql/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306
root 10209 9781 0 18:48 pts/1 00:00:00 grep --color=auto mysql
显示成功后继续下面步骤,不成功往上检查。
7.修改MySQL密码
这里的步骤和Windows的差不多,都是登录MySQL控制台后,执行修改root用户的密码,请参考Windows的配置,不再赘述,这里只罗列特殊的事项。
⑴第一次修改密码
用步骤5初始化成功后打印出来的密码登录
#进入mysql下的bin目录
cd /usr/local/mysql/bin
#登录
./mysql -u root -p
#提示输入密码
******(输入初始化打印出来的密码)
#登录成功,不成功的话多试几次,建议直接复制打印出来的密码,而不是手输,再不成功用下面的修改密码方法
#第一次设置密码
alter user 'root'@'localhost' identified by '123456(新密码)'
#刷新权限
flush privileges;
#退出MySQL控制台
exit
⑵忘记原密码,跳过权限修改密码
关闭MySQL服务的情况下
#查看MySQL服务是否启动
ps -ef | grep mysql
#如果已经启动,控制台会输出带有程序ID的数字,通过这个程序ID可以强行关闭掉MySQL服务
kill 4568(程序ID)
#进入mysql下的bin目录
cd /usr/local/mysql/bin
#跳过密码登录的安全启动MySQL
./mysqld_safe --skip-grant-tables &
#登录
./mysql -u root -p
#输密码的位置不用输,直接回车,成功进入MySQl控制台
#更新root用户密码(5.6版本)
update user set password=password('123456新密码') where user='root';
#更新root用户密码(5.7版本)
update user set authentication_string=password('123456新密码') where user='root';
#刷新权限
flush privileges;
#退出MySQL控制台模式
exit
8.再次登录,校验是否成功
#mysql/bin目录下
./mysql -u root -p
#提示输入密码
输入新设置的密码,登录成功
成功进入MySQL控制台模式,显示模式:mysql>
9.设置可用IP远程访问MySQL
#8步骤登录成功后
#进入内置mysql表
use mysql;
#修改root用户Host选项
update user set host='%' where user='root';
#如果还不行,把下面两个也改了(5.7,5.6改上面一个就行)
update user set host='%' where user='mysql.session';
update user set host='%' where user='mysql.sys';
#刷新权限
flush privileges;
#退出MySQL控制台模式
exit
2、安装错误解决方法
3、远程访问常见问题
1.检查步骤9的设置
2.防火墙打开端口号3306
#Centos7 防火墙打开端口号
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重启防火墙
firewall-cmd --reload
#查看开放了什么端口
firewall-cmd --list-ports
#永久停止防火墙
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service
#查看防火墙状态
firewall-cmd --state
五、相关拓展[5]
1.常用数据库语句
基础类
create database name; 创建数据库
use databasename; 选择数据库
drop database name 直接删除数据库,不提醒
show tables; 显示表
describe tablename; 表的详细描述
select 中加上distinct去除重复字段
mysqladmin drop databasename 删除数据库前,有提示。
select version(),current_date;显示当前mysql版本和当前日期
mysql > alter table t1 rename t2; 重命名表
shell> mysqldump -h host -u root -p dbname >dbname_backup.sql 备份数据库
shell> mysqladmin -h myhost -u root -p create dbname
shell> mysqldump -h host -u root -p dbname < dbname_backup.sql 恢复数据库
2.数据库设计与优化
预留占位链接
3.设置主从实现读写分离
预留占位链接
作者 @杏仁奶昔
2019 年 02月 24日