4.mysql命令

一、mysql连接管理

1.连接工具

1)mysql自带的连接命令 mysql

mysql
#常见的特定于客户机的连接选项:
-u:             指定用户  mysql -uroot
-p:             指定密码  mysql -uroot -p567
-h:             指定主机域  mysql -uroot -p567 -h127.0.0.1
-P:             指定端口    mysql -uroot -p567 -h127.0.0.1 -P3307
-S:             指定socket文件 mysql -uroot -p567 -S /tmp/mysql.sock
-e:             指定SQL语句(库外执行SQL语句) mysql -uroot -p567 -e "show databases;"
#--protocol:      指定连接方式 mysql --protocol=TCP  --protocol=socket

2)第三方的连接工具

1.sqlyog
2.navicat
#注意:数据库是没有外网的,想连接可以使用通道
3.应用程序连接MySQL
#注意:需要加载对应语言程序的API

2.连接方式

1) socket连接

mysql -uroot -poldboy123 -S /service/mysql/tmp/mysql.sock
mysql -uroot -poldboy123

2) TCP/IP

mysql -uroot -poldboy123 -h10.0.0.51 -P3306

二、MySQL启动关闭流程

1.启动数据库

/etc/init.d/mysqld start ------> mysql.server ------> mysqld_safe ------> mysqld
systemctl start mysql ------> mysqld_safe ------> mysqld
mysqld_safe --defaults-file=/etc/my.cnf ------> mysqld_safe ------> mysqld

2.停止数据库

/etc/init.d/mysqld stop
systemctl stop mysqld
mysqladmin -uroot -p123 shutdown

#不建议使用
kill -9 pid
killall mysqld
pkill mysqld
#出现问题:
1.如果在业务繁忙的情况下,数据库不会释放pid和sock文件
2.号称可以达到和Oracle一样的安全性,但是并不能100%达到
3.在业务繁忙的情况下,丢数据(补救措施,高可用)

三、MySQL实例初始化配置

1.初始化配置文件的作用

1.预编译:cmake去指定,硬编码到程序当中去

2.在命令行设定启动初始化配置
--skip-grant-tables 
--skip-networking
--datadir=/application/mysql/data
--basedir=/application/mysql
--defaults-file=/etc/my,cnf
--pid-file=/application/mysql/data/db01.pid
--socket=/application/mysql/data/mysql.sock
--user=mysql
--port=3306
--log-error=/application/mysql/data/db01.err

3.初始化配置文件(/etc/my.cnf)

2.配置文件读取顺序

1)读取顺序

/etc/my.cnf
/etc/mysql/my.cnf
$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
defaults-extra-file (类似include)
~/.my.cnf

2)生效顺序

~/.my.cnf
defaults-extra-file (类似include)
$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
/etc/mysql/my.cnf
/etc/my.cnf

3)生效顺序验证

#配置/etc/my.cnf
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1

#配置/etc/mysql/my.cnf
[root@db01 ~]# mkdir /etc/mysql
[root@db01 ~]# vim /etc/mysql/my.cnf
[mysqld]
server_id=2

#配置$basedir/my.cnf
[root@db01 ~]# vim /service/mysql/my.cnf 
[mysqld]
server_id=3

#配置~/my.cnf
[root@db01 ~]# vim ~/.my.cnf
[mysqld]
server_id=4

#重启数据库(注意这里不能使用systemctl restart mysql重启)
[root@db01 ~]# systemctl stop mysql
[root@db01 ~]# /etc/init.d/mysqld start

#查看server_id
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 4     |
+---------------+-------+
1 row in set (0.00 sec)

3.思考参数执行优先级

#cmake:
socket=/service/mysql/tmp/mysql.sock

#命令行:
--socket=/tmp/mysql.sock

#配置文件:
vim /etc/my.cnf
[mysqld]
socket=/opt/mysql.sock

#default参数:
--defaults-file=/tmp/a.txt
vim /tmp/a.txt
[mysqld]
socket=/tmp/test.sock

#启动测试
mysql_safe --defaults-file=/tmp/a.txt --socket=/tmp/mysql.sock
优先级测试结论:
1、命令行
2、defaults-file
3、配置文件
4、预编译

命令行 >> defaults-file >> ~/.my.cnf >> defaults-extra-file >> $basedir/my.cnf >> /etc/mysql/my.cnf >> /etc/my.cnf >> cmake

4.配置文件的使用

1)mysql配置文件的作用

1.影响服务端的启动(mysqld)
2.影响客户端的连接

2)配置连接数据库可以不输入密码

[root@db01 scripts]# vim /etc/my.cnf
#最下面添加
[client]
user=root
password=123

#不需要重启和输入密码就可以直接连数据库

3)修改配置的影响

1.客户端程序也是受到配置文件的影响  [mysql] && [client]
2.修改完客户端的配置,不需要重启
3.修改完服务端的配置,必须重启,才能生效   [mysqld] && [server]

四、mysql相关命令

1.mysql连接后命令行快捷命令

\c:中断当前输入语句
    \r:重新连接到服务器
    \d:设置语句sql结束符    mysql> \d ]
    \e:编辑命令    输出输入的内容 echo
    \p:打印当前命令并执行
\G:垂直显示结果
\q:退出mysql    等于 quit exit
    \g:表示结束    等于 ; 的作用
\h:显示此帮助    等于 help    #help还可以查看命令语法 help create database;
    \t:不写入outfile
\T:将所有内容附加到给定的输出文件中(只支持本次会话)        \T /tmp/a.log
    #\n:禁用寻呼机,打印到标准输出。
    #\P:设置寻呼机[到寻呼机]。通过寻呼机打印查询结果。
