0-MYSQL介绍安装与运维配置

2022-09-28 14:00:29 浏览数 (1)

[TOC]

0x00 MySQL介绍与特点

MySQL数据库是一款非常受欢迎的开源领域的重要的关系型数据库,由瑞典的MySQL AB公司开发,Mysql数据库现属于ORACLE公司,使的自身的商业数据库与开源数据库在市场上占有的份额都是跃居第一的位置,这时MySQL的主要开发者Michael widenius ,跳出来建立了一个MySQL分支数据库这就是MariaDB的诞生与发展,来防止MySQL闭源的潜在危险;

MySQL属于传统关系数据库,开放式的架构使得用户选择性很强,社区开发维护人数众多,功能稳定,性能卓越,且在准寻GPL协议的前体下,可以免费的修改使用,因此也为MySQL的推广带来了更多的便利;

MySQL是一种关系型数据库管理系统(RDBMS),关系型数据库的特点是将数据保存在不同的表中,在将这些表放入不同的数据库中,而不是将所有数据统一放在一个大仓库里.这样的设计增加了 MySQL 的读取速度,灵活性可管理性也得到了很大提高 ,访问以及管理 MysQL 数据库的最常用标准化语言为 SQL 结构化杳询语言。

Q:为什么选择MySQL数据库?

  • 1-性能卓越,服务稳定,很少出现异常宕机(dang)
  • 2-开发源代码且无版权制约,自主性及使用成本低;
  • 3-历史悠久,社区活跃,遇到问题能很快解决;
  • 4-软件体积小,安装简单,并且易于维护,安装及维护成本低
  • 5-知名度高,企业非常喜欢直接用之,LAMP/LEMP流行架构;
  • 6-跨平台运行,提供各种API接口,支持多种开发语法PHP/JSP/ASP,主要是PHP语言;

(1)MySQL 数据库版本分类 MySQL的版本采用双授权政策,和大多数开源的产品一样;分为社区版与商业版本,而这两个版本又各自分为四个版本依此发布,这四个版本为 Alpha,Beta,RC,GA 等版本; 官网:https://www.mysql.com

MySQL商业版发布介绍:

代码语言:javascript复制
由 MySQL AB 公司内部专门的人员负贵开发及维护,但同时也会吸纳社区人员编写的优秀代码及算法,并且由专门的人员严格按照软件测试流程对这些采纳的代码进行严格测试,没有问题再进行发布,简单地说, MysQL 商业版是由 MySQL 公司内部发布,同时参考社区版的先进代码功能和算法,是 MysQL 公司的盈利产品,需要付费才能使用及提供服务支持,稳定性和可靠性无疑都是最好的,例如某知名分类门户网站早期就购买过 MySQL 商业版,价格不比那些闭源的商业数据库便宜花费40万左右好贵的;

MySQL社区版发布介绍:

代码语言:javascript复制
由全世界的MySQL社区开发者,爱好者以及用户参与开发与测试,并完成软件代码的管理,测试工作,社区设立了BUG汇报机制,相对于商业版来说社区版的开发以及测试环境没那么严格;

Q:商业版于社区版的区别是那些? 1)B版组织管理与测试环节控制更为严格,稳定性方面,会比社区版本稳定; 2)MySQL数据库是一个成熟的数据库产品,B/C版之间的性能相差不大; 3)B版不遵从GPL协议,C版遵守GPL协议 4)使用B版购买服务后,可享受一切的服务,但是用户必须支持费用; 5)社区版本的维护只能靠社区提供,无法像商业版那样获取故障及补丁解决服务了;

(2) MySQL 数据库四种发布版本介绍

1.Alpha 版本

代码语言:javascript复制
Alpha 版一般只在开发的公司内部运行,不对外公开,主要是开发者自己对产品进行测试,检查产品是否存在缺陷、错误,验证产品功能与说明书、用户手册是否一致; MySQL 是属于开放源代码的开源产品,因此需要世界各地开发者、爱好者和用户参与软件的开发、测试和手册编写等工作,所以会对外公布此版本的源码和产品,方便任何人可以参与开发或测试工作,甚至编写与修改用户手册;

2.Beta 版本 (阿里内部会使用这个版本发现新特性)

代码语言:javascript复制
Beta版一般是完成功能的开发和所有的测试工作之后的产品不会存在较大舀功能或性能 BUG ,并且邀请或提供给用户体验与测试,以便更全面地测试软件的不足之处或存在的问题;

3.RC 版本

代码语言:javascript复制
RC 版属于生产环境发布之前的一个小版本或称候选版,是根据 Beta 版本测试结果,收集到的 BUG 或缺陷之处等收集到的信息,进行修复和完善之后的一版产品;

4.GA 版本 (稳定版本)

代码语言:javascript复制
GA 版是软件产品正式发布的版本(生产版本的产品),环境都会选择 GA 版本的 MySQL 软件,用于真实的生产环境中,有的企业追求新功能驱动而牺牲稳定性使用其它版本;

