MySQL-day2-数据库安装、多实例部署

MySQL数据库安装、多实例部署

一、数据库安装

  • MySQL数据库官网下载包地址
https://downloads.mysql.com/archives/community/

1、源码包方式安装(自定义目录安装)

1.安装依赖
[root@db01 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel

2.创建安装目录,上传并解压mysql安装包
[root@db01 ~]# mkdir /service
[root@db01 ~]# cd /service
[root@db01 service]# ll -h
total 31M
-rw-r--r-- 1 root root 31M Jan 29 15:09 mysql-5.6.46-源码包.gz
[root@db01 service]# tar xf mysql-5.6.46-源码包.gz
[root@db01 service]# rm -rf mysql-5.6.46-源码包.gz 
[root@db01 service]# cd mysql-5.6.46/

3.生成cmake	# 复制以下整段代码直接回车
[root@db01 mysql-5.6.46]# cmake . -DCMAKE_INSTALL_PREFIX=/service/mysql-5.6.46 \
-DMYSQL_DATADIR=/service/mysql-5.6.46/data \
-DMYSQL_UNIX_ADDR=/service/mysql-5.6.46/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=system \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
=================================每段意思解释=================================
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.38 \	# 程序存放位置
-DMYSQL_DATADIR=/application/mysql-5.6.38/data \	# 数据存放位置
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.38/tmp/mysql.sock \	# socket文件存放位置
-DDEFAULT_CHARSET=utf8 \	# 使用utf8字符集
-DDEFAULT_COLLATION=utf8_general_ci \	# 校验规则
-DWITH_EXTRA_CHARSETS=all \	# 使用其他额外的字符集
-DWITH_INNOBASE_STORAGE_ENGINE=1 \	# 支持的存储引擎
-DWITH_FEDERATED_STORAGE_ENGINE=1 \	# 支持的存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \	# 支持的存储引擎
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \	# 禁用的存储引擎
-DWITH_ZLIB=bundled \	# 启用zlib库支持(zib、gzib相关)
-DWITH_SSL=bundled \	# 启用SSL库支持(安全套接层)
-DENABLED_LOCAL_INFILE=1 \	# 启用本地数据导入支持
-DWITH_EMBEDDED_SERVER=1 \	# 编译嵌入式服务器支持
-DENABLE_DOWNLOADS=1 \	# mysql5.6支持了google的c++mock框架了,允许下载,否则会安装报错
-DWITH_DEBUG=0	# 禁用debug(默认为禁用)
=================================每段意思解释=================================

4.编译 make
[root@db01 mysql-5.6.46]# make

5.安装
[root@db01 mysql-5.6.46]# make install

6.做软连接
[root@db01 mysql-5.6.46]# ln -s /service/mysql-5.6.46 /service/mysql

7.创建mysql用户
[root@db01 mysql-5.6.46]# useradd mysql -M -s /sbin/nologin

8.拷贝配置文件和启动文件
[root@db01 mysql-5.6.46]# cd /service/mysql/support-files/	# 进入配置文件和脚本的目录
[root@db01 support-files]# \cp my-default.cnf /etc/my.cnf	# 拷贝配置文件

9.配置system管理MySQL服务,且重新加载启动文件列表
[root@db01 ~]# vim /usr/lib/systemd/system/mysql.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://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=/service/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

[root@db01 ~]# systemctl daemon-reload	# 重新加载启动文件列表

10.初始化数据库
[root@db01 ~]# cd /service/mysql/scripts/
[root@db01 scripts]# chmod +x mysql_install_db
[root@db01 scripts]# ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data

11.创建socket文件目录(二进制安装没有此步骤)
[root@db01 ~]# mkdir /service/mysql/tmp	# 先创建tmp目录

12.授权数据库目录
[root@db01 ~]# chown -R mysql.mysql /service

13.tem管理启动MySQL
[root@db01 ~]# systemctl start mysql
[root@db01 ~]# ps -ef | grep [m]ysql
mysql     39018      1 48 22:14 ?        00:00:01 /service/mysql/bin/mysqld --defaults-file=/etc/my.cnf
[root@db01 ~]# netstat -lntp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      39018/mysqld 

14.配置环境变量,可直接使用mysql
[root@db01 ~]# vim /etc/profile.d/mysql.sh 
export PATH=/service/mysql/bin:$PATH
[root@db02 ~]# source /etc/profile
[root@db01 ~]# mysql
mysql> 

15.修改root用户密码	# 默认root用户密码为空,有多种方式重置root密码(两种重置密码方式有区别)
[root@db01 ~]# mysql -u root -p
第二种:
MySQL > SET PASSWORD=PASSWORD('123456');
Query OK, 0 rows affected (0.00 sec)

第二种:
MySQL > grant all privileges on *.* to root@'%' identified by 'oldboy';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

第三种:附加
[root@db01 ~]# mysqladmin -uroot password '123'

PS:若提示报错:
ERROR 1054 (42S22): Unknown column 'password' in 'field list'# 报错原因:
	mysql数据库下已经没有password这个字段了,password字段改成了authentication_string

# 解决方法:
	将 password 字段改为 authentication_string 即可!
update MySQL.user set authentication_string=password('123') where user='root';

2、二进制方式安装(自定义安装目录)

1.安装依赖
[root@db01 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf

2.
[root@db01 ~]# rz mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
[root@db01 ~]# mkdir /service
[root@db01 ~]# cd /service
[root@db01 service]# ll -h
total 394M
-rw-r--r-- 1 root root 384M Jan 29 15:09 mysql-5.6.46-二进制包.gz
[root@db01 service]# tar xf mysql-5.6.46-二进制包.gz	# 解压
[root@db01 service]# rm -rf mysql-5.6.46-二进制包.gz	# 删除压缩包
[root@db01 service]# mv mysql-5.6.46-linux-glibc2.12-x86_64 mysql-5.6.46	# 改名
[root@db01 service]# ln -s mysql-5.6.46-linux-glibc2.12-x86_64 mysql	#创建软连接

3.创建数据库用户
[root@db01 ~]# useradd mysql -s /sbin/nologin -M

4.拷贝配置文件和启动文件
[root@db01 ~]# cd /service/mysql/support-files/
[root@db04 support-files]# \cp my-default.cnf /etc/my.cnf	# 拷贝配置文件
[root@db02 support-files]# cp mysql.server /etc/init.d/mysqld	# 拷贝启动脚本

5.初始化数据库
[root@db01 support-files]# cd /service/mysql/scripts/
[root@db01 scripts]# ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data 	# 执行初始化命令

6.启动数据库
[root@db01 scripts]# /etc/init.d/mysqld start
/etc/init.d/mysqld: line 244: my_print_defaults: command not found
/etc/init.d/mysqld: line 264: cd: /usr/local/mysql: No such file or directory
Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)

7.如果是二进制安装到自定义目录下,需要修改脚本目录
[root@db01 scripts]# sed -i 's#/usr/local#/service#g' /etc/init.d/mysqld /service/mysql/bin/mysqld_safe

8.授权数据库目录
[root@db01 ~]# chown -R mysql.mysql /service/mysql
[root@db01 ~]# chown -R mysql.mysql /service/mysql-5.6.46

9.再次启动
[root@db01 scripts]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/service/mysql/data/db04.err'.
 SUCCESS! 

10.检查进程和端口
[root@db01 scripts]# ps -ef | grep [m]ysql
root      23083      1  0 20:36 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/db01.pid
mysql     23191  23083  0 20:36 pts/0    00:00:00 /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=db01.err --pid-file=/usr/local/mysql/data/db01.pid
[root@db01 scripts]# netstat -lntp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      23191/mysqld 

11.配置system管理MySQL服务
[root@db01 ~]# vim /usr/lib/systemd/system/mysql.service	# 配置system管理MySQL
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://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=/service/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

[root@db01 ~]# systemctl daemon-reload	# 重新加载启动文件列表

12.system管理启动mysql	# 此时一定是启动失败的,因为不只有启动脚本里面指定了/usr/local,很多地方都有指定
[root@db01 ~]# systemctl start mysql	# system管理启动MySQL
[root@db01 ~]# ps -ef | grep [m]ysql
[root@db01 scripts]# grep -r '/usr/local' /service/mysql/*
    解决方如下两步:
    1)查看MySQL配置文件检索顺序
    [root@localhost mysql]# /service/mysql/bin/mysql --help|grep 'my.cnf'
                          order of preference, my.cnf, $MYSQL_TCP_PORT,
    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 

    2)配置my.cnf
    [root@db01 scripts]# vim /etc/my.cnf	# 配置指定数据库安装目录与数据目录
    [mysqld]
    basedir=/service/mysql
    datadir=/service/mysql/data

    [root@db01 scripts]# systemctl start mysql	# 再次启动即可成功

