01_MySQL介绍及安装

#任务背景

一、真实案例

某公司现在有几套不同版本的MySQL数据库,现在大部分的生产和测试环境都已经切换到5.7版本,由于历史原因,有一套测试环境版本为MySQL-5.5。现为了将测试环境版本统一,需要将原来测试环境数据库MySQL-==5.5==版本升级到现在的MySQL-==5.7.31==,并且保证数据完整。

二、案例背后的核心技术

1)不同版本MySQL的安装(花样安装MySQL)

2)MySQL数据库版本升级(升级需要注意什么)

3)如何经过自己思考,找到一种合适的解决方案

三、今日任务场景

由于用户访问量以及用户数据越来越多,原有的单机服务器(LAMP环境)已不能满足需求,在

需要保证数据完整的前提下,现需要将原有==数据库迁移==到另外一台单独的服务器上。迁移后,保证业务正常访问。

服务器角色IP系统版本数据库版本
老服务器(LAMP)10.1.1.100Centos7.6MySQL-5.6.47
新服务器(MySQL)10.1.1.1Centos7.6MySQL-5.7.31

#任务要求

  1. 在业务维护时间段对数据库进行==备份==

  2. 将MySQL数据库从老服务器(LAMP)中迁移到新的单独MySQL数据库服务器,版本升级为5.7.31

#任务拆解

  1. 新服务器安装Centos7.6,并且==安装MySQL-5.7.31==版本数据库

  2. 停止监控、停止前端应用、停止MySQL数据库

  3. 备份数据库(省略)

  4. 迁移数据库——>同步数据库文件到新的环境中(rsync/scp)

  5. 测试验证

#涉及知识点

  1. 官方下载mysql软件包(根据需求)

  2. MySQL数据库的安装部署

  3. MySQL数据库管理员用户root密码的设置及修改

  4. mysql客户端工具的使用

#理论储备

##一、MySQL概述

###1、关系型数据库

  • RDBMS(relational database management system),既关系型数据库管理系统

  • 简单来说,关系型数据库,是指采用了==二维表格==来组织数据的数据库。

  • 常见的关系型数据库

==oracle、mysql==、DB2(IBM)、Sybase、==SQL server==(Microsoft微软)、IBM Informix

关系型数据库的最大特点就是==事务的一致性==:所以也在对事物一致性的维护中有很大的开销.

###2、事务概述

㈠ 什么是事务?

1)事务由一条或者多条sql语句组成;

2)在事务中的操作,这些sql语句要么都成功执行,要么都不执行,这就是一个事务。

==举例说明:==

  1. 登陆ATM机,输入密码;

  2. 连接数据库,验证密码;

  3. 验证成功,获得用户信息,比如存款余额等;

  4. 用户输入需要转账的金额,按下确认键;

  5. ==从后台数据库中减掉用户账户上的对应金额(update语句);==

  6. ==从后台数据库中给对方账户增加相应的金额(update语句);==

  7. 确认,退卡,走人;

㈡ 事务特点(ACID)
  • 原子性(Atomicity):

    事务中的全部操作在数据库中是不可分割的,要么==全部完成==,要么==均不执行==。

  • 一致性(Consistency):

    指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态,不能破坏关系数据的完整性以及业务逻辑上的一致性。

  • 隔离性(Isolation):

    一个事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  • 持久性(Durability):

    持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

㈢ 应用场景

对数据的==一致性==要求较高;典型的==银行及支付系统类==;

###3、MySQL数据库介绍

  • MySQL是一种关系型数据库管理系统

  • 由瑞典MySQL AB 公司开发,目前属于Oracle旗下

  • MySQL是C/S架构

###4、MySQL数据库版本

  • 社区版:MySQL Community Edition (==GPL==)

    1. 可以看做是企业版的“广泛体验版(小白鼠版)”,未经各个专有系统平台的压力测试和性能测试

    2. 基于GPL协议发布,可以随意下载使用

    3. 没有任何官方技术支持服务

  • 企业版:MySQL Enterprise Edition(==commercial==)

    1. 提供了比较全面的高级功能、管理工具及技术支持

    2. 安全性、稳定性、可扩展性比较好

  • 集群版:MySQL Cluster CGE(==commercial==)

扩充:关于版本的命名方式如何定义?

版本说明
α(Alpha)版内测版,内部交流或者专业测试人员测试用。Bug较多,普通用户最好不要安装。
β(Beta)版公测版,专业爱好者大规模测试用,存在一些缺陷,该版本也不适合一般用户安装。
γ ( Gamma )版相当成熟的测试版,与即将发行的正式版相差无几。
==Final==正式版本
Free自由版本
==Release==发行版本
==Standard==标准版本
==Mini==迷你精简版本,只有最基本的功能
Upgrade升级版本
==GA(GenerallyAvailable)==开发团队认为该版本是稳定版,可以在较为关键的场合使用。
Retail零售版

###5、MySQL的获取

官网:www.mysql.com

###6、MySQL的安装方式