四种发布版本选择说明: MySQL AB 官方网站提供数据库各种版本下载,主要是 MySQL 数据库属于开放源代码的数据库产品,鼓励全球的技术爱好者参与研发、测试、文档编写和经验分享,甚至包过产品发展规划,对于 Development 版本、 Alpha 版本和 Beta 版本是绝对不允许使用在任何生产环境的,肯定存在重大的问题或功能未完全实现,绝大多数情况下 RC 版本也是不允许使用在生产环境,毕竟这是一个 OA 版本之前,也即生产版本发布之前的一个小版本。 对 MySQL 数据库 GA 版本,也是需要慎重选择,开源社区产品毕竟不是经过严格的测试工序完成的产品,是全球开源技术人员的自愿完成的,会存在比商业产品稳定性弱的缺陷,更严格的选择见后文;

(3) MySQL 数据库产品线 早期MySQL也是遵循版本号逐渐增加的方式发展,例如MySQL-x-xx-xx.tar.gz,例如4.1.7 / 5.0.56 等等;

代码语言:javascript复制
Mysql-5.0.56.tar.gz;  //GA版本
Mysql-主版本号.发行级别.此发行系列版本号.tar.gz;
#每次更新后,版本字符串的最后一个数字递增,如果相对于前一个版本增加了新功能或由微小的不兼容,字符串的第二数字递增,如果文件格式发送很大的变化,则第一个数字递增;

近年来MySQL为了提高自己的产品竞争性,提高性能,降低开发维护成本等原因,MySQL在发展到5.1系列版本之后,重新规划为三条产品线;

  • 第 1 条 - 5.0.xx ~ 5.1.xx 产品线 该条产品线继续完善与改进其用户的体验和性能,同时增加新版本功能,这条线是Mysql早期产品的延续系列; Mysql 4.0 和 3.23是旧的稳定(产品质量)发布系列,该版本不再使用,新的发布只用来修复特别严重的漏洞;
  • 第 2 条- 5.4.xx ~ 5.7.xx 产品线 为了更好地整合MySQL AB 公司社区和第三方公司开发的新存储引擎,以及吸收新的实现算法等, 从而更好地支持 SMP 架构,提高性能而做了大最的代码重构。 版本编号为从 5.4.xx 开始.发展到了 5. 6.xx 该系列 5.5.6 版本占比较多;
  • 第 3 条- 6.0.xx - 8.0.xx 产品线 为了更好地推广 MysQL cluster 版本,以及提高 MySQL cluster 的性能和稳定性,以及功能改进和增加,以及改动 MySQL 墓础功能,使其对 Cluster 存储引擎提供更有效的支持与优化,版本号为 6.0.xx 开发, 现在MySQL的最高社区版本是 for the MySQL 8.0 Generally Available (GA) Release;

Q:生产环境如何选择MySQL版本?

  1. 选择社区版的稳定GA版本
  2. 可以选择5.1或5.5.互联网公司主流5.5, 其次是5.1和5.6
  3. 选择发布后6个月以上的GA版
  4. 要选择前后几个月没有打的BUG修复的版本,而不是大量修复BUG的几种版本
  5. 最好选择向后较长时间没有更新发布的版本
  6. 考虑开发人员开发程序使用的版本是否兼容你选的版本
  7. 企业非核心业务采用新版本的数据库GA版本软件
  8. 作为内部开发测试数据库环境,跑大概3-6个月时间
  9. 向DBA高手请教,或者在技术氛围好的群里和大家一起交流,使用真正高手用过的好用的GA版本产品
  10. 经过上述工序后,若没有重要的功能BUG或性能瓶颈,则可以开始考虑作为任何业务数据服务的后端数据库软件

0x01 MySQL安装

MySQL版本选择:https://dev.mysql.com/downloads/mirrors/ 应用服务器系统框架选择:i686 、 x86_64 MySQL安装的几种方式:

  • 1 RPM 包
  • 2 yum / apt 安装
  • 3 二进制方式免编译安装
  • 4 常规方式编译安装,cmake编译 (自定义设置一些参数及版本一般比较新)

安装前需要的配置:

代码语言:javascript复制
setenforce 0  #临时关闭
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config # 永久关闭selinux

#关闭防火墙和开机不启动(生产环境慎用,可以选择开放对应的端口)
systemctl stop firewalld.service
systemctl disable firewalld.service

补充知识点:

当MySQL实例启动时,会将自己的进程ID写入一个文件中——该文件即为pid文件;该文件可由参数pid_file控制,默认位于数据库目录下,文件名为主机名.pid:

代码语言:javascript复制
mysql> show variables like 'pid_file'G;

1. MySQL5.x源码编译安装

主机环境以及 mysql 版本 centos 7 ( Core X86_64 ) cmake mysql-5.5.32.tar.gz 注意:Mysql 5.x 与 mysql 8.x 是不同的

基于cmake的原码编译安装:

代码语言:javascript复制
##下载cmake 和 mysql源码
tar xf cmake-2.8.8.tar.gz && cd cmake-2.8.8
./configure 
make & make install

$ scp mysql-5.5.32.tar.gz root@10.22.53.12:/opt/MYSQL  #将本地文件上传到服务器上
[root@WeiyiGeek MYSQL]# tar xf mysql-5.5.32.tar.gz    #并解压
CMakeLists.txt

##不建议使用yum进行删除软件,因为他会删除多余得依赖程序,导致意外发生(运维必须注意)
yum install ncurses-devel -y  //安装mysql得依赖 (安装软件一般安装devel版本)

##为mysql添加用户组 并且添加mysql用户指向组
groupadd mysql
useradd mysql -s /sbin/nologin -M -g mysql

