数据库与MySQL介绍
数据库与MySQL介绍
# [数据库笔记](https://cjux98v5y4.feishu.cn/drive/folder/V5O1fgdSUlZPFEdi8FAcXDKXnEq)
# 1.1 什么是数据库?
数据库是一个存放企业核心数据,使其存取高效以及存储安全的软件。
# 1.2 数据库种类
- 第一个时代:web1.0时代
RDBMS/关系型数据库:二维表格
产品:Oracle、MySQL、PG、MSSQL
特点:具有复杂功能性、追求极致数据一致性,降低了性能和可扩展性。
RDBMS:企业用户信息、订单信息、用户资金数据
- 第二个时代:移动时代
NoSQL 非关系型数据库
产品:Redis、MongoDB、Elasticsearch
特点:具备超高性能(内存)、可扩展、使用灵活,同时降低了数据一致性,
是RDBMS绝佳互补产品,可以容忍一定量数据丢失,但是必须高性能高并发.
- 第三个时代:NewSQL时代
DDBMS/分布式数据库解决方案: PinCAP\TiDB\PolarDB\TDSQL\OB\达梦
- 第四个时代:云数据库
RDS\PolarDB\TDSQL
# 1.3数据库趋势及特点
`https://db-engines.com/en/ranking`
# 1.4 MySQL/MariaDB优势
```
MySQL性能卓越,服务稳定,很少出现异常宕机的情况。
MySQL开放源代码且无版权制约,自主性强,且使用成本低。
MySQL历史悠久,社区及用户非常活跃,遇到问题,可以寻求帮助。
MySQL软件体积小,安装使用简单,并且易于维护,安装及维护成本低。
MySQL口碑效应,使得企业无需考虑就直接用之。
LAMP、 LNMP、 LNMT等流行Web架构都含有MySQL。
MySQL支持多种操作系统,提供多种API接口,支持多种开发语言。
```
# 2.1 MySQL版本背景与选择
1)MySQL版本发展背景
`https://mirrors.aliyun.com/mysql/`
2)企业版与社区版
3)社区版版本选择
大方向:GA,退后6-12月,前后没有太多小版本,作为选择.
5.6 : 5.6.40 + 双数版,经典版,官方即将停止更新.
5.7 : 5.7.22/30 + 双数版,主流,逐步过渡到8.0
8.0 : 8.0.26 + 双数版,开始评测,小规模边缘业务数据库使用.
本着眼当下和未来,因此,讲解以MySQL8.0为主,同时兼顾MySQL 5.7,并尽可能兼顾MySQL5.6,当
下互联网企业MySQL5.6正逐步淘汰, 5.7为绝对主流,8.0时代已到来。
# 2.2 MySQL安装方式及选择
1)数据库安装方式:
1.yum:简单、自动解决依赖(默认源没有数据库). 没法定制.
`https://www.cnblogs.com/oldboy666/p/15559963.html`
2.二进制:比较简单。没办法定制,软件大,* 中小企业
3.rpm:复杂、下载、手工解决依赖、没法定制
`https://www.cnblogs.com/oldboy666/p/15558992.html`
4.源码:特别复杂、编译软件gcc都需要升级,可定制任何东西.
大厂早期:百度\阿里===>改动源码===>编译==>rpm==>yum
# 2.3 MySQL软件获取
官方:`https://downloads.mysql.com/archives/community/`
国内镜像:`https://mirrors.aliyun.com/mysql/`
`https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz`
2.4 MySQL8.0.26企业级安装实践
## 1.硬件环境准备
vmware虚拟机环境学习,相应地则需准备如下内容:
1)VM虚拟机内存最好设置4GB以上。
2)提前下载好要安装的MySQL8.0软件包。
生产物理服务器:
SSD固态+Raid10(Raid5)
内存:64G/128G/256G
## 2.软件环境准备
```
#1)查看系统环境
[root@oldboy ~]# cat /etc/redhat-release #<==操作系统版本。
CentOS Linux release 7.9.2009 (Core)
#2)关闭selinux:
setenforce 0
getenforce
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
```
## 3.安装MySQL8.0
本书二进制方式安装MySQL,安装过程如下。
(1)建立MySQL用户账号
首先以root身份登录到Linux系统中,然后执行如下命令创建mysql用户账号:
```
[root@oldboy ~]# useradd mysql -s /sbin/nologin -M #<==创建mysql用户。
[root@oldboy ~]# id mysql
```
(2)下载、解压mysql软件包,并做好软链接mysql到/usr/local。
```
[root@oldboy ~]# cd /opt
[root@oldboy opt]# wget https://mirrors.aliyun.com/mysql/MySQL-8.0/mysql-8.0.26-
linux-glibc2.12-x86_64.tar.xz
[root@oldboy opt]# tar xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz
[root@oldboy opt]# ln -s /opt/mysql-8.0.26-linux-glibc2.12-x86_64
/usr/local/mysql
###mv /opt/mysql-8.0.26-linux-glibc2.12-x86_64 /usr/local/mysql
[root@oldboy opt]# ls -l /usr/local/mysql
```
(3)创建MySQL数据目录、配置文件(/etc/my.cnf)并授权
```
#1)增加简易配置文件,后面在优化
cat>/etc/my.cnf<<'EOF'
#by oldboy weixin:oldboy0102
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
port=3306
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOF
cat /etc/my.cnf
chown mysql.mysql /etc/my.cnf
#2)创建MySQL数据目录并授权
mkdir -p /data/3306/data
chown -R mysql.mysql /data
ls -ld /data
```
(4)配置PATH环境变量,并初始化MySQL数据库
```
#1) 配置PATH环境变量
echo 'export PATH=/usr/local/mysql/bin:$PATH' >>/etc/profile
. /etc/profile
echo $PATH
#2)初始化MySQL数据库
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --
basedir=/usr/local/mysql --datadir=/data/3306/data
重点知识1 : 之前不同版本的初始化命令异同
/usr/local/mysql/scripts/mysql_install_db #5.7之前
/usr/local/mysql/bin/mysqld #5.7和8.0初始化
重点知识2: --initialize和--initialize-insecure区别
--initialize: 会生成一个12位,4种密码复杂度临时管理员密码. 第一次登陆需要修改.
--initialize-insecure:管理员密码为空.
来自8.0官方翻译 by oldboy:
mysql_install_db程序已从MySQL发行版中删除。数据目录初始化应通过使用 --initialize 或--
initialize-insecure选项调用mysqld来执行。 此外,删除了mysql_install_db使用的mysqld选
项,并删除了控制mysql_install_db安装位置的选项。
#(5)初始化数据库的原理及结果说明
初始化数据库的实质就是创建基础的数据库系统的库文件等信息,例如:生成mysql库表等。
[root@db01 /opt]# ls /data/3306/data/ -l
total 176568
-rw-r----- 1 mysql mysql 56 Mar 7 16:40 auto.cnf
-rw------- 1 mysql mysql 1680 Mar 7 16:40 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Mar 7 16:40 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Mar 7 16:40 client-cert.pem
```
2.2.2配置并启动MySQL数据库
```
1.设置MySQL启动脚本
cd /usr/local/mysql/support-files/
cp mysql.server /etc/init.d/mysqld #<==拷贝mysql启动脚本到启动路径。
systemctl enable mysqld #<==等价chkconfig mysqld on(c7把服务设置开机自启动命令)
2.启动MySQL数据库
systemctl start mysqld
提示:使用kill -9 ID关闭数据库引起数据库故障案例
http://oldboy.blog.51cto.com/2561410/1431161。
3.检查MySQL数据库是否启动。
netstat -lntup|grep 330
4.查看MySQL数据库启动结果日志。
cat /data/3306/data/db01.err
2.2.3登录MySQL测试
执行登录命令如下:
mysql
```
2.2.4 MySQL安装常见故障分析及解决方案
```
问题1:初始化报错libaio
[root@oldboy opt]# mysqld --initialize-insecure --user=mysql --
basedir=/usr/local/mysql --datadir=/data/3306/data
mysqld: error while loading shared libraries: libaio.so.1: cannot open shared
object file: No such file or directory
原因:缺少libaio-devel依赖包
解决:yum install libaio-devel -y
如果不知道包名,可以执行 yum provides libaio -y查.
问题2: 初始化报错数据文件目录不为空
2021-11-09T04:08:57.631792Z 0 [ERROR] [MY-010457] [Server] --initialize
specified but the data directory has files in it. Aborting.
2021-10-09T04:08:57.631803Z 0 [ERROR] [MY-013236] [Server] The designated data
directory /data/3306/data/ is unusable. You can remove all files that the server
added to it.
解决:rm -rf /data/3306/data/*
问题3:启动后初始无法登录
[root@oldboy ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:
NO)
原因:此问题一般都是数据库初始化问题或者数据库文件损坏以及目录权限问题。
解决办法:删除初始化目录,然后重新初始化数据库,剩余过程不变。
rm -rf /data/3306/data/*
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --
datadir=/data/3306/data
Access denied问题原因:
1.数据库初始化问题
2.目录权限问题
3.系统数据库文件损坏
4.用户密码不对
5.授权的主机范围不对.
```
## 安装mysql5.7
```
#卸载系统自带的Mariadb
rpm -e --nodeps $(rpm -qa|grep mariadb)
#删除etc目录下的my.cnf ,一定要删掉,等下再重新建,
rm -rf /etc/my.cnf
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-5.7.36-el7-x86_64.tar.gz
tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
tar -xf mysql-5.7.36-el7-x86_64.tar.gz -C /usr/local/
mv /usr/local/mysql-5.7.36-el7-x86_64 /usr/local/mysql
#创建mysql 用户组和用户
groupadd mysql
useradd -r -g mysql mysql
#更改mysql目录下所有文件夹所属的用户组、用户以及权限
chown -R mysql:mysql /usr/local/mysql
chmod -R 755 /usr/local/mysql
#进入/usr/local/mysql/bin/目录,编译安装并初始化mysql
cd /usr/local/mysql/bin/
./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
```
#务必记住数据库管理员临时密码,如下图画红色框的部分。

