上节回顾:
数据库产品
RDBMS: Oracle,MySQL,PG,MSSQL
NoSQL: Redis,MongoDB,ES,memcachedMySQL分支
Oracle
MariaDB
percona
RDS,PolarDB,OBMySQL版本选择
GA 6-12月
5.6 : 5.6.38 2017 0913
5.7 : 5.7.20安装-初始化
5.6 :
/usr/local/mysql/scripts/mysql_install_db
5.7
mysqld --initialize-insecure
C/S
TCP/IP: mysql -uroot -p123 -h10.0.0.51 -P3306
socket: mysql -uroot -p123 -S /tmp/mysql.sockMYSQLD的程序结构
连接层 : 连接协议,用户验证,提供连线线程
SQL层 : 语法,语义,权限,解析,优化,执行
存储引擎层: 从磁盘上提取数据逻辑结构
库 : 库名字,库属性
表 : 表名,列,行,属性物理结构
宏观:
库 -----> 目录
表 ----->
MyISAM: frm myi myd
InnoDB: frm ibd
微观:
段
区
页用户权限
create user
drop user
alter user
mysql.user
grant
revoke8.0.16二进制安装&& 5.7.26升级到8.0(扩展项)
[root@db01 /usr/local]# mv mysql-8.0.16-linux-glibc2.12-x86_64 mysql80
[root@db01 /usr/local]# chown -R mysql.mysql mysql80
[root@db01 /usr/local]# mkdir -p /data/mysql/data80
[root@db01 /usr/local]# chown -R mysql.mysql /data/
[root@db01 /usr/local]# mv /etc/my.cnf /etc/my.cnf.bak
[root@db01 ~]# cat /etc/my80.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql80
datadir=/data/mysql/data80
socket=/tmp/mysql80.sock
port=3380
[root@db01 ~]# /usr/local/mysql80/bin/mysqld_safe --defaults-file=/etc/my80.cnf &
===========================
5.6 升级 到 5.7 思路
- 安装新版本软件
- 改软连接或配置文件basedir
- 用5.7的软件启动5.6的数据
- mysql_upgrade -uroot -p123 -S /tmp/mysql.sock
注意: 备份.
https://dev.mysql.com/doc/refman/5.7/en/upgrade-binary-package.html#upgrade-procedure-inplace
===========================
跨版本升级 :
不要夸多个版本
看好版本
开发私下找你要root管理员权限
银行:
走流程.一般需要审核,背景调查.
举报他.
中小公司:
权利和责任全给他,通过正常的流程.思考: 开发找你开权限的流程是怎样?
(1) 邮件申请
(2) 权限
(3) 从哪来
(5) 业务库
(6) 谁来审批
grant 权限 on 权限范围 to 用户@'dizhi' identified by '密码';
- MySQL的连接管理
1.1 MySQL Linux 连接协议
Socket : 本地登录,提前创建好localhost相关用户
TCPIP : 远程登录,提前创建好 远程用户.
1.2 MySQL客户端
mysql :
[root@db01 ~]# mysql -uroot -p -S /tmp/mysql.sock
[root@db01 ~]# mysql -uoldguo -p -h10.0.0.51 -P3306
注意:
1. 不要连接时把密码写到命令行上
2. 脱敏
sqlyog :
略.
navicat :
略.
- MySQL的启动关闭
2.1 SysV
service mysqld start/stop/restart/status
2.2 systemd
[root@db01 ~]# systemctl start/stop/restart/status mysqld --socket=/tmp/aa.sock
2.3 手工启动方式(维护性操作时)
/etc/init.d/mysqld -----> /usr/local/mysql/bin/mysqld_safe ----> /usr/local/mysql/bin/mysqld
例子: 管理员用户root@'localhost',密码丢失 .
(1. 通过跳过授权表参数+跳TCP/IP的参数,启动数据库
--skip-grant-tables : 跳过授权表,连接层关闭验证模块.
--skip-networking : 关闭连接层TCP/IP,只留socket文件连接
(2. 无密码登录到MySQL
mysql
(3. 修改密码
mysql> alter user root@'localhost' identified by '123';
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 '123';
(5. 正常重启数据库
[root@db01 ~]# service mysqld restart
2.5 mysql的其他关闭方式
[root@db01 ~]# mysqladmin -uroot -p -S /tmp/mysql.sock shutdown
- 初始化配置
3.0 初始化配置方式
(1) 配置文件 *****
(2) 命令行 ***
(3) 编译安装 *
3.1 配置文件默认读取顺序(/etc/my.cnf)
[root@db01 ~]# mysqld --help --verbose |grep my.cnf
/etc/my.cnf ---> /etc/mysql/my.cnf ----> /usr/local/mysql/etc/my.cnf ---> ~/.my.cnf
scoket=A B C D
自己定义默认位置: mysqld或者mysqld_safe 加入 --defaults-file=/opt/oldguo.conf
3.2 配置文件内容
3.2.1 影响范围
服务端启动和工作
本地客户端连接(socket)
3.2.2 内容结构
标签:
服务端: [mysqld] [mysqld_safe] [server]
客户端: [mysql] [mysqldump] [client]
参数:
参数名=值
例子:
[root@db01 ~]# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
- 多实例
5.1 规划
(1) 端口 : 3307,3308,3309
(2) 数据 : /data/330{7..9}/data
(3) 配置文件: /data/330{7..9}/my.cnf
port=3307/3308/3309
server_id=7/8/9
datadir=/data/330{7..9}/data
socket=/tmp/mysql330{7..9}.sock
5.2 干活
(1) 创建关键目录
mkdir -p /data/330{7..9}/data
chown -R mysql.mysql /data/*
(2) 初始化数据
[root@db01 /data]# mv /etc/my.cnf /tmp
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data
(3) 准备配置文件
cat > /data/3307/my.cnf <
user=mysql
basedir=/usr/local/mysql
datadir=/data/3307/data
port=3307
server_id=7
socket=/tmp/mysql3307.sock
EOF
cat > /data/3308/my.cnf <
user=mysql
basedir=/usr/local/mysql
datadir=/data/3308/data
port=3308
server_id=8
socket=/tmp/mysql3308.sock
EOF
cat > /data/3309/my.cnf <
user=mysql
basedir=/usr/local/mysql
datadir=/data/3309/data
port=3309
server_id=9
socket=/tmp/mysql3309.sock
EOF
(5) 准备启动脚本
cat > /etc/systemd/system/mysqld3307.service <
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://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=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF
cat > /etc/systemd/system/mysqld3308.service <
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://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=/usr/local/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF
cat > /etc/systemd/system/mysqld3309.service <
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://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=/usr/local/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF
(6) 启动多实例
[root@db01 ~]# systemctl start mysqld3307
[root@db01 ~]# systemctl start mysqld3308
[root@db01 ~]# systemctl start mysqld3309
[root@db01 ~]# netstat -tulnp|grep mysqld
tcp6 0 0 :::3307 :::* LISTEN 10327/mysqld
tcp6 0 0 :::3308 :::* LISTEN 10361/mysqld
tcp6 0 0 :::3309 :::* LISTEN 10395/mysqld
小作业:
mysql_multi 实现多实例环境
https://dev.mysql.com/doc/refman/5.7/en/mysqld-multi.html
===============================================================
第三章 SQL基础应用&元数据获取
SQL介绍
结构化的查询语言.关系型数据库中通用的一种命令.
使用SQL_MODE规范SQL语句的语法标准.SQL_MODE
mysql> select @@sql_mode;
ONLY_FULL_GROUP_BY,
STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,
NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
确保数据有意义.SQL常用分类
DDL : 数据定义语言
DCL : 数据控制语言
DML : 数据操作语言
DQL : 数据查询语言字符集&校对规则介绍
字符集:
utf8 : 最多允许字符长度为3个字节
utf8mb4 : 最多允许字符长度为4个字节
gbk :
mysql> show charset;
校对规则 : 排序规则
AbCD
ABCD
mysql> show collation;
说明:
可以作用于库级别和表级别.一般是在建库建表时设定
- 表的属性和列的属性
6.1 表定义属性
存储引擎 : InnoDB
字符集 & 校对规则 : utf8mb4
注释
6.2 列的属性
6.2.1 数据类型
保证数据有意义.
(1) 数值类型
tinyint : 1Bytes=8bit -128~127 , 0-255 .最多存储1个字节长度数字
int : 4Bytes, 0-232,-231~2^31-1,10位数
bigint : 8Bytes, 0-264,-263~2^63-1,20位数
=
(2) 字符串类型(万能)
char(64) : 括号中最大的字符长度 255字节
定长的字符串类型,一次性分配固定长度存储空间,存不满,用空字符串填充
varchar(64) :变长的字符类型, 按需分配存储空间.
65535字节,最多65533.
1-255字符之间,单独占用1字节存储字符长度.
256-65535字符长度,单独占用2字节存储字符长度
区别 :
char(64) varchar(64)
- 定长 和 变长
- 64代表了,最多可以存储字符的个数
- 字节限制 255 , 65535字节
- varchar 需要花费额外的1-2字节存储字符长度
如何选择:
- 业务数据是定长还是变长
- 字符长度
悬念:
大表: 数据类型选择是否会影响到查询效率?
会.为什么?
enum('山东省','河北省','北京市','上海市'......) : 枚举类型
0 1 2 3
注意: 数字列不要使用,经常变化的列不要使用
(3) 时间类型
datetime
timestamp
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会受到时区的影响
(5) 二进制类型 (略)
(6) Json类型(8.0以后支持的比较好)
6.3 约束
not null 非空约束
unique key 唯一约束
primary key 主键约束(非空且唯一),一张表只能有一个,一般是ID列
数据类型约束: unsigned 非负数
6.5 其他属性
auto_increment 自增长
default 默认值
comment 注释