##cmake编译mysql源码 (安装指定目录|字符集|local_infile|各种引擎)
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 -DMYSQL_DATADIR=/application/mysql-5.5.32/data 
-DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock 
-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii 
-DENABLED_LOCAL_INFILE=ON 
-DWITH_INNOBASE_STORAGE_ENGINE=1 
-DWITH_FEDERATED_STORAGE_ENGINE=1 
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 
-DWITHOUT_PARTITION_STORAGE_ENGINE=1 
-DWITH_FAST_MUTEXES=1 
-DWITH_ZLIB=bundled 
-DENABLED_LOCAL_INFILE=1 
-DWITH_READLINE=1 
-DWITH_EMBEDDED_SERVER=1 
-DWITH_DEBUG=0

#下面为了学习我就不安装默认字符集  (校对规则 - 工作中必须安装按照指定得字符集)
-DDEFAULT_CHARSET=utf8 
-DDEFAULT_COLLATION=utf8_general_ci 
#   表示编译生成makefile成功
 #   -- Generating done
 #   -- Build files have been written to: /opt/MYSQL/mysql-5.5.32
#
make && make install

##检查是否安装成功|软连接建立
echo $?  #输出0

##mysql环境变量配置
ln -s /application/mysql-5.5.32 /application/mysql

#环境变量
export PATH="/application/mysql/bin:$PATH"
echo 'export PATH=/application/mysql/bin:$PATH' >> /etc/profile  #注意这里PATH放在前面(后期防止YUM安装得mysql客户端连接编译得服务端)
echo $PATH;


#复制mysql配置文件
cd /home/oldboy/tools/mysql-5.5.32
cp support-files/my-small.cnf /etc/my.cnf  #测试环境选小,初始化更具需求增加

#给date目录权限
chown -R mysql:mysql /application/mysql/
chmod -R 1777 /tmp/

#初始化 (容易出错) 存在账号密码   【再logs里面 或在mysql安装目录logs 中存在初始化的密码】
mkdir -p /application/mysql/data
[root@WeiyiGeek scripts]# pwd
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data --user=mysql

/** 帮助得一些信息
   To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! (设置密码)

/application/mysql/bin/mysqladmin -u root password 'new-password'
/application/mysql/bin/mysqladmin -u root -h WeiyiGeek password 'new-password'

Alternatively you can run:
/application/mysql/bin/mysql_secure_installation

You can start the MySQL daemon with:
cd /application/mysql ; /application/mysql/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /application/mysql/mysql-test ; perl mysql-test-run.pl
*/

#将mysql服务shell脚本复制到mysqld进程
 cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld  //
 chmod  x /etc/init.d/mysqld  //添加执行权限
 //启动mysql数据库
 /etc/init.d/mysqld start

WeiyiGeek.源码安装


2. 5.7.24二进制安装

环境版本:CentOS release 6.10 (Final - 32位) mysql-5.7.24-linux-glibc2.12-i686.tar.gz (注意版本)

代码语言:javascript复制
Step 1 、检查是否安装了 mysql 与 mariadb:
pm -qa | grep mysql  && rpm -qa | grep mariadb
rpm -e --nodeps mysql-community-libs-8.0.13-1.el6.i686  #有则卸载
# 将/var/lib/mysql文件夹下的所有文件都删除干净。


Step 2 、传安装文件到 linux 系统进行安装:
#出于安全问题,建议使用 md5sum 命令核对一下文件源:
md5sum mysql-5.7.24-linux-glibc2.12-i686.tar.gz
mkdir /usr/local/msyql  #/usr/local 目录下创建文件夹存 mysql:
tar -zxvf mysql-5.7.24-linux-glibc2.12-i686.tar.gz -C /usr/local/mysql5/   #解压到指定目录


Step 3 、添加用户和组:
groupadd mysql && useradd -r -g mysql mysql -s /sbin/nologin -M
more /etc/group | grep "mysql"   # 查看 是否存在 mysql 组
groups mysql                     # 查看 msyql 属于哪个组


Step 4、依赖安装与mysql配置
[root@WeiyiGeek mysql57]# rpm -qa | grep libaio
libaio-devel-0.3.107-10.el6.i686
libaio-0.3.107-10.el6.i686

#没有安装的情况下
[root@WeiyiGeek mysql57]# yum -y install libaio
#进入安装 mysql 软件目录安装配置文件:
cp ./support-files/my-default.cnf /etc/my.cnf   #(提示是否覆盖,输入“ y ”同意)
vim /etc/my.cnf   # 修改被覆盖后的 my.cnf

[mysql] 
# 设置mysql客户端默认字符集 
default-character-set=utf8  
socket=/var/lib/mysql/mysql.sock 

[mysqld] 
#skip-name-resolve 
user=root #先设置以root用户运行,运行后再更改为mysql,注意各个目录文件夹所属用户
#设置3306端口 
port = 3306  
#socket与上面一致
socket=/var/lib/mysql/mysql.sock 
# 设置mysql的安装目录 
basedir=/usr/local/mysql 
# 设置mysql数据库的数据的存放目录 
datadir=/usr/local/mysql/data 
pid-file=/app/mysql-8.0.16/data/mysql.pid
skip-grant-tables #此项是为了装好后免登陆修改密码使用  (修改后注释即可)
#错误信息
log-error=/usr/local/mysql/log/mysql-err.log 
# 允许最大连接数 
max_connections=200 
# 服务端使用的字符集默认为8比特编码的latin1字符集 
character-set-server=utf8 
# 创建新表时将使用的默认存储引擎 
default-storage-engine=INNODB 
#lower_case_table_name=1 
max_allowed_packet=16M
#-------------- 配置文件分割线 ------------------------#