####㈠ 二进制方式安装

  • RPM版本

命名:mysql-community-server-5.7.28-1.el7.x86_64.rpm ,需要在特定linux版本下安装。

  • ==基于glibc版本==

命名:==mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz==

依赖glibc库,可以安装在通用的Linux系统下

####㈡ 源代码编译安装

命名:mysql-5.7.31.tar.gz,通用的Linux下都可以编译安装。

####㈢ 安装方式总结

安装方式优点缺点
rpm安装卸载简单可定制性差
glibc可定制性相比rpm包灵活些安装相比rpm包复杂些,需要手动初始化数据库
源码安装可定制性最强,根据需求和功能定制安装麻烦,需要手动初始化数据库

7、区分数据库和数据库实例

㈠ 什么是MySQL数据库?

数据库(database): 操作系统或存储上的==数据文件的集合==。mysql数据库中,数据库文件可以是* .frm、.MYD、.MYI、*.ibd等结尾的文件, 不同存储引擎文件类型不同。

㈡ 什么是MySQL数据库实例?

数据库实例(instance): 由==后台进程或者线程==以及一个==共享内存区==组成。共享内存可以被运行的后台线程所共享。 数据库实例才是真正操作数据库的。

注意:MySQL的后台守护程序==mysqld==是单进程多线程的工作模式。

㈢ 什么是MySQL数据库服务器?

数据库服务器(database server):部署==安装数据库实例==的服务器。

㈣ 数据库和数据库实例之间的关系是什么?

通常情况下,数据库实例和数据库是一一对应的关系,也就是==一个数据库实例对应一个数据库==; 但是,在集群环境中存在==多个数据库实例共同使用一个数据库==。oracle RAC

##二、MySQL数据库的安装

###1、glibc方式安装

####㈠ 安装须知

  • 软件包介绍

mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
说明:通用linux下的二进制包,已编译好,只需放到相应的安装目录里即可
  • 依赖库安装

shell> yum install libaio
说明:如果已安装则可以忽略,没安装需要安装

  • 默认相关选项

默认安装信息默认存放位置
安装路径/usr/local/mysql
数据目录/usr/local/mysql/data
端口号3306
socket文件/tmp/mysql.sock

####㈡ 安装步骤

参考官当:MySQL-glibc安装手册

① 安装需求
安装路径/mysql_3306
数据路径/mysql_3306/data
端口号3306

#####② 创建mysql用户

[root@node1 ~]# useradd -rs /sbin/nologin mysql
[root@node1 ~]# id mysql
uid=998(mysql) gid=996(mysql) groups=996(mysql)
③ 拷贝程序到安装目录

1)清空环境

[root@node1 ~]# rm -f /etc/my.cnf

2)创建安装目录

[root@node1 ~]# mkdir /mysql_3306

3)解压软件并拷贝到安装位置

[root@node1 src]# pwd
/usr/src
[root@node1 src]# tar -xf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
[root@node1 src]# mv mysql-5.7.31-linux-glibc2.12-x86_64/* /mysql_3306/
说明:将数据文件移动或拷贝到mysql的安装路径后,说明mysql数据库已经安装完成!!
④ 修改文件的权限
[root@node1 src]# cd /mysql_3306/
[root@node1 mysql_3306]# mkdir mysql-files
[root@node1 mysql_3306]# chown mysql:mysql mysql-files
[root@node1 mysql_3306]# chmod 750 mysql-files
说明:
mysql-files目录为secure_file_priv系统变量提供一个位置 ,该位置将导入和导出操作限制到特定目录。
⑤ 初始化数据库
[root@node1 mysql_3306]# bin/mysqld --initialize --user=mysql --basedir=/mysql_3306
特别注意:
如果更改了mysql的默认安装路径,则需要加--basedir=mysql安装路径来指定
⑥ 设置安全加密连接
[root@node1 mysql_3306]# bin/mysql_ssl_rsa_setup --datadir=/mysql_3306/data
特别注意:
由于更改了mysql的默认安装路径,则需要加--datadir=mysql数据路径来指定。
⑦ 启动数据库

1)拷贝脚本文件到指定路径,并修改脚本文件里mysql的安装和数据目录

[root@node1 mysql_3306]# cp support-files/mysql.server /etc/init.d/mysql_3306
[root@node1 mysql_3306]# grep -A 1 "^basedir" /etc/init.d/mysqld
basedir=/mysql_3306
datadir=/mysql_3306/data
注意:根据自己的安装位置和数据目录位置修改

2)启动数据库服务

[root@node1 mysql_3306]# service mysqld start

3)查看端口是否监听

[root@node1 mysql_3306]# netstat -nltp|grep 3306
㈢ 安装完后续配置
① 更改数据库管理员密码
  • 方法1:

[root@node1 mysql_3306]# bin/mysqladmin -uroot password '123' -p
Enter password:输入刚刚初始化产生的临时密码
  • 方法2

