linux12 -MYSQL数据库 -->02数据库安装、多实例部署

文章目录

      • MySQL数据库安装、多实例部署
        • 一、数据库安装
          • MySQL数据库官网下载包地址
        • MYSQL安装
        • 1、源码包安装(自定义目录安装---> Source Code)
        • 2、二进制安装(自定义安装目录 ---> Linux - Generic)
        • 3、YUM安装
        • 4、排除
        • 5. 统一字符编码
        • 6、初识sql语句
          • sql语句
        • 7、配置文件
      • 二、数据库基本操作
        • 1、MySQL设置密码
        • 2、使用密码登录
        • 3、查询用户
        • 4、删除用户
      • 三、企业误删除数据库用户故障解决
        • 1、执行了误删除用户的命令
        • 2、用户删除不重启还是可以登录
        • 3、解决办法
          • 1)停止数据库
        • 2)跳过授权表和网络启动mysql
        • 3)登录以后创建用户的方式?
        • 4)错误解决方式
        • 5)正确解决方式
        • 4、另一种解决方式
      • 四、mysql体系结构管理
        • 1、客户端与服务器模型
          • 1)mysql是一个典型的C/S服务结构
          • 2)MySQL的两种连接方式
      • 五、mysql服务构成
        • 1、实例
        • 2、mysqld服务器程序构成
          • 1)连接层
          • 2)sql层
          • 3)存储引擎层
      • 六、mysql的结构
        • 1、MySQL的逻辑结构
        • 2、MySQL的物理结构
        • 3、mysql的物理结构单位
      • 七、mysql的多实例
        • 1、创建多个数据目录 (源码包数据机器安装)
        • 2、准备多个配置文件
        • 3、授权目录
        • 4、初始化多套数据目录
        • 5、启动数据库
        • 6、启动数据库报错解决
        • 7、检查启动
        • 8、多实例设置密码
        • 9、多实例验证
        • 10、连接多实例小技巧
      • 八、基础配置文件(优化字符设)

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

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

www.mysql.coom

linux12 -MYSQL数据库 -->02数据库安装、多实例部署_第1张图片

linux12 -MYSQL数据库 -->02数据库安装、多实例部署_第2张图片

linux12 -MYSQL数据库 -->02数据库安装、多实例部署_第3张图片
linux12 -MYSQL数据库 -->02数据库安装、多实例部署_第4张图片