mkdir {data,log}         # 创建 data 文件夹:
chown -R mysql:mysql data/ log/ #修改当前目录拥有者为 mysql 用户
chown -R mysql:mysql /var/lib/mysql
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/  #初始化 mysqld:[root@localhost mysql] 此处有账号密码

#设置开机启动 
    a. 复制启动脚本到资源目录: cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
    b. 增加 mysqld 服务控制脚本执行权限: chmod  x /etc/rc.d/init.d/mysqld , 更改 mysqld 中下面两个选项
           basedir=/usr/local/mysql
           datadir=/usr/local/mysql/data
    c. 将 mysqld 服务加入到系统服务: chkconfig --add mysqld
    d. 检查mysqld服务是否已经生效: chkconfig --list mysqld
       查看启动项:chkconfig --list | grep -i mysql
    删除启动项:chkconfig --del mysql
     
#将mysql的bin目录加入PATH环境变量,编辑 /etc/profile文件
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile

#执行生效
source /etc/profile

WeiyiGeek.二进制安装


3. MySQL8二进制安装

环境版本:CentOS Linux release 7.6.1810 (Core) mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz 官网:https://dev.mysql.com/downloads/mysql/

WeiyiGeek.二进制

代码语言:javascript复制
####Step 1.安装环境设置 #####
# 依赖安装目录解压:
yum update -y && yum upgrade -y
#rpm --import /etc/pki/rpm-gpg/xxxx
yum install -y epel-release.noarch gcc gcc-c   openssl openssl-devel libaio libaio-devel ncurses ncurses-deve numactl lsof vim wget net-tools

# 用户建立
[root@centos7 ~]$ groupadd -g 500 mysql
[root@centos7 ~]$ useradd -r -g mysql -s /sbin/nologin mysql