mysql> set password=password('456');        //未来版本将会弃用
或者
mysql> set password='123';                  //推荐
② 配置环境变量
[root@node1 mysql_3306]# echo "export PATH=$PATH:/mysql_3306/bin" >> /etc/profile
[root@node1 mysql_3306]# source /etc/profile
③ 编写配置文件
[root@node1 mysql_3306]# cat /mysql_3306/my.cnf
[mysqld]
basedir=/mysql_3306
datadir=/mysql_3306/data
socket=/tmp/mysql.sock
④ 数据库安全配置
[root@node1 mysql_3306]# mysql_secure_installation

###2、源码编译安装

参考官当:MySQL-Source安装配置手册

源码安装三步曲:配置——>编译——>安装

####㈠ 安装须知

  • 软件包介绍

mysql-5.7.31.tar.gz                     可在任意发行版的Linux下安装
㈡ 安装需求
安装需求具体配置
安装目录(basedir)/mysql_3307
数据目录(datadir)/mysql_3307/data
端口号3307
socket文件位置$basedir/mysql.sock
字符集utf8mb4

####㈢ ==了解配置选项==

  • 常用配置选项

配置选项描述默认值建议值
CMAKE_INSTALL_PREFIX安装基目录(basedir)/usr/local/mysql根据需求
MYSQL_DATADIR数据目录(datadir)$basedir/data根据需求
SYSCONFDIR默认配置文件my.cnf路径/etc
MYSQL_TCP_PORTTCP/IP端口3306非默认端口
MYSQL_UNIX_ADDR套接字socket文件路径/tmp/mysql.sock$basedir/
DEFAULT_CHARSET默认字符集latin1utf8mb4
DEFAULT_COLLATION默认校验规则latin1_swedish_ciutf8mb4_general_ci
WITH_EXTRA_CHARSETS扩展字符集allall
ENABLED_LOCAL_INFILE是否启用本地加载外部数据文件功能OFF建议开启
WITH_SSLSSL支持类型system建议显式指定
WITH_BOOSTBoost库源代码的位置Boost库是构建MySQL所必需的,建议事先下载
  • 存储引擎相关配置项

说明:

以下选项值均为布尔值,0或1;0代表不编译到服务器中,1代表编译,建议都静态编译到服务器中。

其他的存储引擎可以根据实际需求在安装时通过WITH_xxxx_STORAGE_ENGINE=1的方式编译到服务器中。

配置选项描述
WITH_INNOBASE_STORAGE_ENGINE将InnoDB存储引擎插件构建为静态模块编译到服务器中;建议编译到服务器中
WITH_PARTITION_STORAGE_ENGINE是否支持分区
WITH_FEDERATED_STORAGE_ENGINE本地数据库是否可以访问远程mysql数据
WITH_BLACKHOLE_STORAGE_ENGINE黑洞存储引擎,接收数据,但不存储,直接丢弃
WITH_MYISAM_STORAGE_ENGINE将MYISAM存储引擎静态编译到服务器中

####㈣ 安装步骤

① 安装依赖包

1)安装相关依赖软件

# yum -y install ncurses-devel cmake libaio-devel openssl-devel
说明:环境不一样,可能还需要安装其他依赖包,比如perl相关的包,自行解决。

2)下载Boost库源代码(选做)

wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

#####② 解压软件包

[root@node1 src]# pwd
/usr/src
[root@node1 src]# tar xf mysql-5.7.31.tar.gz
③ 根据需求进行配置

1)==进入到解压目录里配置==

[root@node1 src]# cd mysql-5.7.31/
[root@node1 mysql-5.7.31]# pwd
/usr/src/mysql-5.7.31

2)编写脚本文件进行配置(不容易出错)

[root@node1 mysql-5.7.31]# vim myconfig.sh 
cmake . \
-DCMAKE_INSTALL_PREFIX=/mysql_3307 \
-DMYSQL_DATADIR=/mysql_3307/data \
-DMYSQL_TCP_PORT=3307 \
-DMYSQL_UNIX_ADDR=/mysql_3307/mysql.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_SSL=system \
-DWITH_BOOST=/mysql_3307/boost \
-DDOWNLOAD_BOOST=1(如果已经下载好,则不用再次下载)
​
[root@node1 mysql-5.7.31]# chmod +x myconfig.sh
[root@node1 mysql-5.7.31]# ./myconfig.sh
注意:
如果事先已经下载好了boost_1_59_0.tar.gz,则只需要-DWITH_BOOST=指定解压后的路径即可。

#####④ 编译并安装

[root@node1 mysql-5.7.31]# make && make install

#####⑤ 初始化数据库

注意:进入到==安装目录==里/mysql_3307

1)进入到安装目录

[root@node1 mysql-5.7.31]# cd /mysql_3307
[root@node1 mysql_3307]# pwd
/mysql_3307

2)创建系统变量secure_file_priv限制导入导出目录并修改权限

[root@node1 mysql_3307]# mkdir mysql-files
[root@node1 mysql_3307]# chown -R mysql:mysql /mysql_3307
[root@node1 mysql_3307]# chmod 750 mysql-files