\R:更改mysql提示符    \R mysql>>> 
\.:执行一个sql文件    等于 source
\s:从服务器获取状态信息    等于 status
\u:切换数据库    等于 use  #查看当前所在数据库select database();
    \C:切换到另一个字符集    一般不使用
    \W:在每个语句后显示警告
    \w:不在每个语句后显示警告

1)help命令

mysql> help
mysql> help contents    help 用法
mysql> help select
mysql> help create
mysql> help create user
mysql> help status
mysql> help show

2.客户端mysqladmin命令

1.修改密码,设置密码:password
[root@db01 ~]# mysqladmin -uroot -p旧密码 password '新密码'

2.关闭MySQL服务:shutdown
[root@db01 ~]# mysqladmin -uroot -p密码 -S socket文件 shutdown

3.库外建库:create
[root@db01 ~]# mysqladmin -uroot -p密码 create lhd
[root@db01 ~]# mysql -uroot -p123456 -e 'create database lhd'

4.库外删除数据库:drop
[root@db01 ~]# mysqladmin -uroot -p123456 drop lhd
Do you really want to drop the 'lhd' database [y/N] y
Database "lhd" dropped

5.查看配置文件所有的默认参数:variables
[root@db01 ~]# mysqladmin -uroot -p123456 variables
[root@db01 ~]# mysqladmin -uroot -p123456 variables | grep server_id

6.检测MySQL进程是否存活:ping
[root@db01 ~]# mysqladmin -uroot -p123456 ping

7.查看数据库 慢查询,负载信息:status
[root@db01 ~]# mysqladmin -uroot -p123456 status
Uptime                   MySQL服务器已经运行的秒数
Threads                  活跃线程(客户)的数量 
Questions                从mysqld启动起来自客户问题的数量   已经发送给服务器的查询的个数
Slow queries             已经超过long_query_time秒的查询数量 
Opens                    mysqld已经打开了多少表 
Flush tables             flush ..., refresh和reload命令数量 
Open tables              现在被打开的表数量
Queries per second avg: 0.046   负载

8.重载授权表,刷新缓存主机:reload,相当于flush privileges
[root@db01 ~]# mysqladmin -uroot -p123456 reload

9.刷新binlog日志
[root@db01 ~]# mysqladmin -uroot -p123456 flush-log

3.数据库多实例

一、mysqld服务程序构成

mysqld是一个守护进程

1.连接层

1.验证用户的身份,用户名密码是否匹配
2.提供两种连接方式(TCP/IP连接、socket连接)
3.连接层提供了一个与sql层交互的线程

2.SQL层

1.接收连接层传过来的SQL语句
2.验证执行的SQL语法
3.验证SQL的语义(DDL,DML,DQL,DCL)
4.解析器:解析SQL语句,生成执行计划
5.优化器:将解析器传来的执行计划选择最优的一条执行
6.执行器:将最优的一条执行
    6.1 与存储引擎层建立交互的线程
    6.2 将要执行的sql发给存储引擎层
7.如果有缓存,则走缓存
8.记录日志(binlog)

3.存储引擎层

1.接收SQL层传来的语句
2.与磁盘交互,获取数据,返回给sql层
3.建立与sql层交互的线程

二、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=/service/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=/service/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=/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@db01 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/service/mysql --datadir=/data/3307/data

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