# 解压与安装
#https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
mkdir /usr/local/mysql8
cp -r mysql-8.0.16-linux-glibc2.12-x86_64/* /usr/local/mysql8/


# 建立数据库文件与log日志 (安装在mysql安装目录中 - 实际生产环境中不建议使用)
cd /usr/local/mysql8
mkdir {data,log}
mkdir -vp /var/lib/mysql
chown -R mysql:mysql /usr/local/mysql8 /var/lib/mysql


#环境设置
echo "export PATH=$PATH:/usr/local/mysql8/bin"  >>  /etc/profile
source /etc/profile

#####Step 2.数据库初始化####
# 编辑 /etc/my.cnf
[mysqld]
port=3306
datadir=/usr/local/mysql8/data
log-error=/usr/local/mysql8/log/mysql-err.log
user=mysql
pid-file=/usr/local/mysql8/data/mysql8.pid
#skip-grant-tables #此项是为了装好后免登陆修改密码使用
default_authentication_plugin=mysql_native_password
socket=/var/lib/mysql/mysql.sock 
character-set-server=utf8mb4

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock 

# 初始化数据库目录 (权限问题) 指定用户不能否则会重新生成pid注意
/usr/local/mysql8/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql8 --datadir=/usr/local/mysql8/data
 cat /usr/local/mysql8.0/log/mysql-err.log  #账号密码

#### Step 3.启动脚本与mysql配置 ####
# 制作启动脚本 
cp  /usr/local/mysql8/support-files/mysql.server  /etc/init.d/mysqld

vi /etc/init.d/mysqld  #将base与data目录进行更改
basedir=/usr/local/mysql8
datadir=/usr/local/mysql8/data

# 启动、关闭、重启mysql的命令
/etc/init.d/mysqld start
/etc/init.d/mysqld stop
/etc/init.d/mysqld restart

# 或者 添加到服务项中
[root@localhost mysql8]# chkconfig --add mysqld
[root@localhost mysql8]# chkconfig --list mysqld

[root@localhost mysql8]# service mysqld start

WeiyiGeek.mysql8.0

安装补充

代码语言:javascript复制
#(1)将MySQL初始化到其他路径并且采用mysqld启动
mkdir -vp /app/mysql-8.0.16/{data,log,tmp} /var/lib/mysql
chown -R mysql:mysql /usr/local/mysql-8.0.16/ /app/mysql-8.0.16 /var/lib/mysql

#MySQL8.0配置
# 编辑 /etc/my.cnf
[mysqld]
port=3306
user=mysql
server-id=1
basedir=/usr/local/mysql-8.0.16
socket=/var/lib/mysql/mysql.sock
datadir=/app/mysql-8.0.16/data
pid-file=/app/mysql-8.0.16/data/mysql.pid
log-error=/app/mysql-8.0.16/log/mysql-err.log
tmpdir=/app/mysql-8.0.16/tmp
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
#设置密码登录默认验证插件
default_authentication_plugin=mysql_native_password
#skip-grant-tables

[client]
#设置mysql客户端默认字符集
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock 


#初始化数据库目录 注意--defaults-file必须指定在首个参数
/usr/local/mysql-8.0.16/bin/mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql

#利用support-files提供的脚本进行启动关闭数据库
#对于base(MySQL安装目录)与data(MySQL数据文件目录)进行实际路径的更改
4. YUM安装MySQL(单机使用-多实例未配置成功)

安装环境:Centos 7 (Core X86_64 ) 数据库版本:MySQL 8.x 注意事项:安装前查看是否存在其他版本得mysql以免冲突 rpm -qa | grep -E “mysql|mariadb”

代码语言:javascript复制
Step1 : 将机器连接到外网,进行更新软件及其依赖;
> yum clean all
> yum update -y && yum upgrade -y
> yum install -y epel-release.noarch gcc gcc-c   openssl openssl-devel libaio libaio-devel ncurses ncurses-deve numactl lsof vim wget net-tools

Step 2:使用文档中的mysql8.0的rpm包进行安装yum的mysql镜像源
https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
> sudo rpm -Uvh mysql80-community-release-el7-1.noarch.rpm

Step 3:安装mysql服务器端,输入Y即可
> yum repolist all | grep mysql
> sudo yum install mysql-community-server

Step 4:启动mysqld 服务进程
shell> sudo service mysqld start

Step 5:查看安装的默认密码,采用记录得密码进行登录并且修改密码
> grep “temoprary password” /var/log/mysqld.log 
 
Step 6:采用修改的密码进行登录mysql,到此完成了mysql的安装
> Mysql -uroot -pMyNewPass4!

Step 7:启动自启mysql服务
shell> sudo systemctl start mysqld.service


Step n:目录文件解释语句
数据目录:/usr/lib/mysql
配置文件:/etc/my.cnf
日志:/var/log/mysqld.log
PID文件:/var/run/mysqld
sock:/var/lib/mysql/mysql.sock

ALTER USER 'root'@'%' IDENTIFIED BY 'weiye@888'; #/
ALTER USER USER() IDENTIFIED BY 'weiye@888';  #mysql8.x更改密码 (mysql 8.0 有密码强度设置)
#新建本地用户
CREATE USER 'test'@'localhost' IDENTIFIED BY 'Test@123456';
#新建远程用户
CREATE USER 'test'@'%' IDENTIFIED BY 'Test@123456';
#新建数据库
CREATE DATABASE testdb;
#赋予指定账户指定数据库远程访问权限
GRANT ALL PRIVILEGES ON testdb.* TO 'test'@'%';
#赋予指定账户对所有数据库远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%';
#赋予指定账户对所有数据库本地访问权限
GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost';
#刷新权限
FLUSH PRIVILEGES;
5.MySql绿色版运行

安装环境:Windows Server 2019 数据库版本:MySQL 8.x 安装流程步骤:

1.下载mysql绿色版压缩包,完成后解压到安装目录后,在根目录创建data文件夹;

2.把mysql下的bin目录添加到环境变量PATH之中,比如;d:mysqbin;

3.根目录创建my.ini文件,并拷贝以下代码,并修改basedir和datadir路径

代码语言:javascript复制
# MySQL Server Instance Configuration File
# ----------------------------------------------------------------------
# Generated by the MySQL Server Instance Configuration Wizard
#
#
# Installation Instructions
# ----------------------------------------------------------------------
#
# On Linux you can copy this file to /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options
# (@localstatedir@ for this installation) or to
# ~/.my.cnf to set user-specific options.
#
# On Windows you should keep this file in the installation directory 
# of your server (e.g. C:Program FilesMySQLMySQL Server X.Y). To
# make sure the server reads the config file use the startup option 
# "--defaults-file". 
#
# To run run the server from the command line, execute this in a 
# command line shell, e.g.
# mysqld --defaults-file="D:GreenSoftMySQLmy.ini"
#
# To install the server as a Windows service manually, execute this in a 
# command line shell, e.g.
# mysqld --install mysql --defaults-file="D:GreenSoftMySQLmy.ini"
#
# And then execute this in a command line shell to start the server, e.g.
# net start mysql
#
#
# Guildlines for editing this file
# ----------------------------------------------------------------------
#
# In this file, you can use all long options that the program supports.
# If you want to know the options a program supports, start the program
# with the "--help" option.
#
# More detailed information about the individual options can also be
# found in the manual.
#
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
#
#
# CLIENT SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by MySQL client applications.
# Note that only client applications shipped by MySQL are guaranteed
# to read this section. If you want your own MySQL client program to
# honor these values, you need to specify it as an option during the
# MySQL client library initialization.
#

[client]
no-beep

# pipe
# socket=0.0
port=3306

[mysql]

default-character-set=utf8

[mysqld]

# 这是8.0.4的新特性 caching_sha2_password,在linux上面使用命宁 mysql -uroot -proot 可以链接,但是使用windows下面的navict链接不成功 
default_authentication_plugin = mysql_native_password

# These are commonly set, remove the # and set as required.
character-set-server = utf8
basedir = D:Program Filesmysql-8.0.11-winx64
datadir = D:Program Filesmysql-8.0.11-winx64data
port = 3306
server_id = 1

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# General and Slow logging.
log-output=FILE
general-log=0
general_log_file="CUPID.log"
slow-query-log=1
slow_query_log_file="CUPID-slow.log"
long_query_time=10

# Binary Logging.
# log-bin

# Error Logging.
log-error="CUPID.err"

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M 

# 8.0.4版本的时候,用的是这个sql_mode,但在8.0.11版本中会报错,改成下面那个
# sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

default-storage-engine=INNODB

innodb_log_file_size = 512M
binlog_format='MIXED'
max_allowed_packet = 1G
# innodb_file_per_table = 1
# innodb_file_format = Barracuda

# 大小写是否敏感,0敏感 Linux下默认为0, Windows下默认值是 1, MacOS下默认值是 2(0敏感)
lower_case_table_names = 1

innodb_strict_mode = 0
max_connections = 500

3.安装MYSQL服务与初始化

代码语言:javascript复制
mysqld --install  #安装MYSQL服务
mysqld --initialize --user=mysql --console   #初始化mysql并记下临时密码

4.启动服务

代码语言:javascript复制
net start mysql  #启动mysql服务

5.基础SQL执行

代码语言:javascript复制
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'backup'@'10.0.0.2' IDENTIFIED BY '123456'; #用户名为backup,密码123456,只允许10.0.0.2远程登录
GRANT select,lock tables ON db1.* TO 'backup'@'%';    #授权db1数据库的select和lock tables权限给backup用户

0x02 MySQL初始化设置

mysql启动加载配置文件:

代码语言:javascript复制
#如果不想使用默认加载顺序中的配置文件,可以在启动命令上增加 --defaults-file='path/to/my.cnf'来指定要使用的配置文件 (需要注意必须放在第一个参数处)
/usr/sbin/mysqld --defaults-file=/etc/mysql/my.cnf --basedir=/usr --datadir=/var/lib/mysql 
 --pid-file=/var/run/mysqld/mysqld.pid 
 --socket=/var/run/mysqld/mysqld.sock

mysql安装启动成功验证连接:

  • mysql -h 主机地址 -u 用户名 -p 用户密码 (注:u与root可以不用加空格,其它也一样)
  • mysql -h 127.0.0.1 -u root -p 然后输入密码,就可以连接到本地的MySql数据库了。
5.x 源码安装验证
代码语言:javascript复制
###上面############
[root@WeiyiGeek mysql]$ mysql -h localhost  #安全完成后默认无密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'System123@';
    
mysql> select user,host from mysql.user;  //删除空表用户
mysql> delete from mysql.user where user='' or user='::1'; //ipv6
mysql> drop database test;  //drop 有时候干不掉 特殊字符
mysql> delete from mysql.user; //或者干掉所有得管理员(实际清空列表)

#建立一个类似Root权限得用户
mysql> grant all privileges on  *.* to system@'localhost' identified by 'system' with grant option;  #grant option; 可以给其他建立得用户赋权限
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

#还可以直接设置 mysql -root 登陆密码
[WeiyiGeek ~]# /application/mysql/bin/mysqladmin -u system password 'system'

#/** 注意这里有时涉及字符集 - Cent6.x**/
/etc/sysconfig/i18n
#LANG="en_US.UTF-8"
#LANG="zh_CN.GB18030"
LANG="zh_CN.UTF-8"
SYSFONT="latarcyrheb-sun16"