3)初始化数据库

[root@node1 mysql_3307]# bin/mysqld --initialize --user=mysql --basedir=/mysql_3307 --datadir=/mysql_3307/data
注意:
千万注意需要指定当前数据库的安装路径和数据路径!

#####⑥ 启动数据库

拷贝启动脚本到/etc/init.d/目录里
[root@node1 mysql_3307]# cp support-files/mysql.server /etc/init.d/mysql_3307
[root@node1 mysql_3307]# service mysql_3307 start
Starting MySQL. SUCCESS!

####㈤ ==安装完后续配置==

① 编写配置文件
[root@node1 mysql_3307]# vim /mysql_3307/my.cnf
[mysqld]
basedir=/mysql_3307
datadir=/mysql_3307/data
socket=/mysql_3307/mysql.sock
② 设置数据库管理员密码
[root@node1 mysql_3307]# bin/mysqladmin -uroot password '123' -p
Enter password:输入初始化临时产生的密码(不显示)
​
或者进入mysql后,设置密码
mysql> set password='456';

三、客户端工具使用

1、如何访问不同的数据库?

方法一:直接使用==对应的客户==端软件访问

访问5.7.31版本数据库:
[root@node1 ~]# /mysql_3306/bin/mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.31 MySQL Community Server (GPL)
​
访问5.7.31版本数据库:
[root@node1 ~]# /mysql_3307/bin/mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.31 Source distribution
​

方法二:==定义别名==的方式访问

[root@node1 ~]# alias mysql_3306="/mysql_3306/bin/mysql"
[root@node1 ~]# alias mysql_3307="/mysql_3307/bin/mysql"
[root@node1 ~]# mysql_3306 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.31 MySQL Community Server (GPL)
​
[root@node1 ~]# mysql_3307 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.31 Source distribution

方法三:==拷贝相应命令==到PATH可以识别的路径下==并重命名==

[root@node1 ~]# unalias mysql_3306
[root@node1 ~]# unalias mysql_3307
+++++++++++++++++++++我是华丽分隔符+++++++++++++++++++++++++++
[root@node1 ~]# cp /mysql_3306/bin/mysql /usr/bin/mysql_3306
[root@node1 ~]# cp /mysql_3307/bin/mysql /usr/bin/mysql_3307
[root@node1 ~]# which mysql_3306
/usr/bin/mysql_3306
[root@node1 ~]# which mysql_3307
/usr/bin/mysql_3307

深度思考:我们之所以能够连接到数据库里的==本质==是什么?

2、客户端工具mysql使用

mysql: mysql命令行工具,一般用来连接访问mysql数据库
选项说明
-u, --user=name指定登录用户名
-p, --password指定登录密码(注意是小写p),一定要放到最后面
-h, --host=name指定数据库的主机地址
-P, --port=xxx指定数据库的端口号(大写P)
-S, --socket=name指定socket文件
-e, --execute=name使用非交互式操作(在shell终端执行sql语句)

扩展了解:

默认库描述
information_schema1、==对象信息数据库==,提供对数据库元数据的访问 ,有关MySQL服务器的信息,例如数据库或表的名称,列的数据类型或访问权限等; 2、在INFORMATION_SCHEMA中,有数个只读表,它们实际上是视图,而不是基本表,因此你将无法看到与之相关的任何文件; 3、视图,是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表
mysql1、mysql数据库是==系统数据库==。它包含存储MySQL服务器运行时所需的信息的表。比如权限表、对象信息表、日志系统表、时区系统表、优化器系统表、杂项系统表等。 2、==不可以删除==,也不要轻易修改这个数据库里面的表息。
performance_schemaMySQL5.5开始新增一个数据库,主要用于==收集数据库服务器性能==;并且库里表的存储引擎均PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表
sys1、mysql5.7增加了sys 系统数据库,通过这个库可以快速的了解系统的元数据信息; 2、sys库方便DBA发现数据库的很多信息,解决性能瓶颈; 3、这个库是通过视图的形式把information_schema 和performance_schema结合起来,查询出更加令人容易理解的数据

3、客户端工具mysqladmin使用

mysqladmin:客户端管理mysql数据库工具
㈠ 常用选项
选项描述
-h, --host=name指定连接数据库主机
-p, --password指定数据库密码
-P, --port=#指定数据库端口
-S, --socket=name指定数据库socket文件
-u, --user=name指定连接数据库用户
㈡ 常用命令
命令描述
password [new-password]更改密码
reload刷新授权表
shutdown停止mysql服务
status简短查看数据库状态信息
start-slave启动slave
stop-slave停止slave
variables打印可用变量
version查看当前mysql数据库的版本信息
㈢ 举例说明
关闭数据库
[root@node1 ~]# mysqladmin shutdown -p
默认修改数据库管理员root密码
[root@node1 ~]# mysqladmin password 'newpass' -p
[root@node1 ~]# mysqladmin password '123' -uroot -h localhost -p
​
查看扩展信息,比如变量
[root@node1 ~]# mysqladmin proc extended-status -p
创建数据库
[root@node1 ~]# mysqladmin create db01 -p
删除数据库
[root@node1 ~]# mysqladmin drop db01 -p