[root@db01 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/service/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.检查启动

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

7.多实例设置密码

[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'

8.多实例验证

[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     |
+---------------+-------+

9.连接多实例小技巧

[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.主库创建主从复制用户

mysql> grant replication slave on *.* to rep@'127.0.0.1' identified by '123';
Query OK, 0 rows affected (0.00 sec)

2.主库查看binlog名和位置

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      467 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3.从库配置主库信息

#从库需要知道:我的主库是谁?主库的主从复制用户是谁?主从复制用户的密码?端口?binlog名?binlog位置
mysql> change master to
    -> master_host='127.0.0.1',
    -> master_user='rep',
    -> master_password='123',
    -> master_log_file='mysql-bin.000003',
    -> master_log_pos=467,
    -> master_port=3307;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

4.从库开启主从复制

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

5.检查主从复制状态

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 127.0.0.1
                  Master_User: rep
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 467
               Relay_Log_File: db01-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

6.主从复制状态错误

1)如果IO线程是NO

1.检测网络:
[root@db01 data]# ping 127.0.0.1

2.检测端口:
[root@db01 data]# telnet 127.0.0.1 3307

3.检测账号,密码:
mysql -urep -p123 -h127.0.0.1 -P 3307

2)如果sql线程是NO

1.确定数据库主从之前数据同步

2.确定主库有的库和表从库也有

#解决方法:
方法一:数据要求不严格的情况,忽略错误后,继续同步
解决:
stop slave;
#表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
ok,现在主从同步状态正常了。。。

方式二:重新做主从,完全同步

3)连接时有反向解析的问题

#连接时地址反向解析了
[root@db01 ~]# mysql -uroot -p123 -h10.0.0.51
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'db01' (using password: YES)

#配置忽略反向解析
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
skip-name-resolve

四、MySQL5.6与MySQL5.7安装的区别

1.cmake的时候加入了bostorg

建议大家使用二进制的包安装,已经过了cmake阶段,已经把bostorg装好了

[root@db02 mysql-5.7.20]# yum install -y gcc gcc-c++ automake autoconf
[root@db02 mysql-5.7.20]# yum install make cmake bison-devel ncurses-devel libaio-devel
[root@db02 mysql-5.7.20]#
wget httpss://dl.bintray.com/boostorg/release/1.65.1/source/boost_1_59_0.tar.gz
#登录boost.org下载也可以
[root@db02 mysql-5.7.20]# tar xf boost_1_59_0.tar.gz -C /usr/local/
[root@db02 mysql-5.7.20]#
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.7.20 \
-DMYSQL_DATADIR=/application/mysql-5.7.20/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.7.20/tmp/mysql.sock \
#安装bostorg
-DDOWNLOAD_BOOST=1 \
#安装的目录
-DWITH_BOOST=/usr/local/boost_1_59_0 \
-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=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0 

2.初始化时 使用的命令不一样了

#5.6初始化命令
/service/mysql/scripts/mysql_install_db --user= --basedir= --datadir=

#5.7初始化命令
/usr/local/mysql/bin/mysqld --initialize --user= --basedir= --datadir=
#初始--initialize会生成一个临时的随机密码,他会告诉你位置,你自己去找使用密码登录,而且修改密码也需要一个很复杂的密码,大小写数字特殊符号

#想不让他生成密码的话,还可以用另外一个参数--initialize-insecure

五、mysql用户权限管理

1.linux和mysql用户对比

linux系统 mysql数据库
用户作用 1.登陆系统 2.管理系统文件 1.登陆MySQL数据库 2.管理数据库对象
创建用户 1.useradd 2.adduser 1.create user test@’%’; 2.grant
用户密码 1.useradd cm -p 123 2.passwd cm 1.create user test@’%’ identified by ‘123’; 2.mysqladmin
删除用户 userdel 1.drop user test@’%’; 2.delete
修改用户 usermod update

2.在MySQL中,用户是如何定义的

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

#上面是6个用户,在数据库中一个完整的用户是:'用户名'@'主机域'
'用户名'@'主机域'
主机域写法:
    localhost
    127.0.0.1
    10.0.0.%
    10.0.%.%
    10.%.%.%
    %
    10.0.0.5%(10.0.0.50-10.0.0.59)
    db01
    10.0.0.0/255.255.255.0
    10.0.0.0/24 #可以创建但是不生效
测试:
    grant all on *.* to lhd@'10.0.0.0/255.255.255.0' identified by '123';
    grant all on *.* to qiudao@'10.0.0.0/24' identified by '123';

#创建的用户是数字,必须用引号一起来表示字符串
mysql> create user 123@'localhost';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '123@'localhost'' at line 1

mysql> create user '123'@'localhost';
Query OK, 0 rows affected (0.02 sec)

3.用户管理

1)创建用户

mysql> create user lhd@'10.0.0.%' identified by '123';

2)查看用户

mysql> select user,host from mysql.user;

3)删除用户

mysql> drop user oldboy@‘10.0.0.%’;

4)修改密码

1.mysqladmin -uroot -p123 password '1'
2.update mysql.user set password=password('123') where user='root' and host='localhost';
3.set password=password('1');   修改当前用户的密码
4.grant all on *.* to 'root'@'localhost' identified by '123';

5)忘记root用户密码

1.停止MySQL
[root@db01 data]# /etc/init.d/mysqld stop
2.跳过授权表,安全启动
[root@db01 data]# mysqld_safe --skip-grant-tables --skip-networking &
3.连接数据库
[root@db01 data]# mysql
4.update修改密码
mysql> update mysql.user set password=password('123456789') where user='root' and host='localhost';
5.刷新授权表
mysql> flush privileges;
6.重启数据库
[root@db01 data]# /etc/init.d/mysqld restart
7.使用新密码链接数据库
[root@db01 data]# mysql -uroot -p567

4.权限管理

#授权命令
grant all privileges on *.* to oldboy@'10.0.0.%' identified by '123';
grant    all       on    *.*             to  oldboy@'10.0.0.%' identified  by '123';
授权SQL  所有权限   在  所有库.所有表 上面  给  用户名@主机域        密码    为    123;

1)作用对象:所有库所有表

grant all privileges on *.*
grant select,update,insert on mysql.*           单库
grant select,update,insert on mysql.user        单表
#企业里称单列授权为 脱敏:脱离敏感信息
grant select(user,host) on mysql.user to ptuser@'%' identified by '123';   单列级别

#举例:(相亲网站)
    grant select on mysql.user to vip@'%' identified by '123';
    grant select(user) on mysql.user to diaosi@'%' identified by '123';

2)在企业中权限的设定

#开发人员说:请给我开一个用户

#1.首先进行沟通
    1.你需要对哪些库、表进行操作
    2.你从哪里连接过来
    3.用户名有没有要求
    4.密码要求
    5.你要使用多长时间
    6.发邮件

#2.一般给开发创建用户权限
grant select,update,delete,insert on *.* to oldboy@’10.0.0.%’ identified by ‘123’;
#建议delete权限也不给

#3.注意:开发想要root用户,打死也不能给,这个申请到谁那里批准,也不给,让老大给

5.实践思考

1)准备数据库

#创建wordpress数据库
create database wordpress;
#使用wordpress库
use wordpress;
#创建t1、t2表
create table t1 (id int);
create table t2 (id int);
#创建blog库
create database blog;
#使用blog库
use blog;
#创建t1表
create table tb1 (id int);

2)授权

#给wordpress@'10.0.0.5%'用户查询所有库,所有表的权限,密码是 123
1、grant select on *.* to wordpress@’10.0.0.5%’ identified by ‘123’;

#给wordpress@'10.0.0.5%'用户插入,删除,修改 针对wordpress库下的所有表 密码是123
2、grant insert,delete,update on wordpress.* to wordpress@’10.0.0.5%’ identified by ‘123’;