#设置自启动状态 与 验证密码
[root@WeiyiGeek ~]# chkconfig mysqld on
[root@WeiyiGeek ~]# chkconfig --list mysqld
[root@WeiyiGeek ~]# mysql -usystem -psystem
5.7.x 二进制安装验证
代码语言:javascript复制
mysql -uroot -p  -A        #当我们打开数据库,即use dbname时,要预读数据库信息,当使用-A参数时,就不预读数据库信息。
update user set authentication_string = '' where user = 'root';  #先设置密码为空,然后在注释my.cnf文件中的skip-grant-tables

# 5.7.x 支持的快捷改密码
设置密码才能进行后续的数据库操作:SET PASSWORD = PASSWORD('System123@');(密码设置为了123456)   # mysql8.0 不支持
修改密码为 password:update user set authentication_string=PASSWORD('password') where User='root';
# 建立用户与修改权限
mysql> use msyql 
mysql> create user 'user-name'@'ip-address' identified by 'password';(红色标记为需要修改的地方)
mysql> grant all on *.* to 'root'@"%" identified by "password" with grant option;
mysql> flush privileges;

WeiyiGeek.5.7

8.x 二进制安装验证
代码语言:javascript复制
#如果密码为空,在密码设置好后删掉my.cnf里的 -> skip-grant-tables 之后再重启/etc/init.d/mysqld restart
mysql -uroot -p #交互式登录
mysql -uroot -p "lTRGbo53ii<5" -S /var/lib/mysql/mysql  #多实例登录

#首次登录密码设置,MYSQL8的特性密码强度是有要求的
mysql>ALTER USER 'root'@'%' IDENTIFIED BY 'System123@';  

#采用 mysql_native 加密方式 方便 NATIVE客户端远程工具登录
mysql>ALTER USER 'root'@'%' IDENTIFIED BY 'weiyigeek@123' PASSWORD EXPIRE NEVER; 
mysql>ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'weiyigeek@123'; 
mysql>update user set host = '%' where user = 'root';   #使其被任何主机连接(不安全)
mysql>update user set authentication_string = '' where user = 'root';  #清空root的密码 在skip0granbt-tables处使用

补充说明:

代码语言:javascript复制
#正常的启动与停止Mysql,这样做是防止数据丢失与sock异常;
#1.优雅的关闭数据库方法
mysqladmin -uroot -proot shutdown
/etc/init.d/mysqld stop
kill -UER2 `cat path/pid`

