补:
数据初始化 (建系统库) ---(不安全的初始化方式,会生成一个随机登录数据库密码。登录时必须修改密码才能登录)
[root@db01 data_3306]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/mysql/data_3306
5.7 以前版本初始化方式:
/usr/local/mysql56/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/mysql/data_3306
show processlist; #查看当前线程用户登录数量
SQL层
1. 语法
2. 语义
3. 权限
4. 解析 ---> 执行计划
5. 预处理 ---> 代价计算(cost)
6. 优化器 ---> 选择代价低的
7. 执行器 ---> 结果----> 段--->区---->页
查询QC(query_cache) #将解析、预处理、优化器等重复操作保存在缓存中,提高效率。
day 2 第二章MySQL 基础管理
1.用户管理
登录
管理对象
1.2.1 用户名:
不要太长 , 和业务有关
emp_user01
grant all on *.* to wordpress@'%' identified '123';
1.2.2 白名单?
user@'10.0.0.56'
user@'%'
user@'10.0.0.%' 255.255.255.0 24位
user@'10.0.0.0/255.255.254.0' 23位
user@'10.0.0.5%' 50-59
user@'localhost' 本地
1.2.3 常用
user@'10.0.0.%'
user@'10.0.0.0/255.255.254.0'
user@'10.0.0.5%' 50-59
user@'localhost' 本地
创建用户:
mysql> CREATE USER oldguo@'10.0.0.%' IDENTIFIED BY '123';
查询用户:
mysql> select user,host from mysql.user;
mysql> select user,host,authentication_string from mysql.user;
修改用户的密码
mysql> alter user oldguo@'10.0.0.%' identified by '123456';
删除用户
mysql> drop user oldzhang@'10.0.0.%';
ps: 8.0+ 版本必须先创建用户再授权。
8.0以前版本授权时同时可以创建用户。
2.权限管理
2.1 MySQL权限列表
mysql> show privileges; #权限清单
2.2 # 权限语法格式
GRANT 权限 ON 权限作用范围 TO 用户 IDENTIFIED BY '123' with grant option;
权限作用范围 :
*.* ====> 一般是管理员会设置的方法
oldguo.* ====> 一般是业务用户会设置的方法
oldguo.t1 ====> 一般是业务用户户设置的方法 (具体到那个表)
2.3 企业授权案例
(1)授权一个管理员用户oldguo,可以从10网段任意地址登录管理数据库
GRANT ALL ON *.* TO oldguo@'10.0.0.%' IDENTIFIED BY '123' with grant option;
(2)授权一个业务用户app,可以从10网段地址访问app库的所有表
grant select,update,insert,delete ON app.* TO app@'10.0.0.%' IDENTIFIED BY '123' ;
(3)授权一个开发用户dev,可以对dev库进行业务开发(开发的权限一般为除了server admin之外的)
2.4 root管理员密码忘记或被篡改如何处理?
(1) 关闭数据库,启动到"单用户"模式
[root@db01 data_3306]# systemctl stop mysqld
[root@db01 data_3306]# mysqld_safe --skip-grant-tables --skip-networking & #--skip-networking关闭远程tcp连接(不提供端口号)只从本地登录 --skip-grant-tables 不开启验证模块
(2) 无密码登录MySQL
[root@db01 data_3306]# mysql
mysql> alter user root@'localhost' identified by '123456';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> flush privileges; #手动将用户授权表加载到系统内存中
mysql> alter user root@'localhost' identified by '123456';
(3) 重启数据库到正常模式
[root@db01 data_3306]# systemctl restart mysqld
2.5 查询用户权限
mysql> show grants for oldshun@'10.0.0.%';
2.6 回收权限
mysql> revoke delete,drop on *.* from 'oldshun'@'10.0.0.%';
3. MySQL的连接管理
3.1 自带客户端工具
3.1.1 mysql
-u 用户名
-p 密码
-h IP
-P 端口
-S socket位置
-e 免交互
< 导入SQL脚本
例子:
(1) TCP连接串远程登录
注:需要提前创建好远程用户
mysql> grant all on *.* to oldguo@'10.0.0.%' identified by '123';
[root@db01 data_3306]# mysql -uroot -p -h 10.0.0.51 -P 3306
(2) Socket连接方式
注:需要提前创建好localhost用户
mysql> grant all on *.* to oldguo@'localhost' identified by '123';
[root@db01 data_3306]# mysql -uoldguo -p -S /tmp/mysql.sock
Enter password:
如何验证一个用户是通过本地还是远程和登录的.
show processlist;
(3) 免交互执行命令
[root@db01 ~]# mysql -uroot -p -e "show processlist"
Enter password:
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+----------+------------------+
| 5 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
(4) 导入SQL脚本
[root@db01 ~]# mysql -uroot -p < t100w.sql
Enter password:
mysql> source /root/world.sql
3.1.2 mysqladmin
(1) 修改密码
[root@db01 ~]# mysqladmin -uroot -p123456 password 123
[root@db01 ~]# mysql -uroot -p123
(2) 关闭数据库
[root@db01 ~]# mysqladmin -uroot -p123 shutdown
4. MySQL的启动关闭
systemctl ---> mysql.server start
-----> mysqld_safe ----> mysqld
5.1 初始化配置方法
源码安装定制 < 初始化配置文件 < 命令行启动时定制(优先级最高)
5.2 初始化配置文件
[root@db01 data_3306]# mysqld --help --verbose |grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
先调用/etc/my.cnf 再调用/etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 后面会复制前面
建议一个mysql实例一个配置文件
5.3 配置文件书写格式
[root@db01 data_3306]# cat /etc/my.cnf
[mysqld]
user=mysql
port=3306
basedir=/usr/local/mysql57
datadir=/data/mysql/data_3306
server_id=6
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
标签项 ====> [mysqld]
服务器端 [server]: [mysqld],[mysqld_safe] ====> 影响到MySQL启动
客户端 [clinet] : [mysql] ,[mysqldump] ====> 影响本地客户端程序
配置项 ====> key=value
5.4 自定制初识化配置文件位置
[root@db01 ~]# cat /opt/a.cnf
[mysqld]
user=mysql
port=3306
basedir=/usr/local/mysql57
datadir=/data/mysql/data_3306
server_id=6
socket=/tmp/a.sock
[root@db01 ~]# pkill mysqld
[root@db01 ~]# mysqld --defaults-file=/opt/a.cnf & #启动数据库的方式
[root@db01 ~]# mysql -S /tmp/a.sock
6. 多实例的规划和配置
分布式架构中应用广泛
6.1 端口和目录
mkdir -p /data/mysql/data_{3307,3308,3309}
2. 配置文件准备
cat > /data/mysql/my3307.cnf < /data/mysql/my3308.cnf < /data/mysql/my3309.cnf <
6. 使用 systemd 管理多实例
cat >/etc/systemd/system/mysqld3307.service </etc/systemd/system/mysqld3308.service </etc/systemd/system/mysqld3309.service <
第三章 SQL 基础
1. SQL介绍
1.1 简介
结构化查询语言.
1.2 SQL标准
SQL89 SQL92 SQL99 SQL03 SQL05
1.3 SQL_MODE
除数为零
日期
mysql> select @@sql_mode;
1.4 SQL 类型
DDL : 数据定义语言 : 库名,库属性,表名,表属性,列(列名,列属性)
DCL : 数据控制语言 : 权限
DML : 数据操作语言 : 数据行
DQL : 数据查询语言 : 数据行
1.5 SQL功能
管理,操作数据库对象:
库: 库名,库属性
表: 表名,表属性,列(列名,列属性),数据行
2. MySQL规范性存储限制
2.1 字符集 utf8 utf8mb4
utf8: 最大字符长度3个 ,其中中文三个字符
utf8mb4 : 最大字节长度4个. 可以存储emoji表情字符.
2.2
# mysql 中支持的字符集
mysql> show charset;
# mysql 中的排序规则
show collation; #校对规则
默认是大小写不敏感.
2.3 数据类型
2.3.1 数字类型
tinyint(按需分派长度) 1字节长度数字=8字符 ===> 11111111 ===> 0-2^8-1 ===> -2^7-2^7-1 (3位)
int 4字节长度=32字节 ====> 0-2^32-1 ====> -2^31 - 2^31-1 (10位数)
bigint 8字节长度 ====> 0-2^64-1 ====> -2^63 - 2^63-1 (20位数)
2.3.2 字符串
char(10) : 定长类型,最多10个字节,占用存储空间一定.最多存储255个字符.
varchar(10):
变长类型,最多10个字符,按需分配存储空间.
需要额外1个字符或2个字符存储字符长度
因素: 变长的字符串列,90%几率都是varchar
具体原因是什么?
节省空间,还有没有别的原因?
遗留的问题..
enum('m','f'):枚举类型
1 2
2.3.3 时间类型
DATETIME
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
TIMESTAMP
1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
timestamp会受到时区的影响