#给wordpress@'10.0.0.5%'用户所有权限针对wordpress库下的t1表 密码是123
3、grant all on wordpress.t1 to wordpress@’10.0.0.5%’ identified by ‘123’;

3)问题

一个客户端程序使用wordpress用户登陆到10.0.0.51的MySQL后,
    1、对t1表的管理能力?        all
    2、对t2表的管理能力?        select insert,delete,update   增删改查
    3、对tb1表的管理能力?        select

4)权限总结

1、如果在不同级别都包含某个表的管理能力时,权限是相加关系。
2、但是我们不推荐在多级别定义重复权限。
3、最常用的权限设定方式是单库级别授权,即:wordpress.*
4、如果涉及到用户的敏感信息,需要做脱敏,单列级别授权 即:select(列名) 单库.单表

六、mysql连接管理

1.连接工具

1)mysql自带的连接命令 mysql

mysql
#常见的特定于客户机的连接选项:
-u:             指定用户  mysql -uroot
-p:             指定密码  mysql -uroot -p567
-h:             指定主机域  mysql -uroot -p567 -h127.0.0.1
-P:             指定端口    mysql -uroot -p567 -h127.0.0.1 -P3307
-S:             指定socket文件 mysql -uroot -p567 -S /tmp/mysql.sock
-e:             指定SQL语句(库外执行SQL语句) mysql -uroot -p567 -e "show databases;"
#--protocol:      指定连接方式 mysql --protocol=TCP  --protocol=socket

2)第三方的连接工具

1.sqlyog
2.navicat
#注意:数据库是没有外网的,想连接可以使用通道
3.应用程序连接MySQL
#注意:需要加载对应语言程序的API

2.连接方式

1) socket连接

mysql -uroot -poldboy123 -S /service/mysql/tmp/mysql.sock
mysql -uroot -poldboy123

2) TCP/IP

mysql -uroot -poldboy123 -h10.0.0.51 -P3306

七、MySQL启动关闭流程

1.启动数据库

/etc/init.d/mysqld start ------> mysql.server ------> mysqld_safe ------> mysqld
systemctl start mysql ------> mysqld_safe ------> mysqld
mysqld_safe --defaults-file=/etc/my.cnf ------> mysqld_safe ------> mysqld

2.停止数据库

/etc/init.d/mysqld stop
systemctl stop mysqld
mysqladmin -uroot -p123 shutdown

#不建议使用
kill -9 pid
killall mysqld
pkill mysqld
#出现问题:
1.如果在业务繁忙的情况下,数据库不会释放pid和sock文件
2.号称可以达到和Oracle一样的安全性,但是并不能100%达到
3.在业务繁忙的情况下,丢数据(补救措施,高可用)

八、MySQL实例初始化配置

1.初始化配置文件的作用

1.预编译:cmake去指定,硬编码到程序当中去

2.在命令行设定启动初始化配置
--skip-grant-tables 
--skip-networking
--datadir=/application/mysql/data
--basedir=/application/mysql
--defaults-file=/etc/my,cnf
--pid-file=/application/mysql/data/db01.pid
--socket=/application/mysql/data/mysql.sock
--user=mysql
--port=3306
--log-error=/application/mysql/data/db01.err

3.初始化配置文件(/etc/my.cnf)

2.配置文件读取顺序

1)读取顺序

/etc/my.cnf
/etc/mysql/my.cnf
$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
defaults-extra-file (类似include)
~/.my.cnf

2)生效顺序

~/.my.cnf
defaults-extra-file (类似include)
$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
/etc/mysql/my.cnf
/etc/my.cnf

3)生效顺序验证

#配置/etc/my.cnf
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1

#配置/etc/mysql/my.cnf
[root@db01 ~]# mkdir /etc/mysql
[root@db01 ~]# vim /etc/mysql/my.cnf
[mysqld]
server_id=2

#配置$basedir/my.cnf
[root@db01 ~]# vim /service/mysql/my.cnf 
[mysqld]
server_id=3

#配置~/my.cnf
[root@db01 ~]# vim ~/.my.cnf
[mysqld]
server_id=4

#重启数据库(注意这里不能使用systemctl restart mysql重启)
[root@db01 ~]# systemctl stop mysql
[root@db01 ~]# /etc/init.d/mysqld start

#查看server_id
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 4     |
+---------------+-------+
1 row in set (0.00 sec)

3.思考参数执行优先级

#cmake:
socket=/service/mysql/tmp/mysql.sock

#命令行:
--socket=/tmp/mysql.sock

#配置文件:
vim /etc/my.cnf
[mysqld]
socket=/opt/mysql.sock

#default参数:
--defaults-file=/tmp/a.txt
vim /tmp/a.txt
[mysqld]
socket=/tmp/test.sock

#启动测试
mysql_safe --defaults-file=/tmp/a.txt --socket=/tmp/mysql.sock
优先级测试结论:
1、命令行
2、defaults-file
3、配置文件
4、预编译

命令行 >> defaults-file >> ~/.my.cnf >> defaults-extra-file >> $basedir/my.cnf >> /etc/mysql/my.cnf >> /etc/my.cnf >> cmake

4.配置文件的使用

1)mysql配置文件的作用

1.影响服务端的启动(mysqld)
2.影响客户端的连接

2)配置连接数据库可以不输入密码

[root@db01 scripts]# vim /etc/my.cnf
#最下面添加
[client]
user=root
password=123

#不需要重启和输入密码就可以直接连数据库

3)修改配置的影响

1.客户端程序也是受到配置文件的影响  [mysql] && [client]
2.修改完客户端的配置,不需要重启
3.修改完服务端的配置,必须重启,才能生效   [mysqld] && [server]

2.数据库安装

数据库第二课