#2.多实例Mysql的启动与关闭 、单与多实例登录
#shell 启动/退出
/bin/sh ${MysqlPath}/mysqld_safe -defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
/bin/sh ${MysqlPath}/mysqladmin -u ${mysqlUser} -S /date/${port}/mysql.sock shutdown

#shell登陆
mysql -uroot -p -P 3306                     #单实例(可以自定义MySQL数据文件位置,但是必须写在默认配置文件中,在启动的时候会根据配置文件生成pid以及sock套接字文件)
mysql -uroot -p -S /data/3306/mysql.sock    #多实例
0x03 运维配置

(1)设置mysql命令行格式 采用mysql中的prompt命令或者参数来自定义mysql>,有时可以防止误操作;

代码语言:javascript复制
system@localhost 21:12:30>prompt u@h R:m:s>   //临时生效
PROMPT set to 'u@h R:m:s>'

//修改配置文件永久生效/etc/my.cnf
[mysql]
prompt= \u@\h \R:\m:\s >

(2) 多实例shell操作脚本

代码语言:javascript复制
#!/usr/bin/env bash
# 实现MYSQL多实例的脚本启动(启动|停止|重启)
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
UMYSQL="root"
PMYSQL="123456"
SOCKET='/date/3306/mysql.sock'
CONNECT="mysql -u${UMYSQL} -p${PMYSQL} -S ${SOCKET}"
MYSQLADMIN="mysqladmin -u${UMYSQL} -p${PMYSQL} -S ${SOCKET}"
MYSQLPATH='/usr/local/sbin/'
#脚本帮助
function useage(){
  echo "Useage:$0 [start|restart|stop]"
  exit 1
}

#执行结果判断函数
function judge(){
  RETVAL=$?
  if [ $RTVAL -eq 0 ];then
    action "$1 mysql" /bin/true
  else
    action "$1 mysql" /bin/false
  fi
}

function start(){
  if [ -e $SOCKET ];then
    echo "Mysql have already start...."
    exit 1
  else
    ${MYSQLPATH}mysqld_safe --default-file=/data/3306/my.cnf 2>&1 >/dev/null &   #关键点
    judge start
  fi
}

function stop(){
  if [ -e $SOCKET ];then
    ${MYSQLPATH}${MYSQLADMIN} shutdown 2>&1 >/dev/null
    judge stop
  else
    echo "Mysql have not start...."
    exit 1
  fi
}

function restart(){
  stop
  sleep 2
  start
}

case "$1" in
  start) start ;;
  stop) stop ;;
  restart) restart ;;
  *) useage
esac

(3) 主从同步shell操作脚本

代码语言:javascript复制
#!/usr/bin/env bash
# 实现MYSQL主从同步的监控Slave_IO_RUNING / Slave_SQL_Running Last_SQL_Error状态
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
UMYSQL="root"
PMYSQL="123456"
SOCKET='/date/3306/mysql.sock'
CONNECT="mysql -u${UMYSQL} -p${PMYSQL} -S ${SOCKET}"
MYSQLADMIN="mysqladmin -u${UMYSQL} -p${PMYSQL} -S ${SOCKET}"
MYSQLPATH='/usr/local/sbin/'
STATUS=($($CONNECT -e "show slave statusG" | egrep "Seconds_Behind|_Running|Last_SQL_Error"|awk '{print $NF}'))  #数组
ERRNO=array(1158 1159 1008 1007 1062)


function check_status(){
  if [ "${STATUS[0]}" = "Yes" -a "${STATUS[1]}" = "Yes" -a "${STATUS[2]}" = "0" ];then
    echo "Mysql slave is ok!"
    return 0
  else
    return 1
  fi
}

 #防止出错进行跳过
