数据库===》数据库安装、基本操作、MySQL的结构与多实例

数据库官网下载地址:

https://downloads.mysql.com/archives/community/

1.源码包安装MySQL(自定义目录安装)

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.二进制包安装MySQL(自定义安装目录)

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
#若提示./mysql_install_db 权限不够就给它加x权限===》chmod +x /service/mysql/scripts/mysql_install_db
#若出现FATAL ERROR: Could not find /service/mysql/bin/my_print_defaults这样报错就给bin下文件加x权限===》chmod u+x /service/mysql/bin

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)
#若提示-bash: /etc/init.d/mysqld: 权限不够就给它加x权限===》chmod +x /etc/init.d/mysqld

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

因为上面是用/etc/init.d/mysqld start启动的,所以在测试systemctl启动管理之前,先用/etc/init.d/mysqld stop停掉服务
#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安装MySQL

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

二、MySQL基本操作

1.MySQL设置密码

方式一:[root@db04 ~]# mysqladmin -uroot  password '123'  #不指定端口的情况下默认是3306
方式二:mysql> update mysql.user set PASSWORD=password('123') where user='root';   #在数据库内直接编辑user表来指定用户设置密码
方式三:mysql> set password for root@localhost = password('123');   #在数据库内直接用set password命令指定用户设置密码
方式四:mysql>grant all on *.* to 'root'@'localhost' identified by '123'#在数据库内用授权密令直接给用户加上密码 
       mysql>flush privileges;  #授权后要刷新授权

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)

三、MySQL体系结构管理

1.客户端与服务器模型

数据库===》数据库安装、基本操作、MySQL的结构与多实例_第1张图片

1)MySQL是一个典型的C/S服务结构

1.mysql自带的客户端程序(/service/mysql/bin)
	mysql
	mysqladmin
	mysqldump

2.mysqld一个二进制程序,后台的守护进程
	单进程
	多线程

2)MySQL的两种连接方式

数据库===》数据库安装、基本操作、MySQL的结构与多实例_第2张图片
数据库===》数据库安装、基本操作、MySQL的结构与多实例_第3张图片

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.MySQL服务器程序构成

mysqld是一个守护进程但是本身不能自主启动
[root@db04 ~]# /etc/init.d/mysqld start

数据库===》数据库安装、基本操作、MySQL的结构与多实例_第4张图片
数据库===》数据库安装、基本操作、MySQL的结构与多实例_第5张图片
数据库===》数据库安装、基本操作、MySQL的结构与多实例_第6张图片

1)连接层

1.验证用户的合法性(用户名、密码、白名单)
2.提供两种连接方式(TCP/IP  socket)
3.提供一个专用连接线程(接收SQL、返回结果),将SQL语句交给SQL层继续处理

2)sql层

数据库===》数据库安装、基本操作、MySQL的结构与多实例_第7张图片

1、接收到SQL语句,语法判断。
2、判断语义(判断语句类型:DML、DDL、DCL、DQL)
3、解析SQL语句,生成多种执行计划
4、优化器,选择他认为成本最低的执行计划。
5、执行器根据优化器的选择,按照优化器建议执行SQL语句,得到去哪儿找SQL语句需要访问的数据
  5.1 具体:在哪个数据文件上的哪个数据页中?
  5.2 将以上结果充送给下层继续处理
6、接收存储引擎层的数据,结构化成表的形式,通过连接层提供的专用线程,将表数据返回给用户。
7、提供查询缓存
  7.1 query_cache, 使用memcache 或者redis 替代
8、日志记录(binlog)

3)存储引擎层

1.接收到SQL层传来的SQL语句
2.与磁盘交互,取数据,结构化成表的形式,返回给SQL层
3.建立一个与SQL层交互的线程

数据库===》数据库安装、基本操作、MySQL的结构与多实例_第8张图片

五、MySQL的结构

1.MySQL的逻辑结构

MySQL的逻辑对象:做为管理人员或者开发人员操作的对象

#类似于linux命令

1.库
2.表:元数据+真实数据行
3.元数据:列+其它属性(行数+占用空间大小+权限)
4.列:列名字+数据类型+其他约束(非空、唯一、主键、非负数、自增长、默认值)
最直观的数据:二维表,必须用库来存放

MySQL逻辑结构与Linux系统对比

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