13.配置环境变量直接使用mysql
[root@db01 ~]# vim /etc/profile.d/mysql.sh 
export PATH=/service/mysql/bin:$PATH
[root@db01 ~]# source /etc/profile

3、Docker方式安装

参考:Docker服务安装
PS:容器外操作数据库,需yum安装MySQL客户端,无需启动MySQL客户端服务,即可使用MySQL命令,需加 -h选项指定容器数据库地址
PS:戳我安装MySQL客户端~,安装后无需启动MySQL服务只可直接使用mysql命令
PS:Docker方式安装5.7有兼容问题,故选择5.6版本,其差别不大~

1.拉取镜像
docker pull mysql:5.6

2.编辑配置
[root@myslq ~]# cat backup/my.cnf
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 	  # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
skip-name-resolve
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

3.挂载配置文件到容器并启动MySQL
docker run -d \
--name=mysql \
-e MYSQL_ROOT_PASSWORD=123456\
-e MYSQL_MAJOR=5.6 \
-v /home/mysql/:/var/lib/mysql \
-v /root/backup/my.cnf:/etc/mysql/my.cnf
-v /data/nfs/mysql/conf:/etc/mysql/conf.d \
-v /var/lib/mysql \
-p 3306:3306 \
--restart=no \
mysql:5.6