##四、如何重置管理员root密码

敲黑板:找问题的解决方法很重要!

1、跳过授权表(通用)

㈠ 跳过授权表重启数据库
① 关闭数据库
[root@node1 ~]# mysqladmin shutdown -p
Enter password:
② 跳过授权表启动

友情提示:启动过程可能会一波三折,冷静分析看报错,必能解决!

# /mysql_3306/bin/mysqld --defaults-file=/mysql_3306/my.cnf --skip-grant-tables --skip-networking=on  --user=mysql &
㈡ 刷新授权表(重要)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
㈢ 修改密码
mysql> alter user 'root'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

==补充:==如果未能成功,则使用以下语句修改密码

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPass')
WHERE User = 'root' AND Host = 'localhost';
mysql> FLUSH PRIVILEGES;

2、Unix和类Unix系统重置

㈠ 停止数据库
[root@node1 ~]# mysqladmin shutdown -p
Enter password:
㈡ 编写创建密码语句到文件
# echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '123';" >> /mysql_3306/mysql.pass
注意:该文件一定要对启动用户如mysql有所有权限
# chown -R mysql. /mysql_3306
㈢ 指定密码文件启动数据库
# mysqld --defaults-file=/mysql_3306/my.cnf --init-file=/mysql_3306/mysql.pass  --user=mysql &
㈣ 删除密码文件,并测试
# rm -f /mysql_3306/mysql.pass
# mysql -uroot -p

五、数据库升级

敲黑板:找解决方案很重要!

1、升级前须知

2、根据实际情况找方案

㈠ 当前实际情况

㈡ 此次任务解决方案

1、就地升级后——>迁移数据到新服务器

2、新服务器安装新版本软件——>导入业务数据

3、落地实现

㈠ 环境说明
服务器角色数据库版本IP地址主机名
原WEB服务器(LAMP)MySQL-5.6.4710.1.1.100web.heima.cc
新数据库服务器(MySQL)MySQL-5.7.25(已安装)10.1.1.1db01.heima.cc
㈡ 停止前端业务(web服务)
[root@web ~]# systemctl stop httpd
㈢ 从原数据库中导出所有数据(5.6.47)
[root@web ~]# mysqldump -u root -p --add-drop-table --all-databases --force > /tmp/old_data_full.sql
​
[root@web ~]# systemctl stop mysqld     //转储完毕,停止原数据库服务
选项描述
--add-drop-table在每个create table语句前执行drop table
--all-databases转储所有数据库中的所有表
--force忽略所有错误;即使在表转储期间发生SQL错误,也要继续操作
㈣ 拷贝原所有数据到新数据库服务器
① 确保新数据库服务器正常

新数据库环境说明:

IPhostnamebasedirdatadirportsocketversion
10.1.1.1db01.heima.cc/mysql_3306$basedir/data3306/tmp/mysql.sockmysql-5.7.25

当前数据库状态:

[root@db01 ~]# netstat -nltp|grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      7453/mysqld
[root@db01 ~]# mysql_3306 -uroot -e 'show databases;' -p
Enter password:
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
② 远程拷贝转储文件到新服务器
[root@web ~]# scp /tmp/old_data_full.sql 10.1.1.1:/tmp/
㈤ 导入数据到新的数据库中
[root@db01 ~]# mysql_3306 -uroot -p < /tmp/old_data_full.sql
Enter password:
㈥ 刷新授权表
[root@db01 ~]# mysqladmin flush-privileges -uroot -p
㈦ 检查所有表是否与当前版本不兼容
[root@db01 ~]# mysql_upgrade -p
㈧ 修改应用程序指向新数据库
[root@web html]# pwd
/var/www/html
[root@web html]# vim config.php
<?php
$pe['db_host'] = '10.1.1.1'; //数据库主机地址
$pe['db_name'] = 'myshop'; //数据库名称
$pe['db_user'] = 'root'; //数据库用户名
$pe['db_pw'] = '123'; //数据库密码
$pe['db_coding'] = 'utf8';
$pe['url_model'] = 'pathinfo_safe'; //url模式,可选项(pathinfo/pathinfo_safe/php)
define('dbpre','pe_'); //数据库表前缀
?>
㈨ 新数据库服务器添加授权
mysql> create user root@10.1.1.100 identified by '123';
mysql> grant all on myshop.* to root@10.1.1.100;
mysql> flush privileges;
㈩ 启动web服务测试验证
[root@web html]# systemctl start httpd

4、经验分享

情况1:马同学接到任务后的一个神操作就是,自顾自的停数据库,进行迁移测试

情况2:

马同学好不容易把数据迁移到新版本了,结果发现启动报错,配置文件某个参数导致,二话不说就把它给删了,起来了。

总结:这种操作简直就是马路杀手啊,同学们!