2.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.区:连续的多个页构成(一个区,连续的64页组成,默认1M)
3.页:最小的数据存储单元,默认是16KB (一个页,连续的4个os block)
4.分区表:一个区构成一个段就是一个表
	数据源库经常会进行拆分,横向拆分和竖向拆分,逻辑上划分区域,而分区表是将数据页构成的区单独拆出一个表

数据库===》数据库安装、基本操作、MySQL的结构与多实例_第9张图片

六、同版本MySQL的多实例

#1.NGINX多实例:
    就是多个配置文件
#2.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.启动数据库报错解决

1.启动以上服务失败比如:
[root@db01 scripts]# mysqld_safe --defaults-file=/data/3309/my.cnf & 失败!
“mysqld_safe mysqld from pid file /data/3309/data/web03. exepid”	# 若出现此提示
也可查看错误日志===》vim /data/3309/data/mysql.err
2021-02-25 04:39:03 4462 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
2021-02-25 04:39:03 4462 [ERROR] Plugin 'InnoDB' init function returned error.
2021-02-25 04:39:03 4462 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2021-02-25 04:39:03 4462 [ERROR] Unknown/unsupported storage engine: InnoDB
2021-02-25 04:39:03 4462 [ERROR] Aborting

2.错误原因:
是由于swap分区可用内存不够了,只需增加一下swap空间内存就可以了!

3.解决方法如下:
sudo dd if=/dev/zero of=/swapfiles bs=1M count=1024	# 吐一个如此大的临时交换分区文件
sudo mkswap  /swapfiles 	# 制作临时swap交换分区
sudo swapon /swapfiles	# 开启临时swap交换分区
mysqld_safe --defaults-file=/data/3309/my.cnf &	# 再次启动测试,成功!

 #详情参考 https://www.copylian.com/technology/96.html 解决方法参考此文档!

7.检查启动