一、回顾数据库安装

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

1.源码安装数据库(自定义目录安装)

1)上传或下载代码包

[root@db03 ~]# rz mysql-5.6.46.tar.gz

2)安装依赖

[root@db03 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel

3)解压

[root@db03 ~]# tar xf mysql-5.6.46.tar.gz

4)创建目录

[root@db01 ~]# mkdir /service

5)生成cmake

[root@db03 ~]# cd mysql-5.6.46/
[root@db03 ~]# 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 \
#socket文件存放位置
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.38/tmp/mysql.sock \
#使用utf8字符集
-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 \
#启用zlib库支持(zib、gzib相关)
-DWITH_ZLIB=bundled \
#启用SSL库支持(安全套接层)
-DWITH_SSL=bundled \
#启用本地数据导入支持
-DENABLED_LOCAL_INFILE=1 \
#编译嵌入式服务器支持
-DWITH_EMBEDDED_SERVER=1 \
# mysql5.6支持了google的c++mock框架了,允许下载,否则会安装报错。
-DENABLE_DOWNLOADS=1 \
#禁用debug(默认为禁用)
-DWITH_DEBUG=0
#编译

5)编译 make

[root@db03 mysql-5.6.46]# make

6)安装 make install

[root@db03 mysql-5.6.46]# make install

7)做软连接

[root@db02 ~]# ln -s /service/mysql-5.6.46 /service/mysql

8)创建数据库用户

[root@db02 ~]# useradd mysql -s /sbin/nologin -M

9)拷贝配置文件和启动文件

#1.进入配置文件和脚本的目录
[root@db02 ~]# cd /service/mysql/support-files/

#2.拷贝配置文件
[root@db02 support-files]# cp my-default.cnf /etc/my.cnf

10)配置system管理MySQL服务

#1.配置system管理MySQL
[root@db02 ~]# 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

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

11)初始化数据库

#1.进入初始化目录
[root@db02 support-files]# cd /service/mysql/scripts/

#2.执行初始化命令
[root@db02 scripts]# ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data

12)创建socket文件目录(二进制安装没有)

#先创建tmp目录
[root@db02 ~]# mkdir /service/mysql/tmp

13)授权数据库目录

[root@db02 ~]# chown -R mysql.mysql /service/mysql
[root@db02 ~]# chown -R mysql.mysql /service/mysql-5.6.46

14)system管理启动MySQL

[root@db02 ~]# systemctl start mysql
[root@db02 ~]# ps -ef | grep [m]ysql
mysql     23509      1  3 22:36 ?        00:00:01 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
[root@db02 ~]# netstat -lntp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      23509/mysqld

15)配置环境变量直接使用mysql

[root@db02 ~]# vim /etc/profile.d/mysql.sh 
export PATH=/service/mysql/bin:$PATH
[root@db02 ~]# source /etc/profile

16)修改root用户密码

[root@db02 ~]# mysql -u root -p         #默认root用户密码为空,有多种方式重置root密码
第一种:
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)

注意:两种重置密码方式有区别。

2.二进制安装(自定义安装目录)

1)上传二进制包

[root@db02 ~]# rz mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz

2)安装依赖

[root@db02 ~]# yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf

3)解压安装包

[root@db02 ~]# tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz

4)创建自定义目录

[root@db04 ~]# mkdir /service

5)移动目录并改名

[root@db04 ~]# mv mysql-5.6.46-linux-glibc2.12-x86_64 /service/mysql-5.6.46

6)做软连接

[root@db04 ~]# ln -s /service/mysql-5.6.46 /service/mysql

7)创建数据库用户

[root@db02 ~]# useradd mysql -s /sbin/nologin -M

8)拷贝配置文件和启动文件

#1.进入配置文件和脚本的目录
[root@db04 ~]# cd /service/mysql/support-files/

#2.拷贝配置文件
[root@db04 support-files]# cp my-default.cnf /etc/my.cnf
cp: overwrite ‘/etc/my.cnf’? y

#3.拷贝启动脚本
[root@db02 support-files]# cp mysql.server /etc/init.d/mysqld

9)初始化数据库

#1.进入初始化目录
[root@db04 support-files]# cd /service/mysql/scripts/

#2.执行初始化命令
[root@db04 scripts]# ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data

10)启动数据库

[root@db04 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)

11)如果是二进制安装到自定义目录下需要修改脚本目录

[root@db04 scripts]# sed -i 's#/usr/local#/service#g' /etc/init.d/mysqld /service/mysql/bin/mysqld_safe

12)授权数据库目录

[root@db02 ~]# chown -R mysql.mysql /service/mysql
[root@db02 ~]# chown -R mysql.mysql /service/mysql-5.6.46

13)再次启动

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

14)检查进程和端口

[root@db02 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/db02.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=db02.err --pid-file=/usr/local/mysql/data/db02.pid
[root@db02 scripts]# netstat -lntp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      23191/mysqld        
[root@db02 scripts]# 

15)配置system管理MySQL服务

#1.配置system管理MySQL
[root@db02 ~]# 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

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

16)system管理启动mysql

#1.system管理启动MySQL
[root@db02 ~]# systemctl start mysql
[root@db02 ~]# ps -ef | grep [m]ysql

#一定是启动失败的,因为不只有启动脚本里面指定了/usr/local,很多都有
[root@db04 scripts]# grep -r '/usr/local' /service/mysql/*

#怎么办?一个一个修改吗?

17)查看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 

18)配置my.cnf

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

#2.再次启动
[root@db04 scripts]# systemctl start mysql

#3.一定成功

19)配置环境变量直接使用mysql