#课程目标

  • 能够通过官方网站获取相应的MySQL软件包及相关手册
  • 理解MySQL数据库实例和数据库的含义
  • 能够使用glibc方式安装MySQL数据库
  • 能够使用源码包的MySQL数据库
  • 能够使用客户端工具mysql连接数据库

#课后扩展

##一、字符集与字符编码

==字符:==

字符是各种文字符号的总称,包括各个国家文字、标点符号、图形符号、数字等。

==字符集:==

字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。也就是说字符编码是字符集的实现方式。

需要注意的是:有的字符编码和字符集的名称是一致的。

1、常见的字符集

字符集描述
Unicode统一字符集,它包含了几乎世界上所有的已经发现且需要使用的字符如:中文、日文、英文、德文等
ASCII早期的计算机系统只能处理英文,所以ASCII也就成为了计算机的缺省字符集,包含了英文所需要的所有字符
GB2312中文字符集,包含ASCII字符集
GBK是GB2312的扩展,但完整包含了GB2312的所有内容
GB18030是GBK字符集的超集,常叫大汉字字符集,也叫CJK(Chinese,Japanese,Korea)字符集,包含了中、日、韩三国语言中的所有字符。

2、常见的字符编码

  • ASCII

    在 ASCII 编码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间

  • UTF-8(Unicode)

    1)UTF-8编码是在互联网上使用最广的一种Unicode字符集的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。

    2)UTF-8编码最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

    3)UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节。

  • GBK/GB2312(中文)和GB18030(CJK)

    国家编码,通用型不如UTF-8,每个字符均占2个字节。

3、MySQL中字符集的建议

1)非常肯定只有中文终端用户时,可选择gbk/gb2312字符集,否则选用utf8mb4字符集。

2)为了方便数据迁移、以及多种终端展示,最好使用utf8mb4。

3)在mysql中utf8最多存放3个字节,而非实际的1-4个字节,为了不必要的麻烦建议utf8mb4。

4)字符无需区分大小写时,采用默认的==xxx_general_ci==校验集,否则选择==xxx_bin==校验集(生产环境中,尽量不要修改校验集).

  • 根据字符集查看校验集

mysql> show collation where charset = 'utf8mb4';

##二、systemd管理mysql

==注意:以下mysqld.service文件内容适用于mysql 5.7版本以后(参考)==

[root@misshou ~]#vim /usr/lib/systemd/system/mysqld.service
[Unit]  #该小节包含与单元类型无关的通用信息
#描述信息
Description=MySQL Server
#帮助手册
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
#定义unit启动顺序,After表示当前unit晚于以下两个单元启动
After=network.target
After=syslog.target
[Install] #该小节包含单元的启用信息,systemctl的enable与disable命令在启用/停用单元时才会使用此小节。
WantedBy=multi-user.target
#依赖multi-user.target单元,执行systemctl enable 启用命令之后,将会建立一个指向该单元文件的软链接/etc/systemd/system/multi-user.target.wants/mysql.service,表示将mysql.service包含到 multi-user.target目标中,这样,当启动multi-user.target目标时,将会自动起动mysql.service服务。 同时,systemctl disable 命令将会删除这个软连接。
​
[Service]
User=mysql
Group=mysql
#设置进程的启动类型, 必须设为 simple, forking, oneshot, dbus, notify, idle之一。
如果设为forking,那么表示ExecStart=xxx进程将会在启动过程中使用fork()系统调用。 这是传统UNIX守护进程的经典做法。也就是当所有的通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为该服务的主进程继续运行。 对于此种进程,建议同时设置 PIDFile=xxx选项,以帮助systemd准确定位该服务的主进程,进而加快后继单元的启动速度。
如果设置为simple表示ExecStart=xxx进程就是该服务的主进程.
Type=forking
PIDFile=/var/run/mysqld/mysqld.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
#设置该服务允许的最大启动时长。 如果守护进程未能在限定的时长内发出"启动完毕"的信号,那么该服务将被视为启动失败,并会被关闭。 如果未指定时间单位,那么将视为以秒为单位。 例如设为"20"等价于设为"20s"。 设为 "infinity" 则表示永不超时。 当 Type=oneshot 时, 默认值为 "infinity" (永不超时), 否则默认值等于 DefaultTimeoutStartSec= 的值(参见 systemd-system.conf(5) 手册)。
TimeoutSec=0
# Execute pre and post scripts as root
#设为yes表示所有与权限相关的执行选项(例如 User= 之类的选项),仅对 ExecStart= 中的程序有效,而对 ExecStartPre=, ExecStartPost=, ExecReload=, ExecStop=, ExecStopPost= 中的程序无效。 默认值 no表示所有与权限相关的执行选项,对所有 Exec*= 系列选项中的程序都有效。
PermissionsStartOnly=true
# Needed to create system tables
#设置在执行ExecStart=之前执行的命令行
ExecStartPre=/usr/bin/mysqld_pre_systemd
# Start main service
#在启动该服务时需要执行的命令行(命令+参数)。
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
# Use this to switch malloc implementation
#设置进程的环境变量,文件必须用绝对路径表示(可以包含通配符)。但可在路径前加上"-"前缀表示忽略不存在的文件。可以多次使用此选项,以从多个不同的文件中读取设置。若设为空,则表示清空所有先前已经从文件中读取的环境变量。
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
#进程打开文件的数量(文件描述符的数量),ulimit -n
LimitNOFILE = 5000
#当服务进程正常退出、异常退出、被杀死、超时的时候,是否重新启动该服务。on-failure表示仅在服务进程异常退出时重启
Restart=on-failure
#可以设为一系列以空格分隔的数字退出码或信号名称,当进程的退出码或收到的信号与此处的设置匹配时,无论 Restart= 是如何设置的,该服务都将无条件的禁止重新启动。这里1表示当进程的退出码为1和SIGHUP信号时不会导致该服务被自动重启。
RestartPreventExitStatus=1
#设为true表示在进程的文件系统名字空间中挂载私有的/tmp与/var/tmp目录,也就是不与名字空间外的其他进程共享临时目录。这样做会增加进程的临时文件安全性,但同时也让进程之间无法通过/tmp或/var/tmp目录进行通信。同时,当服务停止之后,所有先前在临时目录中创建的文件都将被删除。默认是false。注意,因为此选项的设置有可能在实际上无法落实(例如挂载名字空间不可用), 所以,在编写单元文件的时候,不应该将单元的安全依赖于此选项必然生效的假定。
PrivateTmp=false
​