function check_errno(){
  check_status
  RETVAL=$?
  if [ $RETVAL -eq 1 ];then
    for (i=0;i<${#ERRNO};i  )
    do
      if [ "${STATUS[3]}" == "${ERRNO[$i]}" ];then
          $CONNECT -e "stop slave" #停止主从服务
          $CONNECT -e "set global sql_slave_skip_counter = 1"
          $CONNECT -e "start start" #开启主从服务
      fi
    done
  fi
}
   
function check_again(){
  STATUS=($($CONNECT -e "show slave statusG" | egrep "Seconds_Behind|_Running|Last_SQL_Error"|awk '{print $NF}'))  #数组
  check_status &> /dev/null
  if [ $? -eq 1 ];then
    echo "Mysql slave is fail $(date  %T%u)">/var/log/mysql.errorlog
    mail -s "Mysql slave is fail $(date  %T%u)" 1111@qq.com</var/log/mysql.errorlog  #推荐方式
  fi
}

function main(){
  check_errno
  check_again
}

main

0x04 MySQL数据库安全配置

安全设置大致分为以下几个步骤:

  • 修改root账号密码
  • 禁用root账户远程登录
  • 密码强度验证插件
  • 移除匿名用户/移除测试数据库(test)
  • 本地终端连接登陆密码安全
  • mysql数据库防火墙
  • mysql数据库权限分配

(1) 修改root账号密码 三种修改mysql管理员密码的方式

代码语言:javascript复制
mysqladmin -u root -p 'rootmysql' PASSWORD 'new_mysql_pass'
mysqladmin -u root -p 'rootmysql' PASSWORD 'new_mysql_pass -S /data/3306/mysql.sock

#此方法适合--skip-grant-tables方法修改密码当忘记密码的时候;
> UPDATE mysql.user SET password = PASSWORD("new_pass") WHERE user='root' and host='localhost';
> flush privileges;   #任何时候都要记住改密的啥时候都要更新权限;

> SET password = PASSWORD('olay_new');  
#此方法不适合--skip-grant-tables方法修改密码当忘记密码的时候;

#Mysql8.0
mysql>ALTER USER 'root'@'%' IDENTIFIED BY 'MyNewPass4!' PASSWORD EXPIRE NEVER; 
mysql>ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'MyNewPass4!';

sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

(2) 禁用root账户远程登录

代码语言:javascript复制
--#配置1: 数据库远程连接(外部访问)#
mysql 默认是禁止远程连接的,你在安装mysql的系统行运行mysql -u root -p 后进入mysql,只需要调整%为指定ip地址回去本地;

mysql>use mysql;
mysql>grant all privileges on 数据库名字.* to '远程用户名'@'远程IP地址' identified by '远程用户的密码';
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootpassword' WITH GRANT OPTION;           #开启权限分配
mysql> flush privileges;

--#详细的权限控制
CREATE USER 'TestRemote'@'%' IDENTIFIED WITH mysql_native_password AS '***';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, FILE, INDEX, ALTER, CREATE TEMPORARY TABLES, CREATE VIEW, EVENT, TRIGGER, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON *.* TO 'TestRemote'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

--#注意:代码中的“%”表示任何IP地址,如果你的IP地址固定,可以把%换成你的IP地址(安全设置);

--# mysql默认情况下是只能本地访问数据库,现在进行改变(全局配置远程连接)
vim /etc/mysql/my.cnf  #12.06 verion
vim /etc/mysql/mysql.conf.d/mysqld.cnf # 16.04 version

--#找到bind-address并注销,这样就关闭了白名单,及所有ip都能连接这里的mysql,这里是mysql服务器的全局设置.
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1

--#除此以外还能采用phpMyadmin进行修改;

(5) 本地终端连接登陆密码安全 mysql数据库采用终端登录,是不安全的优于系统会记住您执行过的密码; 解决办法:

  • mysql -uroot -p #直接回车
  • /etc/profile 中加入HISCONTROL=ignorespce 或者 设置histroy记录条数为10条
  • 在shell脚本进行加密(shell加密)

(1) shell 脚本加入交互自定义shell密码来启动MySQL 只需输入上面我们设置的口令 0932313,即可执行数据库登入:

WeiyiGeek.shell与mysql交互登陆

(2) shell脚本加密脚本

加密采用工具shc脚本加密工具,此工具安全性极高,破译极其困难,以下为下载、安装及加密的过程。

代码语言:javascript复制
$ wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz 
$ tar xvf shc-3.8.9b.tgz  && cd shc-3.8.9b 
$ mkdir -p /usr/local/man/man1/ #创建目录这一步这个是必须的,没这个目录会报错 
$ make install

$ ln –s /usr/local/bin/shc /usr/bin/shc #建立软连接

#以刚刚的 link_db.sh 为例,进行加密,
#执行后,会在脚本所在目录生成两个文件,分别为
link_db.sh.x    #原来脚本的可执行文件,可随意改名,不用赋权,shc处理的过程中有赋权这一步;然后将link_db.sh.x进行改名并放在/usr/bin目录下;(直接执行)
link_db.sh.x.c  #脚本的源文件,可以直接删除

WeiyiGeek.shell与mysql交互登陆

(6) mysql数据库防火墙

代码语言:javascript复制
#CentOS 7 开放端口 
firewall-cmd --add-port=3306/tcp --permanent
#重新加载防火墙设置 
irewall-cmd --reload 

#CentOS 6 
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT iptables save

(7) mysql数据库权限分配 配置:Mysql权限实践配置

代码语言:javascript复制
#常用help命令
help create user;
help grants;

#具体的mysql权限
#可以通过mysql中user,host,db这三张表进行查看权限
INSERT 
DELETE
UPDATE
SELECT
CREATE #创建库和表
DROP   #删除库和表
REFERENCES #引用
INDEX #索引
ALTER #修改库和表
CREATE TEMPOARY TABLES #创建临时表
LOCK TABLES #锁表
EXECUTE #执行
CREATE VIEW #创建视图
SHOW VIEW  #显示视图
CREATE ROUTINE  #创建存储过程
ALTER ROUTINE  #修改存储过程
EVENT #事件
TRIGGER #触发器


#下面来建立用户 (test)
CREATE USER test@'10.0.2.%' IDENTIFIED BY 'test';  #这时的权限是USAGE , 基本只有登录的权限
GRANT ALL ON test.* TO test@'10.0.2.%';

#等同于下面这一条
GRANT ALL ON test.* TO test1@'10.0.2.0/255.255.255.0' IDENTIFIED BY 'test1';  #需要用户有建立字用户权限的功能的话还需加上  :WITH GRANT OPTION
system@localhost 21:48:52 >GRANT ALL ON *.* TO root@'10.0.2.0/24' IDENTIFIED BY 'root' WITH GRANT OPTION;

#最小分配权限案例
GRANT INSERT,UPDATE,DELETE,SELECT,CREATE,DROP ON test.* TO test1@'%' IDENTIFIED BY 'test1';

mysql -usystem -p123456 -e "SHOW GRANTS FOR system@localhost"  # -e 交换式

WeiyiGeek.shell与mysql交互登陆

0 人点赞