[root@db02 ~]# vim /etc/profile.d/mysql.sh 
export PATH=/service/mysql/bin:$PATH
[root@db02 ~]# source /etc/profile

3.YUM安装

1)配置MySQL的yum源

[root@db02 ~]# cat /etc/yum.repos.d/mysql-community.repo
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=0

2)检查存储库是否正确配置

[root@db02 ~]#  yum repolist enabled | grep mysql

3)禁用默认的MySQL模块

[root@db02 ~]# sudo yum module disable mysql

4)安装MySQL

[root@db02 ~]# sudo yum install mysql-community-server

5)启动MySQL

[root@db02 ~]#  sudo service mysqld start
Starting mysqld (via systemctl):                           [  OK  ]

6)检查MySQL运行状态

[root@db02 ~]# sudo service mysqld status

7)保护运行MySQL

[root@db02 ~]# mysql_secure_installation

二、数据库基本操作

1.MySQL设置密码

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

2.使用密码登录

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

#2.错误登录命令
[root@db04 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@db04 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@db04 ~]# mysql -uroot -p123

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

3.解决办法

1)停止数据库

[root@db04 ~]# systemctl stop mysql

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

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

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

#2.跳过授权表和网络启动mysql
[root@db04 ~]# 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@db04 ~]# mysqladmin shutdown
[root@db04 ~]# systemctl start mysql
[root@db04 ~]# mysql -uroot -p123
mysql> show databases;

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

5)正确解决方式

重启数据库,仍然以跳过授权表检查以及网络连接方式启动。
[root@db04 ~]# 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@db04 ~]# mysqladmin shutdown
[root@db04 ~]# systemctl start mysql
[root@db04 ~]# 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系统对比

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

1.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.检查启动

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

7.多实例设置密码