==以下文件内容,适用于mysql5.6版本(参考):==

[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
Type=simple
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
# Execute pre and post scripts as root
PermissionsStartOnly=true
# Needed to create system tables
#ExecStartPre=/usr/local/mysql/bin/mysqld_pre_systemd
# Start main service
#以下启动方式也可以使用mysqld_safe程序,助于5.6主程序不支持--daemonize选项
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql
# Sets open_files_limit
LimitNOFILE = 5000
Restart=on-failure
PrivateTmp=false
RestartPreventExitStatus=1

三、关于5.7开启SSL连接讨论

  1. MySQL5.7默认是开启SSL连接,如果强制用户使用SSL连接,那么应用程序的配置也需要明确指定SSL相关参数,否则程序会报错。

  2. 虽然SSL方式使得安全性提高了,但是对于性能有相应影响,所以要谨慎选择,参考如下:

    1)对于非常敏感核心的数据,或者QPS(Queries Per Second)本来就不高的核心数据,可以采用SSL方式保障数据安全性;

    2)对于采用短链接、要求高性能的应用,或者不产生核心敏感数据的应用,性能和可用性才是首要,建议不要采用SSL方式;

注解:

[glibc]  glibc是GNU发布的libc库,即c运行库;glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/187298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ThinkPHP8 + Vue3 + element-ui-plus + 微信小程序(原生) + Vant2 的 BBS论坛系统设计【PHP课设】

一、BBS论坛功能描述 我做的是一个论坛类的网页项目&#xff0c;每个用户可以登录注册查看并发布文章&#xff0c;以及对文章的点赞和评论&#xff0c;还有文件上传和个人签名发布和基础信息修改&#xff0c;管理员对网站的数据进行统计&#xff0c;对文章和文件的上传以及评论…

AtomicReference原子引用类-线程安全

简介与作用&#xff1a; AtomicReference是Java中的一个原子类&#xff0c;它的主要作用是提供了一种原子操作的方式来更新对象的引用。它通常用于多线程环境下&#xff0c;用来解决并发访问共享对象时可能出现的竞态条件问题。 &#xff08;实际开发中用于某个数据模型更新&a…

小程序姓名:ssm+vue基本微信小程序的个人健康管理系统

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数…

83基于matlab 的时钟时间识别GUI

基于matlab 的时钟时间识别GUI。图像去除背景-转化为二值化图像-找出对应的直线边缘-找到秒针、分针、时针对应的直线&#xff0c;并算出斜率、角度-判断时间&#xff0c;分针与时针 &#xff08;度数&#xff09;。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运…

代码随想录算法训练营第30天|回溯总结 332. 重新安排行程

回溯是递归的副产品&#xff0c;只要有递归就会有回溯&#xff0c;所以回溯法也经常和二叉树遍历&#xff0c;深度优先搜索混在一起&#xff0c;因为这两种方式都是用了递归。 回溯法就是暴力搜索&#xff0c;并不是什么高效的算法&#xff0c;最多再剪枝一下。 回溯算法能解…

C语言—一维数组在内存中的存放

1、先看代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int arr[]{1,2,3,4,5,6,7,8,9,10}; int szsizeof(arr)/sizeof(arr[0]);int i0;for(i0;i<sz;i){printf("&arr[%d] %p\n",i,&arr[i]);}return 0; } 2、定…

JAVA毕业设计112—基于Java+Springboot+Vue的宠物领养社区小程序(源码+数据库)

