第一章 数据库介绍
1. 什么是数据库?
业务中,敏感,安全和一致性要求高的.
2. 数据库种类
RDBMS : Oracle MySQL PG MSSQL NoSQL : MongoDB Redis ES NewSQL: TiDB
PolarXDB TDSQL
第二章 MySQL的介绍和安装
1. MySQL 分支
Oracle Percona Mariadb RDS TX
2. MySQL 企业版本选择
5.7 : 5.7.28+
8.0 : 8.0.18+GA 6-12月版本,GA15-20版本以上的.
3. 获取软件
https://downloads.mysql.com/archives/community/
4. 安装MySQL 8.0.20
4.1 准备操作系统环境
准备一台全新的虚拟机
4.2 上传和解压
[root@db01 opt]# tar xf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
[root@db01 opt]# ln -s /opt/mysql-8.0.20-linux-glibc2.12-x86_64 /usr/local/mysql
[root@db01 mysql]# vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH
[root@db01 mysql]# source /etc/profile
[root@db01 mysql]# mysql -V
mysql Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)
4.3 卸载无用软件
[root@db01 ~]# yum remove -y mariadb-libs
4.4 创建用户
[root@db01 ~]# useradd mysql
4.5 创建目录并授权
[root@db01 ~]# mkdir -p /data/3306/data
[root@db01 ~]# chown -R mysql. /data
4.6 准备配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
4.7 初始化MySQL系统数据
[root@db01 mysql]# yum install -y libaio-devel
[root@db01 mysql]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
++++++++++++++++++++++++
mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
2020-12-14T10:25:50.587761Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
++++++++++++++++++++++++
正确的输出:
[root@db01 mysql]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
2020-12-14T10:27:26.083747Z 0 [System] [MY-013169] [Server] /opt/mysql-8.0.20-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.20) initializing of server in progress as process 2205
2020-12-14T10:27:26.176690Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2020-12-14T10:27:31.329930Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-12-14T10:27:34.098237Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
[root@db01 mysql]#
4.8 准备启动脚本
[root@db01 support-files]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
sys-v :
[root@db01 support-files]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL... SUCCESS!
[root@db01 support-files]#
systemd:
[root@db01 support-files]# systemctl enable mysqld
mysqld.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mysqld on
[root@db01 support-files]#
[root@db01 support-files]# systemctl restart mysqld
[root@db01 support-files]# systemctl stop mysqld
第三章 MySQL 体系结构及基础管理
1. 体系结构
1.1 MySQL C/S工作模型
Server : mysqld
Client : mysql ,mysqldump ,开发工具(sqlyog navicat workbench),API
1.2 MySQL 实例
公司: boss + 经理 + 员工 + 办公区
实例: mysqld + master thread + 工作线程 + 预分配的内存
1.3 mysqld程序结构
Server层 : 连接层 SQL层
engine层 : FS
1.4 SQL语句的执行过程
1.5 MySQL物理存储结构认识
1.5.1 宏观认识
库---> 目录
表---> xxx.ibd
1.5.2 微观认识
引入: Linux 文件系统如何应用的?
/dev/sdb ---> mkfs.xfs /dev/sdb ----> mount /dev/sdb /data
extent:区(簇),连续的64个pages,默认1M.
page :页,默认16KB,连续4个OS block
block :块.默认4KB,连续的8个512字节
2. MySQL 基础管理
2.1 用户管理
2.1.1 作用?
登录数据库
管理数据库对象
2.1.2 定义
用户名@'白名单'
白名单?
允许登录的IP地址列表.
oldguo@'localhost' 允许本地登录
oldguo@'10.0.0.%' 允许10.0.0.0/255.255.255.0
oldguo@'10.0.0.0/255.255.254.0'
oldguo@'10.0.0.5%'
2.1.3 用户的管理
a. 查询用户
mysql> select user,host,plugin,authentication_string from mysql.user;
b. 创建用户
mysql> create user oldboy@'localhost';
mysql> create user oldguo@'localhost' identified by '123';
mysql> create user oldxu@'localhost' identified with mysql_native_password by '123';
注意:
1.
8.0之后,不再支持grant一次性创建用户授权了.必须先建用户后授权.
2.
8.0之后,密码插件改为caching_sha2_password,早期版本是mysql_native_password
c. 修改用户
mysql> alter user oldguo@'localhost' identified by '123';
mysql> alter user oldguo@'localhost' identified with mysql_native_password by '123';
mysql> alter user oldboy@'localhost' account lock;
mysql> alter user oldboy@'localhost' account unlock;
d. 删除用户
mysql> drop user oldboy@'localhost';
2.2 权限管理
2.2.1 作用
限制用户能够对数据库对象干些什么事.
2.2.2 权限定义
命令.
mysql> show privileges;
ALL? 所有? 真的是所有吗?
不包含Grant option.
一般管理员才会拥有ALL权限.
应用用户一般具备以下权限即可.
select,update ,delete ,insert
2.2.3 存哪?
授权表
user : 全局级别
db : 单库级别
tables_priv : 单表级别
columns_priv
procs_priv
proxies_priv
Grant ALL on *.* to ......
*.* chmod -R 777 /
oldboy.* chmod -R 777 /oldboy
oldboy.t1 chmod -R 777 /oldboy/t1
2.2.4 权限管理
a. 授权 grant
例子1:给oldguo@'localhost'授权为本地管理员.
解:
Grant ALL on *.* to oldguo@'localhost';
例子2: 给oldxu@'localhost' 授权为oldxu业务的应用用户
grant select,update,delete ,insert on oldxu.* to oldxu@'localhost' ;
b. 查询权限
mysql> show grants for oldxu@'localhost';
mysql> select * from mysql.db\G
c. 回收 revoke
select ----> update
mysql> revoke delete on oldxu.* from oldxu@'localhost';
2.3 连接管理
2.3.1 自带客户端程序
a. socket 本地套接字文件
在哪?
socket=/tmp/mysql.sock
应用:
[root@db01 ~]# mysql -uoldguo -p123 -S /tmp/mysql.sock
前提:
需要提前创建oldguo@'localhost'
b. TCP/IP
前提:
需要提前创建remote@'10.0.0.%'
mysql> create user remote@'10.0.0.%' identified by '123';
Query OK, 0 rows affected (0.02 sec)
mysql> grant all on *.* to remote@'10.0.0.%';
应用:
[root@db01 ~]# mysql -uremote -p123 -h10.0.0.51 -P3306
2.4 启动关闭
2.4.1 启动
mysqld &
mysqld_safe &
[root@db01 data]# mysqld_safe --port=3333 &
面试题案例: 管理员root@'locahost' 丢失,怎么处理.
--skip-grant-tables
--skip-networking
a. 关闭数据库实例
/etc/init.d/mysqld stop
b. 特殊模式启动
mysqld_safe --skip-grant-tables --skip-networking &
c. 登录刷新授权表
[root@db01 data]# mysql
mysql> flush privilges;
d. 改密码
mysql> alter user root@'localhost' identified by '123';
e. 重启到正常模式
[root@db01 data]# /etc/init.d/mysqld restart
2.4.2 通用关闭方式
service mysqld stop
/etc/init.d/mysqld stop
mysql --> shutdown
mysqladmin shutdown
2.5 配置文件管理
2.5.1 配置文件的默认读取位置
[root@db01~]# mysqld --help --verbose | grep my.cnf
[root@db01~]# mysqld_safe --defaults-file=/opt/my.cnf &
2.5.2配置文件结构
[root@db01~]# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
port=3306
[mysql]
socket=/tmp/mysql.sock
标签
【标签】
分类不同程序的参数
服务标签:【mysqld】【mysqld_safe】【server】
客户端标签:【mysql】【mysqldump】【client】
mysqld_safe 比 mysqld 参数更加丰富
说明:
在生产中,多实例情况下。初始化数据库,需要加载配置文件进行
例如
mysqld --defaluts-file=/opt/mysql.cnf --initialize-insecure
2.6 多实例
2.6.1应用场景
测试环境
大型架构
单实列节点配置8核16g
2.6.2测试环境
单节点多实例同版本
共用同一套软件启动三次mysqld
安装配置
①准备授权目录
[root@db01 ~]# mkdir -p /data/330{7..9}/data
[root@db01 ~]# chown -R mysql. /data
② 配置文件编写
cat > /data/3307/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3307/data
socket=/tmp/mysql3307.sock
port=3307
EOF
cat > /data/3308/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3308/data
socket=/tmp/mysql3308.sock
port=3308
EOF
cat > /data/3309/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3309/data
socket=/tmp/mysql3309.sock
port=3309
EOF
③初始化三份数据
mysqld --defaults-file=/data/3307/my.cnf --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
mysqld --defaults-file=/data/3308/my.cnf --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
mysqld --defaults-file=/data/3309/my.cnf --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3309/data
④启动
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
mysqld_safe --defaults-file=/data/3309/my.cnf &
⑤测试
socket方式连接数据库
mysql -S /tmp/mysql3307.sock
mysql -S /tmp/mysql3307.sock
mysql -S /tmp/mysql3307.sock
netstat -lntup 检测端口
会发现启动了多个mysqld进程
单节点多实例多版本
多个不同版本软件启动mysqld
安装配置
①上传软件包到/opt下
② 准备授权目录
[root@db01 ~]# mkdir -p /data/335{6..7}/data
[root@db01 ~]# chown -R mysql. /data
③软连接
ln -s /opt/mysql-5.6.46-linux-glibc2.12-x86_64 /usr/local/mysql56
ln -s /opt/mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql57
④配置文件
cat >/data/3356/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql56
datadir=/data/3356/data
socket=/tmp/mysql3356.sock
port=3356
[mysql]
socket=/tmp/mysql3356.sock
EOF
cat >/data/3357/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql57
datadir=/data/3357/data
socket=/tmp/mysql3357.sock
port=3357
[mysql]
socket=/tmp/mysql3357.sock
EOF
⑤初始化
/usr/local/mysql57/bin/mysqld --defaults-file=/data/3357/my.cnf --initialize-insecure
/usr/local/mysql56/scripts/mysql_install_db --defaults-file=/data/3356/my.cnf --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/3356/data
⑥启动
/usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3357/my.cnf &
/usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/3356/my.cnf &