```
#编写etc目录下的my.cnf 配置文件,并添加配置
cat > /etc/my.cnf <<EOF
[mysqld]
datadir=/usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=400
innodb_file_per_table=1
#表名大小写不明感,敏感为
lower_case_table_names=1
EOF
chmod -R 775 /etc/my.cnf
#添加软连接,并重启mysql 服务
ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
//启动mysql服务
service mysql start
```
#登录mysql ,密码就是初始化时生成的临时密码
```
[root@localhost bin]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#修改密码为root
mysql> set password for root@localhost = password('root');
#开放远程连接
mysql> use mysql;
mysql> update user set user.Host='%' where user.User='root';
mysql> flush privileges;
mysql> exit
Bye
```
设置开机自启
```
#将服务文件拷贝到init.d下,并重命名为mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
#赋予可执行权限
chmod +x /etc/init.d/mysqld
#添加服务
chkconfig --add mysqld
#显示服务列表
chkconfig --list
```
开放3306端口,测试本地客户端是否连接成功
```
#开放3306端口命令
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#配置立即生效
firewall-cmd --reload
```

第一次通过# `grep "password" /var/log/mysqld.log `命令获取MySQL的临时密码。用该密码登录到服务端后,必须马上修改密码,不然操作查询时报错误。
刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。如果想设置简单密码,如下操作:
- 方法一:首先,修改`validate_password_policy`参数的值
```
mysql> set global validate_password_policy=0; #定义复杂度
mysql> set global validate_password_length=1; #定义长度 默认是8
mysql> set password for 'root'@'localhost'=password('123456');
mysql> flush privileges;
```
- 方法二:在/etc/my.cnf 可关闭密码强度审计插件,重启mysql服务
`validate-password=ON/OFF/FORCE/FORCE_PLUS_PERMANENT`: 决定是否使用该插件(及强制/永久强制使用)。
## MySQL 5.7 主从复制的过程
### 步骤1:在主服务器上进行配置
1. **编辑配置文件:**
打开 MySQL 配置文件(通常是 `my.cnf` 或 `my.ini`),添加以下配置:
```
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW # 可选,建议使用 ROW 格式进行日志记录
```
2. **重启 MySQL 服务:**
重启 MySQL 以应用配置变更。
3. **创建用于复制的用户:**
连接到 MySQL 后,执行以下 SQL 语句:
```sql
CREATE USER 'repl'@'slave_ip' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slave_ip';
FLUSH PRIVILEGES;
```
4. **查看主服务器当前 binlog 文件名和位置:**
执行以下 SQL 语句并记录结果:
```sql
SHOW MASTER STATUS;
```
### 步骤2:在从服务器上进行配置
1. **编辑配置文件:**
打开 MySQL 配置文件,添加以下配置:
```
[mysqld]
server-id=2
```
2. **重启 MySQL 服务:**
重启 MySQL 以应用配置变更。
3. **连接主服务器进行复制:**
在 MySQL 中执行以下 SQL 语句(替换成主服务器的信息):
```sql
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.xxxx', -- 使用第一步中SHOW MASTER STATUS查到的值
MASTER_LOG_POS=xxx; -- 使用第一步中SHOW MASTER STATUS查到的值
```
4. **启动复制:**
执行以下 SQL 语句:
```sql
START SLAVE;
```
5. **检查复制状态:**
执行以下 SQL 语句,确保复制已成功启动:
```sql
SHOW SLAVE STATUS\G;
-- 这两个都为yes就是成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
```
### 注意事项:
- 确保主从服务器之间可以相互访问。
- 在实际操作中,注意替换示例中的服务器 IP、数据库名、用户名和密码等信息。
- 在部署前建议备份数据,避免意外情况导致数据丢失。
## [mysql8.0主从复制](https://www.cnblogs.com/xiaolindang/p/17840407.html)