4.查看容器主机名并解析到宿主机
[root@myslq ~]# docker exec -it mysql bash
root@9a6fdf45add6:/# hostname 
9a6fdf45add6
root@9a6fdf45add6:/# exit
exit
[root@myslq ~]# echo '172.23.0.234    a6fdf45add6' >> /etc/hosts
[root@myslq ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.23.0.234	9a6fdf45add6

5.登录到数据库
[root@myslq ~]# mysql -h 172.23.0.234 -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
7 rows in set (0.00 sec)

4、YUM方式安装

1.配置MySQL的yum源
[root@db01 ~]# cat /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.7
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=0

2.检查存储库是否正确配置
[root@db01 ~]#  yum repolist enabled | grep mysql

3.禁用默认的MySQL模块
[root@db01 ~]# sudo yum module disable mysql

4.安装MySQL
[root@db02 ~]# yum install mysql-community-server

5.启动MySQL
[root@db01 ~]# service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]

6.检查MySQL运行状态
[root@db01 ~]# sudo service mysqld status

7.保护运行MySQL
[root@db01 ~]# mysql_secure_installation

5、YUM方式安装2

官网下载地址:戳我~

一键安装

wget https://dev.mysql.com/downloads/file/?id=509888
tar xf mysql-8.0.28-1.el8.x86_64.rpm-bundle.tar
rm -f mysql-8.0.28-1.el8.x86_64.rpm-bundle.tar
yum install -y ./*

检测安装

[root@k8s-master02 mysql]# mysql --version
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

在这里插入图片描述

二、数据库基本操作

1、MySQL设置密码

[root@db01 ~]# mysqladmin -uroot  password '123'

2、使用密码登录

1.正确登录命令
[root@db01 scripts]# mysql -uroot -p123
[root@db01 scripts]# mysql -u root -p123

2.错误登录命令
[root@db01 scripts]# mysql -u root -p 123

3.为什么有这个问题呢?
这是我从mysql官方文档拷过来的内容:

for password options, the password value is optional:
  If you use a -p or --password option and specify the password value, there must be no space between -p or --password= and the password following it.
  If you use a -p or --password option but do not specify the password value, the client program prompts you to enter the password. The password is not displayed as you enter it. This is more secure than giving the password on the command line. Other users on your system may be able to see a password specified on the command line by executing a command such as ps auxw. 

具体就是:对于password选项,此选项是可选的
如果你明确指定了-p或者--password的值,那么-p或者--password和密码值之间是不能有空格的。
如果你使用了-p或者--password选项但是没有给出password值,客户端程序提示您输入密码。

For mysql, the first nonoption argument is taken as the name of the default database. If there is no such option, mysql does not select a default database.

对于MySQL,第一个非选项参数被当作默认数据库的名称。如果没有这样的选项,MySQL就不会选择默认数据库。
也就是说在命令行中,你的mysql密码和-p或者--password参数之间有空格,mysql会认为你输入的是登录mysql后自动选择的数据库,而不是你所期望的密码

3、查询用户

[root@db01 scripts]# mysql -uroot -p123

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1       |
|      | db04      |
| root | db04      |
|      | localhost |
| root | localhost |
+------+-----------+
6 rows in set (0.00 sec)

4、删除用户

mysql> drop user root@'::1';
Query OK, 0 rows affected (0.01 sec)

mysql> drop user ''@db04;
Query OK, 0 rows affected (0.00 sec)

mysql> drop user 'root'@db04;
Query OK, 0 rows affected (0.00 sec)

mysql> drop user ''@localhost;
Query OK, 0 rows affected (0.00 sec)

三、企业误删除数据库用户故障解决

1、执行了误删除用户的命令

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | localhost |
+------+-----------+
2 rows in set (0.00 sec)

mysql> delete from mysql.user where 1=1;
Query OK, 2 rows affected (0.00 sec)

mysql> select user,host from mysql.user;
Empty set (0.00 sec)

2、用户删除不重启还是可以登录

1.删除用户后还是可以登录
[root@db01 ~]# mysql -uroot -p123

2.重启后不能登录
[root@db01 ~]# systemctl restart mysql

3、解决办法

1)停止数据库

[root@db01 ~]# systemctl stop mysql

2)跳过授权表和网络启动mysql

#1.跳过授权表启动mysql
[root@db01 ~]# mysqld_safe --skip-grant-tables &

这种情况下数据库谁都可以连接,很不安全,所以还有启动跳过网络,只允许本机连接
[root@db01 ~]# mysqladmin shutdown

#2.跳过授权表和网络启动mysql
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &

3)登录以后创建用户的方式?

#1.登录以后呢?创建用户?(跳过授权表不能创建用户)
mysql> create user root@'localhost';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

4)错误解决方式

#1.切换到mysql数据库
mysql> use mysql;

#2.插入一条用户数据
mysql> insert into user(user,host,password) values('root','localhost',PASSWORD(123));
ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
#该表中有的字段必须有默认值

#3.查看表结构
mysql> desc user;

#4.把默认值为空的都加一个空值(这种方式是错误的)
mysql> insert into user(user,host,password,ssl_cipher,x509_issuer,x509_subject) values('root','localhost',PASSWORD('123'),'','','');
Query OK, 1 row affected (0.00 sec)

#5.查看表内容
mysql> select * from user\G
权限全都是N,不能执行任何操作
[root@db01 ~]# mysqladmin shutdown
[root@db01 ~]# systemctl start mysql
[root@db01 ~]# mysql -uroot -p123
mysql> show databases;

mysql> create database oldboy;
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'oldboy'

5)正确解决方式

重启数据库,仍然以跳过授权表检查以及网络连接方式启动。
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &

#1.切换到mysql数据库
mysql> use mysql;

#2.插入一条用户数据
mysql> delete from mysql.user where 1=1;
Query OK, 2 rows affected (0.00 sec)

mysql> insert into mysql.user values ('localhost','root',PASSWORD('123'),
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'Y',
'',
'',
'',
'',
0,
0,
0,
0,
'mysql_native_password',
'',
'N');

#3.正常启动测试
[root@db01 ~]# mysqladmin shutdown
[root@db01 ~]# systemctl start mysql
[root@db01 ~]# mysql -uroot -p123
mysql> show databases;

4、另一种解决方式

mysql> grant all on *.* to root@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
#用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问

mysql> select * from user\G

#以上授权方式该用户没有grant权限,必须加上
mysql> grant all on *.* to root@'localhost' identified by '123' with grant option;
Query OK, 0 rows affected (0.00 sec)

#或者update那一条N
mysql> update mysql.user set Grant_priv='Y' where user='root' and host='localhost';

四、mysql体系结构管理

1、客户端与服务器模型

1)mysql是一个典型的C/S服务结构

1.mysql自带的客户端程序(/service/mysql/bin)
	mysql
	mysqladmin
	mysqldump

2.mysqld一个二进制程序,后台的守护进程
	单进程
	多线程

2)MySQL的两种连接方式

1.TCP/IP的连接方式
2.套接字连接方式,socket连接

#查看连接方式
mysql> status;
--------------
Connection:		Localhost via UNIX socket

3.举例:
	3.1.TCP/IP连接
	mysql -uroot -p -h127.0.0.1
	mysql -uroot -p -h127.0.0.1 -S /tmp/mysql.sock
	
	3.2.socket连接
	mysql -uroot -p -hlocalhost
	mysql -uroot -p123(默认连接方式,socket)
	
4.注意:
	4.1.因为使用TCP/IP连接,需要建立三次握手
	4.2.不一定-h都是tcp,-hlocalhost是socket连接

五、mysql服务构成

1、实例

1.MySQL的后台进程+线程+预分配的内存结构。
2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。

1.什么是实例?
	一个进程 + 多个线程 + 预分配内存空间
2.多实例?
	多个进程 + 多个线程 + 多个预分配的内存空间

2、mysqld服务器程序构成

mysqld是一个守护进程但是本身不能自主启动
[root@db04 ~]# /etc/init.d/mysqld start

1)连接层

1.验证用户的合法性
2.提供两种连接方式(TCP/IP  socket)
3.建立一个与SQL层交互的线程

2)sql层

1.接收连接层传来的SQL语句
2.验证语法
3.验证语义(DML,DDL,DCL,DQL) 检查你输入的SQL语句是 select insert update delete... grant
4.解析器:解析你的SQL语句,生成多种执行计划
5.优化器:接收解析器传来的多种执行计划,选择最优的一种
6.执行器:将优化器选择出的最优的SQL,执行
	6.1 建立一个与存储引擎层 交互的线程
	6.2 将执行语句交给存储引擎层,取数据 接收存储引擎层,结构化成表的数据结果
7.如果你的前端有缓存,写缓存
8.记录日志(binlog)

3)存储引擎层

1.接收到SQL层传来的SQL语句
2.与磁盘交互,取数据,结构化成表的形式,返回给SQL层
3.建立一个与SQL层交互的线程

六、mysql的结构

1、MySQL的逻辑结构

类似于linux命令:
1.库
2.表:元数据+真实数据行
3.元数据:列+其它属性(行数+占用空间大小+权限)
4.列:列名字+数据类型+其他约束(非空、唯一、主键、非负数、自增长、默认值)

MySQL逻辑结构与Linux系统对比

MySQLLinux
目录
show databases;ls-l /
use mysqlcd /mysql
文件
show tables;ls
二维表=元数据+真实数据行文件=文件名+文件属性

2、MySQL的物理结构

mysql就是最底层的数据文件,可以手动在data目录下创建目录,在数据库里面可以看到
1)MySQL的最底层的物理结构是数据文件,也就是说,存储引擎层,打交道的文件,是数据文件。
2)存储引擎分为很多种类(Linux中的FS)
3)不同存储引擎的区别:存储方式、安全性、性能

#注意:开发时,数据库的库名和表名都要小写,因为很多研发使用第三方工具连接数据库,而windows不区分大小写,linux区分大小写,很容易读写错数据库;
	
#可以调整数据库不区分大小写:
mysql> show variables like '%lower%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.00 sec)
#可以修改配置文件来让数据库不区分大小写
[root@db04 ~]# vim /etc/my.cnf
[mysqld]
lower_case_table_names=1
[root@db04 ~]# systemctl restart mysql

3、mysql的物理结构单位

1.段:理论上一个表就是一个段,由多个区构成,(分区表是一个分区一个段)
2.区:连续的多个页构成
3.页:最小的数据存储单元,默认是16k
4.分区表:一个区构成一个段就是一个表
	数据源库经常会进行拆分,横向拆分和竖向拆分,逻辑上划分区域,而分区表是将数据页构成的区单独拆出一个表

七、mysql的多实例

NGINX多实例就是多个配置文件
mysql多实例:
	1.多个数据目录
	2.多个端口
	3.多个socket文件
	4.多个日志文件

1、创建多个数据目录

[root@db01 ~]# mkdir /data/{3307,3308,3309} -p

2、准备多个配置文件

[root@db01 data]# vim /data/3307/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3307/data
port=3307
socket=/data/3307/mysql.sock
log-error=/data/3307/data/mysql.err
log-bin=/data/3307/data/mysql-bin
server_id=7

-------------------------------------------
	
[root@db01 data]# vim /data/3308/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/data/mysql.err
log-bin=/data/3308/data/mysql-bin
server_id=8

--------------------------------------------

[root@db01 data]# vim /data/3309/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3309/data
port=3309
socket=/data/3309/mysql.sock
log-error=/data/3309/data/mysql.err
log-bin=/data/3309/data/mysql-bin
server_id=9

3、初始化多套数据目录

[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
	
[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data

[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data

#使用tree可以查看
[root@db01 scripts]# tree -L 3 /data

4、授权目录

[root@db01 scripts]# chown -R mysql.mysql /data

5、启动数据库

[root@db01 scripts]# mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3308/my.cnf &
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf &

6、启动数据库报错解决

出现此报错是因为swap分区空间不足导致!

1.运行命令出现如下提示
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf & 失败!
“mysqld_safe mysqld from pid file /data/3309/data/web03. exepid”	# 若出现此提示
	# 错误原因:是由于swap分区可用内存不够了,只需增加一下swap空间内存就可以了!

2.查看错误日志
[root@db01 ~]# mysqld_safe --defaults-file=/data/3309/my.cnf & 失败!
2021-02-25 04:39:03 4462 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
									# 无法为缓冲池分配内存
2021-02-25 04:39:03 4462 [ERROR] Plugin 'InnoDB' init function returned error.
									# 插件'InnoDB' init函数返回错误。
2021-02-25 04:39:03 4462 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
									# InnoDB插件作为存储引擎注册失败。
2021-02-25 04:39:03 4462 [ERROR] Unknown/unsupported storage engine: InnoDB
									# 未知/不支持的存储引擎:InnoDB
2021-02-25 04:39:03 4462 [ERROR] Aborting

3.解决方法如下:
sudo dd if=/dev/zero of=/swapfiles bs=1M count=1024	# 吐一个如此大的临时交换分区文件
sudo mkswap  /swapfiles 	# 制作临时swap交换分区
sudo swapon /swapfiles	# 开启临时swap交换分区
mysqld_safe --defaults-file=/data/3309/my.cnf &	# 再次启动测试,成功!

PS:详情参考 https://www.copylian.com/technology/96.html 解决方法参考此文档!

7、检查启动

[root@db01 scripts]# netstat -lntup|grep 330
tcp6       0      0 :::3306                 :::*                    LISTEN      25477/mysqld        
tcp6       0      0 :::3307                 :::*                    LISTEN      25550/mysqld        
tcp6       0      0 :::3308                 :::*                    LISTEN      25722/mysqld        
tcp6       0      0 :::3309                 :::*                    LISTEN      25894/mysqld     

8、多实例设置密码

[root@db01 scripts]# mysqladmin -uroot -S /data/3307/mysql.sock password '3307'
[root@db01 scripts]# mysqladmin -uroot -S /data/3308/mysql.sock password '3308'
[root@db01 scripts]# mysqladmin -uroot -S /data/3309/mysql.sock password '3309'

9、多实例验证

[root@db01 scripts]# mysql -uroot -p3307 -S /data/3307/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 7     |
+---------------+-------+
	
[root@db01 scripts]# mysql -uroot -p3308 -S /data/3308/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 8     |
+---------------+-------+
	
[root@db01 scripts]# mysql -uroot -p3309 -S /data/3309/mysql.sock -e "show variables like 'server_id';"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 9     |
+---------------+-------+

10、连接多实例小技巧

[root@db01 scripts]# vim /usr/bin/mysql3309
mysql -uroot -p3309 -S /data/3309/mysql.sock
[root@db01 scripts]# vim /usr/bin/mysql3308
mysql -uroot -p3308 -S /data/3308/mysql.sock
[root@db01 scripts]# vim /usr/bin/mysql3307
mysql -uroot -p3307 -S /data/3307/mysql.sock
	
[root@db01 scripts]# chmod +x /usr/bin/mysql*

八、作业

1.将多实例3307,3308 做成3309的从库
2.画图,mysqld的程序结构
3.整理今天所有的理论.
posted @ 2022-06-09 18:19  秋风お亦冷  阅读(47)  评论(0编辑  收藏  举报