数据库 2

上节回顾:

  1. 数据库产品
    RDBMS: Oracle,MySQL,PG,MSSQL
    NoSQL: Redis,MongoDB,ES,memcached

  2. MySQL分支
    Oracle
    MariaDB
    percona
    RDS,PolarDB,OB

  3. MySQL版本选择
    GA 6-12月
    5.6 : 5.6.38 2017 0913
    5.7 : 5.7.20

  4. 安装-初始化
    5.6 :
    /usr/local/mysql/scripts/mysql_install_db

5.7
mysqld --initialize-insecure

  1. C/S
    TCP/IP: mysql -uroot -p123 -h10.0.0.51 -P3306
    socket: mysql -uroot -p123 -S /tmp/mysql.sock

  2. MYSQLD的程序结构
    连接层 : 连接协议,用户验证,提供连线线程
    SQL层 : 语法,语义,权限,解析,优化,执行
    存储引擎层: 从磁盘上提取数据

  3. 逻辑结构
    库 : 库名字,库属性
    表 : 表名,列,行,属性

  4. 物理结构
    宏观:
    库 -----> 目录
    表 ----->
    MyISAM: frm myi myd
    InnoDB: frm ibd
    微观:


  5. 用户权限
    create user
    drop user
    alter user
    mysql.user
    grant
    revoke

  6. 8.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 思路

  1. 安装新版本软件
  2. 改软连接或配置文件basedir
  3. 用5.7的软件启动5.6的数据
  4. mysql_upgrade -uroot -p123 -S /tmp/mysql.sock
    注意: 备份.
    https://dev.mysql.com/doc/refman/5.7/en/upgrade-binary-package.html#upgrade-procedure-inplace
    ===========================

跨版本升级 :

  1. 不要夸多个版本

  2. 看好版本

  3. 开发私下找你要root管理员权限
    银行:
    走流程.一般需要审核,背景调查.
    举报他.
    中小公司:
    权利和责任全给他,通过正常的流程.

  4. 思考: 开发找你开权限的流程是怎样?
    (1) 邮件申请
    (2) 权限
    (3) 从哪来
    (5) 业务库
    (6) 谁来审批

grant 权限 on 权限范围 to 用户@'dizhi' identified by '密码';

  1. 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 :
略.

  1. 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

  1. 初始化配置
    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

  1. 多实例
    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 < [mysqld]
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 < [mysqld]
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 < [mysqld]
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 < [Unit]
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 < [Unit]
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 < [Unit]
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基础应用&元数据获取

  1. SQL介绍
    结构化的查询语言.关系型数据库中通用的一种命令.
    使用SQL_MODE规范SQL语句的语法标准.

  2. 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
    确保数据有意义.

  3. SQL常用分类
    DDL : 数据定义语言
    DCL : 数据控制语言
    DML : 数据操作语言
    DQL : 数据查询语言

  4. 字符集&校对规则介绍
    字符集:
    utf8 : 最多允许字符长度为3个字节
    utf8mb4 : 最多允许字符长度为4个字节
    gbk :

mysql> show charset;

校对规则 : 排序规则
AbCD
ABCD
mysql> show collation;

说明:
可以作用于库级别和表级别.一般是在建库建表时设定

  1. 表的属性和列的属性
    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)

  1. 定长 和 变长
  2. 64代表了,最多可以存储字符的个数
  3. 字节限制 255 , 65535字节
  4. varchar 需要花费额外的1-2字节存储字符长度

如何选择:

  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 注释

你可能感兴趣的:(数据库 2)