[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'

8.多实例验证

[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     |
+---------------+-------+

9.连接多实例小技巧

[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.整理今天所有的理论.

1.数据库介绍

引言:数据库介绍

什么是数据库?数据库是做什么用的?数据库有哪些?企业常用的数据库选择?

为什么需要数据库?数据是什么?各种类型的公司分别存储什么数据?

一、数据库简介

数据库概述

数据库从字面上的理解就是数据的仓库,其实我们平时说的数据库是指数据库管理系统(Database Management System),它是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。严格来说数据库是数据库管理系统的实例,一个数据库管理系统可以有多个数据库实例。

数据库系统(Database System),是由数据库及其管理软件组成的系统。

数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储维护和应用系统提供数据的软件系统,是存储介质 、处理对象和管理系统的集合体。

基本定义

数据库系统DBS(Data Base System,简称DBS)通常由软件数据库数据管理员组成。其软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统数据库数据库管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。数据管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。数据库管理员一般是由业务水平较高、资历较深的人员担任。

数据库系统有大小之分,大型数据库系统有SQL Server、Oracle、DB2等,中小型数据库系统有Foxpro、Access、MySQL。

数据库构成

数据库系统一般由4部分组成:

1.数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合。数据库中的数据按一定的数学模型组织、描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种用户共享。

2.硬件:构成计算机系统的各种物理设备,包括存储所需的外部设备。硬件的配置应满足整个数据库系统的需要。

3.软件:包括操作系统数据库管理系统应用程序数据库管理系统(database management system,DBMS)是数据库系统的核心软件,是在操作系统的支持下工作,解决如何科学地组织和存储数据,如何高效获取和维护数据的系统软件。其主要功能包括:数据定义功能、数据操纵功能、数据库的运行管理和数据库的建立与维护。

4.人员:主要有4类。第一类为系统分析员数据库设计人员:系统分析员负责应用系统的需求分析和规范说明,他们和用户及数据库管理员一起确定系统的硬件配置,并参与数据库系统概要设计数据库设计人员负责数据库中数据的确定、数据库各级模式的设计。第二类为应用程序员,负责编写使用数据库的应用程序。这些应用程序可对数据进行检索、建立、删除或修改。第三类为最终用户,他们利用系统的接口或查询语言访问数据库。第四类用户是数据库管理员(data base administrator,DBA),负责数据库的总体信息控制。DBA的具体职责包括:具体数据库中的信息内容和结构,决定数据库的存储结构和存取策略,定义数据库的安全性要求和完整性约束条件,监控数据库的使用和运行,负责数据库的性能改进、数据库的重组和重构,以提高系统的性能。

数据库特点

数据的结构化

数据的共享性好

数据的独立性好

数据存储粒度小

数据库管理系统为用户提供了友好的接口

数据库系统的核心和基础,是数据模型,现有的数据库系统均是基于某种数据模型的。

也可以说,数据库系统的核心就是数据库管理系统。

二、数据库分类

关键词

MySQL:The world’s most popular open source database(全世界最流行的开源数据库)

postgresql: The World’s Most Advanced Open Source Relational Database(全世界最先进的开源数据库)

热度排行

数据库种类很多,我们平时接触最多的恐怕就是Oracle数据库,或者MySQL数据。两者是应用最广泛的关系型数据。如图1是2020年12月份使用情况排名,从排名也可以看出上述两个数据库分别排第一名和第二名。

https://db-engines.com/en/ranking

数据库分类

如果仔细看图1的排名就可以看到,数据库不仅仅有我们平时学到的关系型数据库,还有键值(Key-Value)数据库、列存储数据库、文档数据库和搜索引擎等类型。下面本文将简单介绍一下各种类型的数据。

关系型数据库

这种类型的数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式), 如图2是一个二维表的实例。通常该表第一行为字段名称,描述该字段的作用,下面是具体的数据。在定义该表时需要指定字段的名称及类型。

在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上。在大型系统中通常有多个表,且表之间有各种关系。实际使用就是通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。

键值存储数据库

键值数据库是一种非关系数据库,它使用简单的键值方法来存储数据。键值数据库将数据存储为键值对集合,其中键作为唯一标识符。

如图是某公有云的键值存储示意图,其中键包含分区键和排序键,而值包含更多的实际信息。比如实际使用是可以以学号为键,姓名、性别、年龄和班级等信息为值进行存储。实际存储形式很灵活,是业务需求自行定义即可。

列存储数据库

列式存储(column-based)是相对于传统关系型数据库的行式存储(Row-basedstorage)来说的。简单来说两者的区别就是对表中数据的存储形式的差异。

​ 图3 列存储数据库

如图是传统行数据库和列数据库表中数据在磁盘上的存储形式的差异对比。对于行存储数据库,表中的数据是以行为单位逐行存储在磁盘上的;而对于列存储数据库,表中的数据则是以列为单位逐列存储在磁盘中。

列存储解决的主要问题是数据查询问题。我们知道,平时的查询大部分都是条件查询,通常是返回某些字段(列)的数据。对于行存储数据,数据读取时通常将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。而列存储,每次读取的数据是集合的一段或者全部,不存在冗余性问题。这样,通过这种存储方式的调整,使得查询性能得到极大的提升。

面向文档数据库:

此类数据库可存放并获取文档,可以是XML、JSON、BSON等格式,这些文档具备可述性(self-describing),呈现分层的树状结构(hierarchical tree data structure),可以包含映射表、集合和纯量值。数据库中的文档彼此相似,但不必完全相同。文档数据库所存放的文档,就相当于键值数据库所存放的“值”。文档数据库可视为其值可查的键值数据库。

图形数据库

图形数据库顾名思义,就是一种存储图形关系的数据库。图形数据库是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息。关系型数据用于存储明确关系的数据,但对于复杂关系的数据存储却有些力不从心。如图这种人物之间的关系,如果用关系型数据库则非常复杂,用图形数据库将非常简单。

​ 图4 图形数据库示例

搜索引擎存储

搜索引擎数据库是应用在搜索引擎领域的数据存储形式,由于搜索引擎会爬取大量的数据,并以特定的格式进行存储,这样在检索的时候才能保证性能最优。

不同类型数据库常用软件

关系型数据库

关系型数据库最为经典的开源软件就是MySQL,它是最流行的开源关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

SUN被甲骨文收购后,MySQL 的原创人员有拉出另外一个分支,命名MariaDB 。该数据库被维基百科,Facebook 甚至 Google 等技术巨头使用。 MariaDB 是一种可为 MySQL 提供插件替换功能的数据库服务器。开发人员的首要关注点是安全性,在每个版本发布时,开发人员还会合并所有 MySQL 的安全修补程序,并在需要时对其进行增强。

除此之外,还有很多开源的关系型数据库,比如经典的文件数据库SQLite和针对Web服务进行优化的CUBRID 等。

键值存储数据库

键值数据库目前应用最多的应该是Redis,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis通常最为普通关系型数据库的缓存层,用于降低数据库的访问压力,提升系统性能。

列存储数据库:

列存储数据库中最为出名的恐怕就是HBase了,HBase是 BigTable 的开源 java 版本。是建立在 HDFS 之上,提供高可靠性、高性能、列存储、 可伸缩、实时读写 NoSQL 的数据库系统。

面向文档数据库

文档数据库种类繁多,包括MongoDB、CouchDB、 Terrastore、RavenDB和OrientDB等多大十几个。其中MongoDB是目前最为流行的文档数据库,其介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。其最大的特点是分布式部署,可以随着负载的增大动态扩容,从而满足企业业务增长的需求。

img

图形数据库

图形种类很多,比如Neo4J、ArangoDB、OrientDB、FlockDB、GraphDB、InfiniteGraph、Titan和Cayley等。其中Neo4j 是目前最流行的图形数据库,支持完整的事务,在属性图中,图是由顶点(Vertex),边(Edge)和属性(Property)组成的,顶点和边都可以设置属性,顶点也称作节点,边也称作关系,每个节点和关系都可以由一个或多个属性。Neo4j创建的图是用顶点和边构建一个有向图,其查询语言cypher已经成为事实上的标准。

搜索引擎存储

搜索引擎数据库最近比较火的包括Solr和Elasticsearch等。Solr是Apache 的一个开源项目,基于业界大名鼎鼎的java开源搜索引擎Lucene。在过去的十年里,solr发展壮大,拥有广泛的用户群体。solr提供分布式索引、分片、副本集、负载均衡和自动故障转移和恢复功能。如果正确部署,良好管理,solr就能够成为一个高可靠、可扩展和高容错的搜索引擎。

Elasticsearch构建在Apache Lucene库之上,同是开源搜索引擎。Elasticsearch在Solr推出几年后才面世的,通过REST和schema-free的JSON文档提供分布式、多租户全文搜索引擎。并且官方提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript客户端。目前Elasticsearch与Logstash和Kibana配合,部署成日志采集和分析,简称ELK,它们都是开源软件。最近新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash。

三、不同类型数据库的区别以及特点

MySQL和Redis的对比

1)从数据存储格式上:

例如学生信息:
张三   性别:男    年龄:23   籍贯:上海   手机:1234567890

mysql存储格式:
uid   姓名    sex    age    home     phone
001   张三     男     23     上海    1234567890   

Redis存储格式:
name001:zhangsan
sex001:男
age001:23
home001:上海
phone001:1234567890

2)从分类上

MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。

Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。

3)从运行机制上

mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库。第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢;第二:反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生了出来。

缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取;否则就访问数据库。缓存的好处就是读取速度快。
redis数据库就是一款缓存数据库,用于存储使用频繁的数据,这样减少访问数据库的次数,提高运行效率。

4)从存储介质上

mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。

redis用于存储使用较为频繁的数据到缓存中,读取速度快。

5)需求上

MySQL和Redis因为需求的不同,一般都是配合使用。
Redis存储在内存中,如果存储在内存中,存储容量肯定要比磁盘少很多,那么要存储大量数据,只能花更多的钱去购买内存,造成在一些不需要高性能的地方是相对比较浪费的,所以目前基本都是MySQL(主) + Redis(辅),在需要性能的地方使用Redis,在不需要高性能的地方使用MySQL,好钢用在刀刃上。

MySQL支持sql查询,可以实现一些关联的查询以及统计.

Redis对内存要求比较高,在有限的条件下不能把所有数据都放在Redis.

MySQL偏向于存数据,Redis偏向于快速取数据,但Redis查询复杂的表关系时不如MySQL,所以可以把热门的数据放Redis,MySQL存基本数据。

MySQL与mongdb对比

MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,关键是看用在什么地方。所以我们所熟知的那些SQL语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言。

(一)关系型数据库-MySQL

1、在不同的引擎上有不同的存储方式。
2、查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
3、开源数据库的份额在不断增加,mysql的份额也在持续增长。
4、缺点就是在海量数据处理的时候效率会显著变慢。


(二)非关系型数据库-MongoDB

非关系型数据库(nosql ),属于文档型数据库。先解释一下文档的数据库,即可以存放xml、json、bson类型系的数据。这些数据具备自述性,呈现分层的树状数据结构。数据结构由键值(key=>value)对组成。

1、存储方式:虚拟内存+持久化。
2、查询语句:是独特的MongoDB的查询方式。
3、适合场景:事件的记录,内容管理或者博客平台等等。
4、架构特点:可以通过副本集,以及分片来实现高可用。
5、数据处理:数据是存储在硬盘上的,只不过需要经常读取的数据会被加载到内存中,将数据存储在物理内存中,从而达到高速读写。
6、成熟度与广泛度:新兴数据库,成熟度较低,Nosql数据库中最为接近关系型数据库,比较完善的DB之一,适用人群不断在增长。

(三)MongoDB优势与劣势

优势:
1、在适量级的内存的MongoDB的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快。
2、MongoDB的高可用和集群架构拥有十分高的扩展性。
3、在副本集中,当主库遇到问题,无法继续提供服务的时候,副本集将选举一个新的主库继续提供服务。
4、MongoDB的Bson和JSon格式的数据十分适合文档格式的存储与查询。

劣势:
1、 不支持事务操作。MongoDB本身没有自带事务机制,若需要在MongoDB中实现事务机制,需通过一个额外的表,从逻辑上自行实现事务。
2、 应用经验少,由于NoSQL兴起时间短,应用经验相比关系型数据库较少。
3、MongoDB占用空间过大。

(四)对比

数据库 MongoDB MySQL
数据库模型 非关系型 关系型
存储方式 以类JSON的文档的格式存储 不同引擎有不同的存储方式
查询语句 MongoDB查询方式(类似JavaScript的函数) SQL语句
数据处理方式 基于内存,将热数据存放在物理内存中,从而达到高速读写 不同引擎有自己的特点
成熟度 新兴数据库,成熟度较低 成熟度高
广泛度 NoSQL数据库中,比较完善且开源,使用人数在不断增长 开源数据库,市场份额不断增长
事务性 仅支持单文档事务操作,弱一致性 支持事务操作
占用空间 占用空间大 占用空间小
join操作 MongoDB没有join MySQL支持join

(五)企业选型

关系型数据库适合存储结构化数据,如用户的帐号、地址:
1)这些数据通常需要做结构化查询,比如join,这时候,关系型数据库就要胜出一筹
2)这些数据的规模、增长的速度通常是可以预期的
3)事务性、一致性
  
NoSQL适合存储非结构化数据,如文章、评论:
1)这些数据通常用于模糊处理,如全文搜索、机器学习
2)这些数据是海量的,而且增长的速度是难以预期的,
3)根据数据的特点,NoSQL数据库通常具有无限(至少接近)伸缩性
4)按key获取数据效率很高,但是对join或其他结构化查询的支持就比较差

四、DBA介绍

数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。

DBA的核心目标是保证数据库管理系统的稳定性、安全性、完整性和高性能。

主要职责

据库管理员的主要职责有以下几个方面:

1.设计数据库设计,包括字段、表和关键字段;资源在辅助存储设备上是怎样使用的,怎样增加和删除文件及记录,以及怎样发现和补救损失。

2.监视监控数据库的警告日志,定期做备份删除。

3.备份对数据库的备份监控和管理数据库的备份至关重要,对数据库的备份策略要根据实际要求进行更改,数据的日常备份情况进行监控。

4.SQL语句:对SQL语句的书写规范的要求一个SQL语句,如果写得不理想,对数据库的影响是很大的。所以,每一个程序员或相应的工作人员在写相应的SQL语句时,应该严格按照《SQL书写规范》一文,最后要有DBA检查才可以正式运行。

5.最终用户服务和协调:数据库管理员规定用户访问权限和为不同用户组分配资源。如果不同用户之间互相抵触,数据库管理员应该能够协调用户以最优化安排。

6.数据库安全:数据库管理员能够为不同的数据库管理系统用户规定不同的访问权限,以保护数据库不被未经授权的访问和破坏。例如,允许一类用户只能检索数据,而另一类用户可能拥有更新数据和删除记录的权限。