基于JavaSpringbootVue的宠物领养社区小程序(源码数据库)112 一、系统介绍 本系统前后端分离带小程序 小程序&#xff08;用户端&#xff09;&#xff0c;后台管理系统&#xff08;管理员&#xff09; 小程序&#xff1a; 登录、注册、宠物领养、发布寻宠、发布领养、宠物社…

单文件组件MVVM

单文件组件&MVVM 所谓组件化开发&#xff0c;就是创建一个个组件。 Vue是一个大类&#xff0c;渲染一切从new Vue开始。 指定视图&#xff1a;el template render:jsx语法 $mount[数学公式] 编译App.vue&#xff0c;作为视图入口 单个组件&#xff1a;结构 样式 data compu…

Vatee万腾的科技探险:vatee数字化力量的前瞻征途

在Vatee万腾的科技探险中&#xff0c;我们领略到了一场数字化力量的前瞻征途&#xff0c;这是一次引领未来的创新之旅。Vatee万腾以其独特的科技理念和数字化力量&#xff0c;开启了一次引领行业的前瞻性征途&#xff0c;为数字化未来描绘出了崭新的篇章。 Vatee万腾的数字化力…

IIC驱动OLED(SSD1306) HAL库+CubeMX

一.IIC传输数据的格式 1.写操作 2.读操作 3.IIC信号 二. IIC底层驱动 1.重新初始化配置延时单元 //软件延时 void I2C_Delay(uint32_t t) {volatile uint32_t tmp t;while(tmp--); }void I2C_GPIO_ReInit(void) {/* 1. 使用结构体定义硬件GPIO对象 */GPIO_InitTypeDef GPIO…

十大排序之堆排序(详解)

文章目录 &#x1f412;个人主页&#x1f3c5;算法思维框架&#x1f4d6;前言&#xff1a; &#x1f380;堆排序 时间复杂度O(n*logn)&#x1f387;1. 算法步骤思想&#x1f387;2、动画演示&#x1f387;3.代码实现 &#x1f412;个人主页 &#x1f3c5;算法思维框架 &#x1…

Openwrt 包管理系统介绍

Openwrt 包管理系统介绍 1. OpenWrt简介1.1 主要特点1.2 开源嵌入式操作系统1.2.1 嵌入式系统概念1.2.2 嵌入式系统分类1.2.3 嵌入式系统——安卓1.2.4 嵌入式系统的对比 2 OpenWrt包管理系统2.1 工作原理2.2 OPKG命令2.2.1 命令用法2.2.2 软件包的管理2.2.3 查询信息2.2.4 选项…

设计测试用例的具体方法总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️白马沉河共歃誓&#xff0c;怒涛没城亦不悔 ☁️基于需求进行测试用例的设计 基…

vue3 for循环创建的多个e-form 添加校验

v-for 创建 ref <el-form :model"item" :rules"state.rules" :ref"el > getRiskSpreadRef(el, index)" ></el-form>// 定义ref list const riskSpreadRefList ref<HTMLElement[]>([]);// ref存到数组 const getRiskSpread…

初始linux:文件操作

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 linux的理念 一、echo echo "字符串" 二、输出重定向 > > [文件] echo "字符串" > [文件] echo "字符串" > > [文件] 制作大文件 三、< 输入重定向与ca…

【开源】基于JAVA的森林火灾预警系统

项目编号&#xff1a; S 019 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S019&#xff0c;文末获取源码。} 项目编号&#xff1a;S019&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟…

QT已有项目导入工程时注意事项

文章目录 从qt其他版本上开发的工程导入另一qt版本时 从qt其他版本上开发的工程导入另一qt版本时 这里以之前在qt5.12.2上开发的项目为例&#xff0c;现在到在qt6.5.3上运行。 不能直接导入IDE上&#xff0c;否则会报各种莫名奇妙的错误。 首先要把扩展名位.pro.user文件 删掉…

面试题:说说什么是本地缓存、分布式缓存以及多级缓存,它们各自的优缺点?

文章目录 前言一、缓存的概念&#xff08;什么是缓存&#xff09;二、为什么要用缓存&#xff08;为什么要用redis作为缓存&#xff09;三、缓存的分类有哪些1、本地缓存2、分布式缓存3、多级缓存 总结 前言 像MySql等传统的关系型数据库已经不能适用于所有的业务场景&#xf…

kubernetes使用nfs创建pvc部署mysql stateful的方法

kubernetes创建的pod默认都是无状态的&#xff0c;换句话说删除以后不会保留任何数据。 所以对于mysql这种有状态的应用&#xff0c;必须使用持久化存储作为支撑&#xff0c;才能部署成有状态的stateful. 最简单的方法就是使用nfs作为网络存储&#xff0c;因为nfs存储很容易被…

Leetcode—58.最后一个单词的长度【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—58.最后一个单词的长度 实现代码 int lengthOfLastWord(char* s) {int len strlen(s);int left 0, right 0;if(len 1) {return 1;}while(right < len) {if(right 1 < len) {if(s[right] && s[righ…