[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     

8.多实例设置密码

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

9.多实例验证

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

10.连接多实例小技巧

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

七、不同版本MySQL多实例

1.不同版本数据库多实例前期准备

(这里是新的服务器没有环境变量干扰,如果设置了环境变量需要先注释掉)
数据库===》数据库安装、基本操作、MySQL的结构与多实例_第10张图片

#1.官网下载8.0.18版本二进制包,上传到服务器,解压,做软连接  (5.6.46版本步骤相同)
[root@db03 ~]# rz  #上传压缩包
[root@db03 ~]# mkdir /service  #创建一个放包的文件夹
[root@db03 ~]# tar xf mysql-8.0.18-二进制包linux-glibc2.12-x86_64.tar.xz  #解压
[root@db03 ~]# mv mysql-8.0.18-linux-glibc2.12-x86_64/ /service/  #移动
[root@db03 service]# ln -s mysql-8.0.18-linux-glibc2.12-x86_64/ mysql80  #做软连接并改名
#2.移动默认的配置文件防止干扰
[root@db03 ~]# mv /etc/my.cnf /etc/my.cnf.bak
#3.准备不同的目录
[root@db03 ~]# mkdir -p /data/{3317,3318}/data
[root@db03 ~]# mkdir -p /binlog/{3317,3318}
[root@db03 ~]# useradd mysql -s /sbin/nologin -M    #创业MySQL用户
[root@db03 ~]# chown -R mysql.mysql /data/* /binlog/*   #给创建的用户修改属主属组

2.准备配置文件 (这里3317用MySQL5.6.46版本,3318用MySQL8.0.18版本)

#1.配置5.6.46配置文件
[root@db03 ~]# vim /data/3317/my.cnf
[mysqld]
basedir=/service/mysql56
databir=/data/3317/data
port=3317
server_id=17
log_error=/data/3317/mysql.log
log_bin=/binlog/3317/mysql-bin
socket=/tmp/mysql3317.sock
#2.配置8.0.18配置文件
[root@db03 ~]# vim /data/3318/my.cnf
[mysqld]
basedir=/service/mysql80
databir=/data/3318/data
port=3318
server_id=18
log_error=/data/3318/mysql.log
log_bin=/binlog/3318/mysql-bin
socket=/tmp/mysql3318.sock

3.初始化数据

#1.5.6版本初始化数据
[root@db03 ~]# /service/mysql56/scripts/mysql_install_db  --user=mysql  --datadir=/data/3317/data  --basedir=/service/mysql56

#2.8.0版本初始化数据
[root@db03 ~]# /service/mysql80/bin/mysqld  --initialize-insecure  --user=mysql  --datadir=/data/3318/data  --basedir=/service/mysql80

4.准备启动脚本

#1.8.0本版启动脚本
[root@db03 ~]# vim /etc/systemd/system/mysqld3318.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=/service/mysql80/bin/mysqld  --defaults-file=/data/3318/my.cnf
LimitNOFILE=5000

#2.5.6版本启动脚本
[root@db03 ~]# vim /etc/systemd/system/mysqld3317.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=/service/mysql56/bin/mysqld  --defaults-file=/data/3317/my.cnf
LimitNOFILE=5000

5.开启数据库,查看启动端口

[root@db03 ~]# systemctl start mysqld3317
[root@db03 ~]# systemctl start mysqld3318
[root@db03 ~]# netstat -tulnp   #查看数据库启动端口

八、字符集和校对规则

1.sql_mode SQL 模式

#1.作用:规范SQL语句书写方式
mysql> select @@ sql_mode;   #5.7版本规范
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_SUBSTIYUION

#2.举例说明作用(面试可回答)
  比如说:
  在现实的数学角度,除法运算中,除数不能为0.
  当MySQL中需要做出发运算时,为了保证符合现实的数学逻辑,也需要保证除数不能为0.
  所以MySQL通过设定sql_mode参数值,规范我们的除法运算,从而保证不会出现违背显示数学逻辑的sql语句。
  再比如说:
  现实情况下,我们描述日期时,0年0月0日在现实中是不被允许的。
  在MySQL中等同于NO_ZERO_IN_DATE,NO_ZERO_DATE。

2.字符集和校对规则

#1.字符集:
      utf8:最大存储长度,单个字符最多3个字节
      utf8mb4(建议):最大存储长度,单个字符最多4个字节
#2.差别:
      utf8mb4支持的编码比utf8更多
#3.举个例子:
      比如,emoji字符mb4中支持,utf8不支持。emoji表情字符,1个字符占4个字节,utf8存不下。
#4.MySQL实际应用示例:
      show charset;   #5.7版本默认是latinl(拉丁文)
      create database zabbix charset utf8mb4;   #更改字符集为utf8mb4
      show create database zabbix;   #查看zabbix字符集      
#1.校对规则:
     每种字符集,有多种校对规则(排序规则)
     show collation;
#2.作用:
     影响到排序的操作。简单来说就是大小写是否敏感。

九、MySQL数据类型和约束

1.整数、小数

         存储长度             二进制数字范围          十进制数字范围
tinyint    1B    = 8bit      00000000~11111111     0~255,-128~127
int        4B    =32bit      略                    0~2^32-1,-2^31~2^63-1
bigint     8B    =64bit      略                    0~2^64-1,-2^63~2^63-1

2.字符串类型

char(长度):定长字符串类型       255字符
varchar(长度):变长字符串类型   65536字符
enum('bj','sh','tj',...):枚举类型(优点:节省空间,提升数据性能)
      1    2    3         '下标索引'

例如:
char(10):最多存10个字符,如果存储的字符不够10个,自动用空格填充剩余空间。对于磁盘空间,都会占到10个字符长度。
varchar(10):最多存10个字符,按需分配存储空间
补充:
1.varchar类型,在存储数据时,会先判断字符长度,然后合理分配存储空间
而char类型,不会判断,立即分配空间。
2.varchar类型,除了会存储字符串之外,还会额外使用1-2字节存储字符长度。
3.应用场景:字符串固定长度的话用char类型(手机号、身份证号),不固定用varchar类型
4.括号中数学问题:括号中,不同种类的字符,占用的存储空间是不一样的。
   对于英文和数字,每个字符占1个字节长度
   对于中文,占用空间大小,要考虑字符集。
   utf8,utf8mb4,每个中文占3个字节长度。emoji字符,每个中文,占4个字节长度。
   总长度不能超过数据类型的最大长度。65536  

3.时间类型

datatime:范围从1000-01-01 00:00:00.000000至9999-12-31 23:59:59.999999(占8字节长度)
timestamp:范围从1970-01-01 00:00:00.000000至2038-01-19 03:14:07.999999(占4字节长度,受时区影响)

4.二进制类型(图片视频等,不常用MySQL存储)

5.json类型(以后版本主流)

id:101
name:'zhangsan'

6.约束

Primary Key:主键约束,作用:唯一+非空,每张表只能有一个主键,作为聚簇索引。
not null:非空约束,作用:必须非空,我们建议每个列都设置非空。
unique Key:唯一约束,作用:必须是不重复的值。
unsigned:针对数字列,非负数。

7.其他属性

default:默认值
comment:注释

十、SQL应用

1.client客户端自带常用命令

\c:结束上一条命令运行
\G:格式化输出
\q:退出MySQL会话(等同于ctrl+d)
source:导入sql脚本,类似于<
system:在数据库内调用Linux命令

2.server服务端常用命令(DDL)

linux中一切皆命令,Linux中一切皆文件
MySQL中一切皆SQL,MySQL中一切皆库、表

#1.库定义:库名  库属性
(1)创建库:create database oldboy charset utf8mb4;
     规范:1.库名:小写,与业务有关,不要数字开头,库名不要太长,不能使用保留字符串。
         2.必须指定字符集
(2)查询库:show databases;   #查询所有库
           show create database oldboy;  #查询指定oldboy库
(3)修改库:alter database oldboy charset utf8mb4;
     A=====>B  B是A字符集的严格超集
(4)删除库:drop database oldboy;  #危险,不代表生产操作。
     注意:生产数据库中,除了管理员,任何人没有删库权限。


#2.表定义
(1)创建表(带属性创建):
mysql> create table lhd.student(
    -> id int not null primary key auto_increment comment'学号',
    -> name varchar(10) not null comment'姓名',
    -> age tinyint unsigned not null comment'年龄',
    -> gender enum('man','girl') not null default 'man' comment'性别',
    -> cometime datetime default now() comment'入学时间',
    -> birthday datetime comment'生日',
    -> class varchar(10) not null comment'学生班级');
建表规范:
    1.表名:小写字母,不能数字开头,表名和业务有关,名字不要太长,不能使用关键字
    2.必须设置存储引擎和字符集。
    3.数据类型:合适、简短、足够
    4.必须要有主键
    5.每个列尽量设置not null,不知道填啥,设定默认值
    6.每个列要有注释
    7.列名不要太长
(2)查询表:show tables;  #查询所有表
           desc student;  #查询指定student表
           show create table student;  #查询新创建的student表
(3)修改表:
--1.添加手机号列:alter table student add shouji int not null  unique key comment'手机号';
--2.将shouji列数据类型修改为char(11):alter table student modity shouji char(11) not null unique key comment'手机号';
--3.删除手机号列(危险):alter table student drop shouji;
(4)删除表:drop table student;

十一、企业案例

#DBA工作内容:
1.公司接胆子,开发一个wordpress博客产品  20w ===>销售
2.设计产品功能  产品逻辑图
3.研发部门  设计和开发产品功能(代码+数据库开发  ER图)
4.开发测试功能
5.运维交付生产系统
6.DBA:审核所有SQL语句,制定备份策略,日常维护规范,监控,数据库架构设计,性能,故障。

#线上DDL(alter)操作对于生产的影响?
SQL审核平台:yearing inception
说明:元数据是什么?类似于Linux Inode信息
在MySQL中,DDL语句在对表进行操作时,是要锁‘元数据表’的,此时,所有修改类的命令无法正常运行。
所以:
   在对于大表,业务繁忙的表,进行线上DDL操作,要谨慎。
   尽量避开业务繁忙期间,进行DDL。

面试题

数据库===》数据库安装、基本操作、MySQL的结构与多实例_第11张图片

面试题回答要点:
1.SQL语句的意思是什么?
以上4条语句是对2张核心业务表进行DDL加列操作
2.以上操作带来的影响?
在MySQL中,DDL语句在对表进行操作时,是要锁‘元数据表’的,此时,所有修改类的命令无法正常运行。
所以:在对于大表,业务繁忙的表,进行线上DDL操作,要谨慎。 尽量避开业务繁忙期间,进行DDL。
3.我们的建议?
(1)尽量避开业务繁忙期间,进行DDL。走流程
(2)建议使用:pt-osc(pt-online-schema-change)
             gh-ost 工具进行DDL操作,减少锁表的影
(3)如果是8.0版本,可以不用pt工具,8.0以前一般需要借助于以上工具。

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