MYSQL安装
# 1、数据库一般情况下不会直接使用最新的版本
(如果出现未知错误,一般情况下是使用的某一些模块或者软件兼容性问题) 
1、源码包安装(自定义目录安装—> Source Code)
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@db02 service]# ll
drwxr-xr-x 40 mysql mysql 4096 Jun 18 23:54 mysql-5.6.46 #源码包
[root@db01 service]# tar xf mysql-5.6.46.tar.gz 
[root@db01 service]# mv mysql-5.6.46.tar.gz /tmp/ #移动源码安装包到 /tmp/目录下
[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=utf8mb4mb4 \
-DDEFAULT_COLLATION=utf8mb4mb4_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=/service/mysql-5.6.46 \	# 程序存放位置
-DMYSQL_DATADIR=/service/mysql-5.6.46/data \	# 数据存放位置
-DMYSQL_UNIX_ADDR=/service/mysql-5.6.46/tmp/mysql.sock \	# socket文件存放位置
-DDEFAULT_CHARSET=utf8mb4mb4 \	# 使用utf8mb4字符集
-DDEFAULT_COLLATION=utf8mb4mb4_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 

# make && make install  #make -j 系统内核带不动,所以推荐make

# 说明:如果cmake出错,需要执行make clean; rm -f CMakeCache.txt

# 注:如果make到63%左右出现错误:

make[2]: * [storage/perfschema/unittest/pfs_connect_attr-t] Error 1

make[1]: * [storage/perfschema/unittest/CMakeFiles/pfs_connect_attr-t.dir/all] Error 2

# 则:cmake去掉-DWITH_PARTITION_STORAGE_ENGINE=1参数重新编译
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.创建socket文件目录(二进制安装没有此步骤)
[root@db01 ~]# mkdir /service/mysql/tmp	 # 先创建tmp目录,否则启动不了mysql

11.初始化数据库
[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
12.授权数据库目录
[root@db01 ~]# chown -R mysql.mysql /service/
13、添加环境变量
[root@db01 scripts]# vim /etc/profile.d/mysql.sh 
export PATH=/service/mysql/bin:$PATH
[root@db02 scripts]# source /etc/profile
14.systemctl管理启动MySQL并检测
[root@db02 scripts]# systemctl enable --now mysql.service

[root@db02 scripts]# netstat -lntp     
tcp6       0      0 :::3306                 :::*                    LISTEN      44801/mysqld


===================================================================================
15.修改root用户密码 # 默认root用户密码为空,有多种方式重置root密码(两种重置密码方式有区别)
第一种:
[root@db01 ~]# mysqladmin -uroot password '123'
第二种:
MySQL > update mysql.user set password=password("123") where user="root" and host="localhost";  #推荐第二种
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
第三种:
MySQL > grant all privileges on *.* to root@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
[root@db01 ~]# mysql -u root -p
第四种:
MySQL > SET PASSWORD=PASSWORD('123'); #或者直接输入密码
Query OK, 0 rows affected (0.00 sec)
2、二进制安装(自定义安装目录 —> Linux - Generic)
1.安装依赖
[root@db03 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf

2.上传并解压安装包
[root@db03 ~]# rz mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
[root@db03 ~]# mkdir /service
[root@db03 ~]# cd /service
[root@db03 service]# ll
total 393732
-rw-r--r-- 1 root root 403177622 Jun 19 17:01 mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
[root@db01 service]# tar xf mysql-5.6.46-二进制包.gz	# 解压
[root@db03 service]# mv mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz /tmp/ # 移动到tmp目录下,莫轻易删除
[root@db03 service]# mv mysql-5.6.46-linux-glibc2.12-x86_64 mysql-5.6.46	# 改名
[root@db03 service]# ln -s mysql-5.6.46/ 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@db03 scripts]# sed -i 's#/usr/local#/service#g' /etc/init.d/mysqld /service/mysql/bin/mysqld_safe

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

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

# 如果启动失败执行6和7这两步

9.检查进程和端口
[root@db03 scripts]# netstat -lntp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      23191/mysqld 

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

11.配置system管理MySQL服务
[root@db03 ~]# 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@db03 ~]# systemctl daemon-reload	# 重新加载启动文件列表


12.system管理启动mysql	# 此时一定是启动失败的,因为不只有启动脚本里面指定了/usr/local,很多地方都有指定
[root@db03 ~]# systemctl start mysql	# system管理启动MySQL
[root@db03 ~]# ps -ef | grep [m]ysql
[root@db03 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@db03 scripts]# vim /etc/my.cnf	# 配置指定数据库安装目录与数据目录
    [mysqld]
    basedir=/service/mysql
    datadir=/service/mysql/data

[root@db03 mysql]# systemctl enable --now mysql # 再次启动即可成功
3、YUM安装
1.配置MySQL的yum源
[root@db01 ~]# cat /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.7
[mysql56-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
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 ~]# systemctl enable --now mysqld

6.检查MySQL运行状态
[root@db01 yum.repos.d]# netstat -lntp       
tcp6       0      0 :::3306                 :::*                    LISTEN      8200/mysqld            
7.保护运行MySQL
[root@db01 ~]# mysql_secure_installation
========================================================================
# mysql5.7版本之后的密码必须看日志,而且密码必须是复杂密码。大小写、数字、特殊字符

[root@db01 yum.repos.d]# grep 'temporary ' /var/log/mysqld.log   #过滤出密码
2021-07-09T13:09:04.718198Z 1 [Note] A temporary password is generated for root@localhost: dt=(2_NyrpEo
2021-07-09T13:09:07.268758Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
[root@db01 yum.repos.d]# mysql -uroot -p"dt=(2_NyrpEo"  #进入数据库

mysql> set password=password("Mm2021@Ping"); #修改密码,必须加一个引号,要不然字符编码
Query OK, 0 rows affected, 1 warning (0.00 sec)

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

4、排除
# 1、数据库报错1054
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' and host='localhost';


# 2、数据库报错1045 

# 安装mysql 1405报错
[root@db01 yum.repos.d]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
[root@db01 yum.repos.d]# vim /etc/my.cnf
skip-grant-tables # 添加这行命令
[root@db01 yum.repos.d]# systemctl restart mysqld

# 3、报错3309
mysql_upgrade -u root -p
回车2下  完事后重新启动
systemctl restart mysqld
进入数据库执行
use mysql;
select user,host from mysql.user;
flush privileges;
grant all on *.* to root@'localhost' identified by '123';
# 4、报错1820
mysql执行语句报错
mysql> use mysql;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

提示要用ALTER USER修改密码才可以 但是如果想要设置非常简单的密码,比如123456会提示密码不符合要求

mysql> alter user 'root'@'localhost' identified by '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

/ /  但是修改这个参数会报错,没有这个系统变量
mysql> set global validate_password_policy=0;
ERROR 1193 (HY000): Unknown system variable 'validate_password_policy'

添加参数
这个时候就得去修改一下mysql的配置文件

[root@zheng ~]# vi /etc/my.cnf
[mysqld]      ## 在mysqld文本段里添加这两行
#添加密码验证插件
plugin-load-add=validate_password.so

#服务器在启动时加载插件,并防止在服务器运行时删除插件
validate-password=FORCE_PLUS_PERMANENT

"/etc/my.cnf" 34L, 1167C written
[root@zheng ~]# systemctl restart mysqld            / /  修改完重启mysql
[root@zheng ~]# mysql -uroot -p
Enter password:   密码123

# 修改参数值
修改validate_password_policy参数的值
validate_password_length(密码长度)参数默认为8,我们修改为1

mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)

mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql安装成功
mysql> show databases;        /  /  这里就可以正常使用了
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

# 1819报错
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
 # 报错内容
mysql> grant all privileges on *.* to root@'%' identified by '[email protected]';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

mysql> set global validate_password_length=4; #密码长度
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_policy=0; 
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to root@'%' identified by '123456'; #再次修改密码

Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges; # 刷新
5. 统一字符编码
#1. 修改配置文件
[mysqld]
default-character-set=utf8mb4 
[client]
default-character-set=utf8mb4 
[mysql]
default-character-set=utf8mb4

#mysql5.5以上:修改方式有所改动
[mysqld]
character-set-server=utf8mb4   
collation-server=utf8mb4_general_ci
[client]  #添加这一行
default-character-set=utf8mb4 # 添加这一行
[mysql] # 添加这一行
default-character-set=utf8mb4  #添加这一行
删除或注释最后一行
# sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

#2. 重启服务
#3. 查看修改结果:
\s
show variables like '%char%'

[root@db02 ~]# egrep '^[^#]' /etc/my.cnf
[mysqld]
character-set-server=utf8mb4        #增加这两行
collation-server=utf8mb4_general_ci #增加这两行
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
6、初识sql语句
有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的客户端,或者其他模块来连接到mysqld,然后使用mysql软件规定的语法格式去提交自己命令,实现对文件夹或文件的管理。该语法即sql(Structured Query Language 即结构化查询语言)

SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。SQL语言分为3种类型:
#1、DDL语句    数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
#2、DML语句    数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
#3、DCL语句    数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
sql语句
#1. 操作文件夹
mysql> show variables like '%char%'; #字符编码
+--------------------------+---------------------------------------+
| Variable_name            | Value                                 |
+--------------------------+---------------------------------------+
| character_set_client     | utf8                                  |
| character_set_connection | utf8                                  |
| character_set_database   | utf8mb4                               |
| character_set_filesystem | binary                                |
| character_set_results    | utf8                                  |
| character_set_server     | utf8mb4                               |
| character_set_system     | utf8                                  |
| character_sets_dir       | /service/mysql-5.6.46/share/charsets/ |
+--------------------------+---------------------------------------+
8 rows in set (0.00 sec)
mysql> create database wordpress charset utf8mb4;#增加
Query OK, 1 row affected (0.00 sec)

mysql> show create database wordpress; #查看
+-----------+-----------------------------------------------------------------------+
| Database  | Create Database                                                       |
+-----------+-----------------------------------------------------------------------+
| wordpress | CREATE DATABASE `wordpress` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+-----------+-----------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> alter database wordpress charset gbk; #修改
Query OK, 1 row affected (0.01 sec)

mysql> show databases; #查看
+--------------------+
| Database           |
+--------------------+
| information_schema |  # 虚拟的库(权限信息、字符信息)
| mysql              |  # 授权库,主要存储系统用户的权限信息
| performance_schema |  # 记录处理查询请求时发生的各种事件、锁等现象 
| test               |  # MySQL数据库系统自动创建的测试数据库
| wordpress          |
     

#2. 操作文件
Database changed
mysql> 
mysql> create database mm01 charset utf8mb4;#增加
Query OK, 1 row affected (0.00 sec)

mysql> use mm01; #切换到mm01表中
Database changed
mysql> create table t1(it int,name varchar(16)); #增加表
Query OK, 0 rows affected (0.04 sec)

mysql> desc t1; #查看方式一
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| it    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(16) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> show create table t1; #查看方式二
+-------+----------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                               |
+-------+----------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `it` int(11) DEFAULT NULL,
  `name` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter table t1 modify name varchar(20); #修改
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> drop table t1; #删除
Query OK, 0 rows affected (0.00 sec)

mysql> show tables; #查看表
Empty set (0.00 sec)
+---------------+
| Tables_in_db1 |
+---------------+
| t1            |

mysql> select database();  #查看当前路径
+------------+
| database() |
+------------+
| db1        |
+------------+
1 row in set (0.00 sec)

mysql> alter table t1 rename t2; #更改名字
Query OK, 0 rows affected (0.00 sec)

mysql> desc t2; #查看
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(11) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> alter table t2 modify name varchar(22);  #更改表的内容
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 
mysql> desc t2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(22) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)

mysql> alter table t2 change name mv varchar(20); #更改名字和内容
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc t2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| mv    | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

=============================================================================
# 记录:
==============================================================================

#3. 操作文件中的内容/记录
mysql> use mm01;  #切换到表中
Database changed

mysql> insert mm01.t1 values(1,"mm"),(2,"kk"); #增加(mm01.t1是绝对路径)
mysql> insert db1.t1(id,name) values(3,"ming"); #这样也可以
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from mm01.t1; #查看一
mysql> select id,name from db1.t1;  # 查看二
+------+------+
| id   | name |
+------+------+
|    1 | mm   |
|    2 | kk   |
+------+------+
2 rows in set (0.00 sec)

mysql> update mm01.t1 set name="kk" where id=2; #修改一
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

mysql> select id,name from mm01.t1 where id=2; # 查看
+------+------+
| id   | name |
+------+------+
|    2 | kK   |
+------+------+
1 row in set (0.00 sec)

mysql> truncate mm01.t1; #清空表
Query OK, 0 rows affected (0.01 sec)


        增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
        查:select * from t1;
		  select id,name from mm01.t1;
		  select id,name from mm01.t1 where id=3;
		  select id,name from mm01.t1 where id<3;
        改:update t1 set name='sb' where id=2;
        删:delete from t1 where id=1;

        清空表:
        
            truncate table t1;数据量大,删除速度比上一条快,且直接从零开始,# (推荐)
        	delete from db1.t1;  -- # 不要这么做
            delete from t1; #如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
        
            auto_increment 表示:自增
            primary key 表示:约束(不能重复且不能为空);加速查找
7、配置文件
[root@db01 ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
character-set-server=utf8mb4   
collation-server=utf8mb4_general_ci
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
#skip-grant-tables
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

plugin-load-add=validate_password.so
validate-password=FORCE_PLUS_PERMANENT

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=utf8mb4
 
[mysql] 
user="root"
password="123456"
default-character-set=utf8mb4

二、数据库基本操作

1、MySQL设置密码
方式一:[root@db04 ~]# mysqladmin -uroot  password '123'  #不指定端口的情况下默认是3306

方式二:mysql> update mysql.user set PASSWORD=password('123') where user='root';   #在数据库内直接编辑user表来指定用户设置密码
        mysql>flush privileges;  #授权要刷新授权
方式三:mysql> set password for root@localhost = password('123');   #在数据库内直接用set password命令指定用户设置密码

方式四:mysql>grant all on *.* to 'root'@'localhost' identified by '123';   #在数据库内用授权密令直接给用户加上密码 
       mysql>flush privileges;  #授权要刷新授权
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;  # 第一种
mysql> \s;  # 第二种
--------------
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系统对比

MySQL Linux
目录
show databases; ls-l /
use mysql cd /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@db02 ~]# mkdir /data/{3307,3308,3309} -p

2、准备多个配置文件
[root@db02 data]# vim /data/3307/my.cnf
[mysqld]
basedir=/service/mysql
# 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@db02 data]# vim /data/3308/my.cnf
[mysqld]
basedir=/service/mysql
# basedir=/usar/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@db02 data]# vim /data/3309/my.cnf 
[mysqld]
basedir=/service/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@db02 3307]# chown -R mysql.mysql /data/

4、初始化多套数据目录
[root@db02 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3307/data
	
[root@db02 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3308/data

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

# 显示OK 数据库就初始化OK

#使用tree可以查看
[root@db02 scripts]# tree -L 3 /data/
/data/
├── 3307
│   ├── data
│   └── my.cnf
├── 3308
│   ├── data
│   └── my.cnf
└── 3309
    ├── data
    └── my.cnf

6 directories, 3 files

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 &

# 推荐这种启动
[root@db02 bin]# ./mysqld --defaults-file=/data/3307/my.cnf --user=mysql &
[root@db02 bin]# ./mysqld --defaults-file=/data/3308/my.cnf --user=mysql &
[root@db02 bin]# ./mysqld --defaults-file=/data/3309/my.cnf --user=mysql &

6、启动数据库报错解决
出现此报错是因为swap分区空间不足导致!  # 真实环境中不需要添加,无需担心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=2M 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 33*
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@db02 scripts]# mysqladmin -uroot -S /data/3307/mysql.sock password '3307'
[root@db02 scripts]# mysqladmin -uroot -S /data/3308/mysql.sock password '3308'
[root@db02 scripts]# mysqladmin -uroot -S /data/3309/mysql.sock password '3309'


# 方式一
[root@db02 ~]# mysqladmin -uroot password '123'  # 不指定端口的情况下默认是3306

# 方式二
mysql> update mysql.user set PASSWORD=password('123') where user='root'; 
#在数据库内直接编辑user表来指定用户设置密码
# 方式三
mysql> set password for root@localhost = password('123');  
#在数据库内直接用set password命令指定用户设置密码
# 方式四
mysql>grant all on *.* to 'root'@'localhost' identified by '123';  
#在数据库内用授权密令直接给用户加上密码 
 mysql>flush privileges;  #授权后要刷新授权


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@db02 scripts]# vim /usr/bin/mysql3309
mysql -uroot -p3309 -S /data/3309/mysql.sock
[root@db02 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@db02 scripts]# chmod +x /usr/bin/mysql*

# 连接数据库 
[root@db02 scripts]# mysql -h 127.0.0.1 -P 3307  -uroot -p  # 大P指定端口 #小p指定密码

# 必须加上-h,否则报错

八、基础配置文件(优化字符设)

[root@db01 system]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

#skip-grant-table #跳过密码使用


# 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/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
default-character-set=utf8mb4
# include all files from the config directory
!includedir /etc/my.cnf.d

#[client]
#default-character-set=utf8mb4

你可能感兴趣的:(MYSQLl数据库,mysql)