03Mysql 01 安装连接启动配置

数据库介绍

数据库课程体系

img

数据库简介

1、数据

数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据。
在计算机系统中,数据以二进制信息单元 0 1 的形式表示。

数据的定义: 数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。

一般数据存储:
存储在word里,缺点:
	1.word存储,打开时加载内存
	2.数据查询不方便
	3.安全级别不高
	4.word不支持集群
所以,我们需要数据库管理系统

2、数据库管理系统

用来管理数据的系统 DBMS(database management system)

3、数据库管理系统种类

1、关系型数据库(RDBMS):以多张二维表的方式来存储,又给多张表建立了一定的关系(关系型数据库)
MySQL
Oracle
MSSQL(SQLserver) 
范式:把数据库数据拆分成多个表,拆到不能再拆

2、非关系型数据库(NoSQL):一般情况NoSQL用来做缓存
redis
	set key value  设置值
	get key        获取值
memcache
mongodb
elasticsearch(搜索引擎式数据库)

很多以json格式进行存储数据的(mongodb),java代码的数据可以转成json格式给到python或者php进行解析

3、关系型数据库和非关系型数据库对比
关系型数据库:
	1.强大的查询功能
	2.强一致性(事务)
	3.二级索引

非关系型数据库:
	1.灵活
	2.扩展性(扩展比较方便)
	3.性能高(缓存)

4、关系型数据库和非关系型数据库特点
特点对比:
关系型数据库(RDBMS)的特点:
	1.二维表
	2.数据存取是通过SQL(Structured Query Language结构化查询语言)
	3.最大特点数据安全性方面强(ACID)
		事务的四大特征:原子性,一致性,隔离性,持久性
		Atomic(原子性):所有语句作为一个单元全部成功执行或全部取消。
		Consistent(一致性):如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
		Isolated(隔离性):事务之间不相互影响。
		Durable(持久性):事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失。

非关系型数据库(NoSQL:Not only SQL)的特点:
	1.不是否定关系型数据库,而是做关系型数据库的补充。
	2.性能高

5、NoSQL特性总览
	1. 不是否定关系型数据库,而是做关系型数据库的补充,现在也有部分替代mongodb的趋势。
	2. 关注高性能,高并发,灵活性,忽略和上述无关的功能。
	3. 现在也在提升安全性和使用功能。
	4. 典型产品:redis(持久化缓存)、MongoDB(最接近关系型数据库的NoSQL)、memcached。
	5. 管理不使用SQL管理,而是用一些特殊的API或数据接口。

6、NoSQL的分类、特点、典型产品
	1.键值(KV)存储:memcached、redis
	2.列存储(column-oriented):HBASE(新浪、360)Cassandra(200台服务器集群)
	3.文档数据库(document-oriented):MongoDB(最接近关系型数据库的NoSQL)
	4.图形存储(Graph):Neo4j

MySQL

MySQL 版本介绍

- 1.0
- 5.1
- 5.5
- 5.6
- 5.7
- 8.0

我们选择数据库的时候,选择版本潜规则:
	5.6版本选择:GA 6-12个月 ,小版本是偶数版
	5.7版本选择:GA 6-12个月 ,小版本是偶数版 , 5.7.17版本以上(MGR,MySQL自带的高可用)

# mysql5.6 和 mysql5.7 安装的区别
如果安装 mysql5.7 建议使用二进制包安装,因为它已经cmake过了,已经装好了 boostorg
1、MySQL5.7 安装,登录boost.org下载也可以
[root@db02 ~]# yum install -y gcc gcc-c++ automake autoconf
[root@db02 ~]# yum install make cmake bison-devel ncurses-devel libaio-devel
[root@db02 ~]# wget httpss://dl.bintray.com/boostorg/release/1.65.1/source/boost_1_59_0.tar.gz
#解压下载的安装包
[root@db02 ~]# tar xf boost_1_59_0.tar.gz -C /usr/local/
#编译
[root@db02 mysql-5.7.20]# cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.7.20 \	#程序存放位置
-DMYSQL_DATADIR=/application/mysql-5.7.20/data \										#数据存放位置
-DMYSQL_UNIX_ADDR=/application/mysql-5.7.20/tmp/mysql.sock \					#socket文件存放位置
-DDOWNLOAD_BOOST=1 \					#安装boost
-DWITH_BOOST=/usr/local/boost_1_59_0 \	#指定boost目录
-DDEFAULT_CHARSET=utf8 \				#使用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 \					#启用zlib库支持(zib、gzib相关)
-DWITH_SSL=bundled \					#启用SSL库支持(安全套接层)
-DENABLED_LOCAL_INFILE=1 \				#启用本地数据导入支持
-DWITH_EMBEDDED_SERVER=1 \				#编译嵌入式服务器支持
-DENABLE_DOWNLOADS=1 \					# mysql5.6支持了google的c++mock框架了,允许下载,否则会安装报错
-DWITH_DEBUG=0							#禁用debug(默认为禁用)

2、初始化命令的区别
#5.6初始化命令
[root@db01 ~]# /service/mysql/scripts/mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data

#5.7初始化命令
[root@db01 ~]# /service/mysql/bin/mysqld --initialize --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data
--user					# 指定用户
--basedir				# 指定安装目录
--datadir				# 指定数据目录
--initialize 			# 会生成一个密码文件,5.7设置密码必须大小写+数字
--initialize-insecure	# 还可以用另外一个参数,这个不会生成密码文件

MySQL 安装方式

1.yum的rpm安装

2.二进制安装,安装包大,安装速度快

3.源码包安装,安装包小,安装速度慢,
源码包生成编译安装【 make && make install 】之后就是二进制安装包

#官方网站社区版下载页面
https://downloads.mysql.com/archives/community/

#安装注意事项
1、配置文件中的 sock 文件目录配置,服务端和客户端一定要相同,使用绝对路径,这样不会出错

二进制安装

不修改安装路径

	#安装依赖
yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel
	#下载二进制包
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
	#解压
tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
	#移动并改名
mv mysql-5.6.46-linux-glibc2.12-x86_64 /usr/local/mysql-5.6.46
	#统一用户、创建软链接、复制配置文件
useradd mysql -Ms /sbin/nologin
ln -s /usr/local/mysql-5.6.46 /usr/local/mysql
\cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
\cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
	#初始化
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
	# 初始化成功的标示
	1.出现2个 ok
	2.查看数据目录
[root@db01 ~]# ll /usr/local/mysql/data/
总用量 110600
-rw-rw---- 1 www www 12582912 2020-07-20 18:57 ibdata1
-rw-rw---- 1 www www 50331648 2020-07-20 18:57 ib_logfile0
-rw-rw---- 1 www www 50331648 2020-07-20 18:57 ib_logfile1
drwx------ 2 www www     4096 2020-07-20 18:57 mysql
drwx------ 2 www www     4096 2020-07-20 18:57 performance_schema
drwxr-xr-x 2 www www       20 2020-07-20 17:29 test

----- 如果初始化的时候使用的是 --user=mysql 就可以使用 /etc/init.d/mysqld start 启动,否则请忽略 此处 -----
	#启动数据库并验证启动成功与否
/etc/init.d/mysqld start
netstat -lntp | grep 3306
	#验证通过及时关闭 mysql
/etc/init.d/mysqld stop

# 特别注意:如果初始化的时候使用的是 --user=mysql 就可以使用 /etc/init.d/mysqld start 启动,否则会出错
[root@db03 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/usr/local/mysql/data/db03.err'.
.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/db03.pid).
----------------------------------------------------------------------------------------------------

	#建立 systemd 管理的 mysql 服务
cat > /usr/lib/systemd/system/mysql.service << EOF
[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=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
EOF
systemctl daemon-reload

#编辑 systemctl 启动 mysql 服务用到的配置文件
cat > /etc/my.cnf << EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
log_error=mysql.err
pid-file=mysql.pid
skip_name_resolve				#禁止域名解析
character_set_server = utf8
server_id=1
gtid_mode=on
enforce_gtid_consistency
log_bin=mysql-bin				#开启binlog日志
log-slave-updates				#从库配置此项表示会向binlog文件中写入数据
relay_log_purge=0				#relay_log清除选项默认是开启的,0表示关闭自动清除,让relay-log一直存在

[mysql]
socket=/tmp/mysql.sock
EOF

#启动数据库并验证启动成功与否
systemctl enable mysql
systemctl start mysql
netstat -lntp | grep 3306
ps -ef | grep [m]ysql

#绝对路径执行登陆 mysql 命令
[root@db03 ~]# /usr/local/mysql/bin/mysql
#将登陆 mysql 命令写入环境变量中,就可以直接在命令行执行 mysql 否则就要输入命令的绝对路径
[root@db03 ~]# echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile.d/pz.sh
[root@db03 ~]# source /etc/profile.d/pz.sh
[root@db03 ~]# mysql

修改安装路径

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz

yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel

tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz

mkdir /service
mv mysql-5.6.46-linux-glibc2.12-x86_64 /service/mysql-5.6.46

ln -s /service/mysql-5.6.46 /service/mysql
useradd mysql -Ms /sbin/nologin
\cp /service/mysql/support-files/my-default.cnf /etc/my.cnf
\cp /service/mysql/support-files/mysql.server /etc/init.d/mysqld

#初始化数据库
/service/mysql/scripts/mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data

#因为变更了安装 mysql 的目录,所以需要对配置文件进行修改才可以启动 mysql ,方法有2种
	#方法一
	ln -s /service/mysql-5.6.46 /usr/local/mysql

	#方法二
#更改配置文件中的 mysql 服务启动文件位置
sed -i 's#/usr/local#/service#g' /etc/init.d/mysqld /service/mysql/bin/mysqld_safe
#启动数据库并验证启动成功与否
/etc/init.d/mysqld start
netstat -lntp | grep 3306

#建立 systemctl 管理 mysql 服务
cat > /usr/lib/systemd/system/mysql.service << EOF
[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
EOF
systemctl daemon-reload

#编辑 systemctl 启动 mysql 服务用到的配置文件
cat > /etc/my.cnf << EOF
[mysqld]
basedir=/service/mysql
datadir=/service/mysql/data
port=3306
socket=/tmp/mysql.sock
log_error=mysql.err
pid-file=mysql.pid
skip_name_resolve
character_set_server = utf8
server_id=1
gtid_mode=on
enforce_gtid_consistency
log_bin=mysql-bin
log-slave-updates
relay_log_purge=0

[mysql]
socket=/tmp/mysql.sock
EOF

#启动数据库并验证启动成功与否
systemctl start mysql
netstat -lntp | grep 3306

#绝对路径执行登陆 mysql 命令
[root@db03 ~]# /service/mysql/bin/mysql
#将登陆 mysql 命令写入环境变量中,就可以直接在命令行执行 mysql 否则就要输入命令的绝对路径
[root@db03 ~]# echo 'export PATH=/service/mysql/bin:$PATH' >> /etc/profile.d/pz.sh
[root@db03 ~]# source /etc/profile.d/pz.sh
[root@db03 ~]# mysql

MySQL源码安装

不修改安装路径

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.46.tar.gz

yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel

tar xf mysql-5.6.46.tar.gz

cd mysql-5.6.46
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.46 \
-DMYSQL_DATADIR=/usr/local/mysql-5.6.46/data \
-DMYSQL_UNIX_ADDR=/usr/local/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

make && make install

ln -s /usr/local/mysql-5.6.46 /usr/local/mysql
useradd mysql -Ms /sbin/nologin
rm -f /etc/my.cnf
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

cat > /usr/lib/systemd/system/mysql.service << EOF
[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=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
EOF

systemctl daemon-reload
mkdir /usr/local/mysql/tmp
chown -R mysql.mysql /usr/local/mysql-5.6.46
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile.d/pz.sh

#编辑 systemctl 启动 mysql 服务用到的配置文件
cat > /etc/my.cnf << EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
log_error=mysql.err
pid-file=mysql.pid
skip_name_resolve
character_set_server = utf8
server_id=1
gtid_mode=on
enforce_gtid_consistency
log_bin=mysql-bin
log-slave-updates
relay_log_purge=0

[mysql]
socket=/tmp/mysql.sock
EOF

systemctl start mysql
netstat -lntp | grep 3306
bash

修改安装路径

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.46.tar.gz

yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel

tar xf mysql-5.6.46.tar.gz

mkdir /service
cd mysql-5.6.46
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

make && make install

ln -s /service/mysql-5.6.46 /service/mysql
useradd mysql -Ms /sbin/nologin
rm -f /etc/my.cnf
cp /service/mysql/support-files/my-default.cnf /etc/my.cnf
cp /service/mysql/support-files/mysql.server /etc/init.d/mysqld

/service/mysql/scripts/mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data

cat > /usr/lib/systemd/system/mysql.service << EOF
[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
EOF

systemctl daemon-reload
mkdir /service/mysql/tmp
chown -R mysql.mysql /service/mysql-5.6.46
echo 'export PATH=/service/mysql/bin:$PATH' >> /etc/profile.d/pz.sh

#方法一:编辑 systemctl 启动 mysql 服务用到的配置文件
sed -i '/^\[mysqld/abasedir=/service/mysql\ndatadir=/service/mysql/data' /etc/my.cnf
#方法二:编辑 systemctl 启动 mysql 服务用到的配置文件
cat > /etc/my.cnf << EOF
[mysqld]
basedir=/service/mysql
datadir=/service/mysql/data
port=3306
socket=/tmp/mysql.sock
log_error=mysql.err
pid-file=mysql.pid
skip_name_resolve
character_set_server = utf8
server_id=1
gtid_mode=on
enforce_gtid_consistency
log_bin=mysql-bin
log-slave-updates
relay_log_purge=0

[mysql]
socket=/tmp/mysql.sock
EOF

systemctl start mysql
systemctl enable mysql
netstat -lntp | grep 3306
bash

安装后默认四个数据库

information_schema	#无法删除
•保存了MySQl服务所有数据库的信息。
•具体MySQL服务有多少个数据库,各个数据库有哪些表,各个表中的字段是什么数据类型,各个表中有哪些索引,各个数据库要什么权限才能访问。

mysql
•保存MySQL的权限、参数、对象和状态信息。
•如哪些user可以访问这个数据、DB参数、插件、主从

performance_schema	#删除后无法恢复,需要重新初始化才可以恢复
•主要用于收集数据库服务器性能参数
•提供进程等待的详细信息,包括锁、互斥变量、文件信息
•保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断
•对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期,例如(CYCLE、MICROSECOND)

test
空库没有东西,任何用户都有权限操作

MySQL 体系结构

MySQL 是 C/S 服务结构

1、mysql自带的客户端程序(程序路径:/service/mysql/bin)
	#客户端程序名称
	mysql			#登陆 mysql
	mysqladmin		#修改密码和操作 mysql
	[root@db01 ~]# mysqladmin -uroot password '123456'
	mysqldump		#导出 mysql 数据

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

连接工具

1、mysql自带的连接命令 mysql
#常见用于连接的参数:
-u:			指定用户   		mysql -uroot
-p:			指定密码   		mysql -uroot -p123
-h:			指定连接的主机   mysql -uroot -p123 -h10.0.0.51
-P:			指定端口   		mysql -uroot -p123 -h10.0.0.51 -P3307
-S:			指定socket文件  mysql -uroot -p123 -S /tmp/mysql.sock
-e:			库外执行语句	   mysql -uroot -p123456 -e 'show databases'

#多此一举的指定连接方式,可以不记
--protocol   指定连接方式   mysql --protocol=TCP 或 --protocol=socket

2、第三方的连接工具
	1).sqlyog
	2).Navicat
#注意:数据库是没有外网的,想连接可以使用ssh通道
3.应用程序连接(研发使用)

连接方式

1.TCP/IP的连接方式
2.套接字连接方式,也就是socket连接

3.举例:
	3.1 TCP/IP连接
	mysql -uroot -p -h127.0.0.1
	mysql -uroot -p -h127.0.0.1 -S /tmp/mysql.sock
	mysql -uroot -p -S /tmp/mysql.sock -h127.0.0.1
	mysql -uroot -p -hlocalhost -h127.0.0.1
	3.2 socket连接
	mysql -uroot -p -hlocalhost
	mysql -uroot -p123
	mysql -uroot -p123 -S /tmp/mysql.sock
	mysql -uroot -p -h127.0.0.1 -hlocalhost
	
4.注意:
	4.1 不一定-h都是TCP/IP连接,-hlocalhost就是socket连接
	4.2 socket连接速度比TCP/IP连接快,因为TCP/IP连接需要建立三次握手
	
	命令: show processlist; 
如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接
show processlist 只列出前100条,如果想全列出请使用 show full processlist

# 查看当前的连接方式
mysql> show slave \s
--------------
mysql  Ver 14.14 Distrib 5.6.46, for linux-glibc2.12 (x86_64) using  EditLine wrapper

Connection id:		7
Current database:	
Current user:		root@db01
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.6.46 MySQL Community Server (GPL)
Protocol version:	10
Connection:		172.16.1.51 via TCP/IP		#这里可以看出连接方式
Server characterset:	latin1
Db     characterset:	latin1
Client characterset:	utf8
Conn.  characterset:	utf8
TCP port:		3306
Uptime:			21 hours 28 min 52 sec

Threads: 1  Questions: 68  Slow queries: 0  Opens: 67  Flush tables: 1  Open tables: 60  Queries per second avg: 0.000
--------------

    -> \c
mysql> 


# Windows 连接 MySQL 还有2种
named pipe
  只适合在 windows 下使用此种方式连接 , 性能可比 tcp/ip 方式提升 30%-50%

如 : mysql -u username -p password --protocol=pipe [ --socket=mysql ]
  服务器端要求配置 : enable-named-pipe
           socket=MySQL
  后面选项中可不填 , --protocol=pipe 之后 --socket=mysql 可省略指定

shared memory
  4.1 版本之后 , mysql 对 windows 系统还提供了共享内存的连接方式 . 由于此种连接方式几乎无法收到详细介绍 , 所以此连法之优缺点也不慎清楚 .: mysql --protocol=memory --shared-memory-base-name=mysql
  需要服务器端配置 : shared_memory=ON share_memory_base_name=mysql .

MySQL 服务构成

1、实例

1.MySQL的后台进程+线程+预分配的内存结构。
2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。
3.什么是实例?
	一个进程 + 多个线程 + 分配内存空间
4.多实例?
	多个进程 + 多个线程 + 分配内存空间
5、MySQL 进程数量可以通过命令查看
ps -ef | grep [m]ysql

2、mysqld 服务程序构成

mysqld是一个守护进程
1)连接层
1.验证用户的身份,用户名密码是否匹配
2.提供两种连接方式(TCP/IP连接、socket连接)
3.连接层提供了一个与sql层交互的线程【所以可以在命令行执行 MySQL语句】
2)SQL层
1.接收连接层传过来的SQL语句
2.验证执行的SQL语法
3.验证SQL的语义(DDL,DML,DQL,DCL)
4.解析器:解析SQL语句,生成执行计划
5.优化器:在解析器传来的执行计划中选择最优的一条
6.执行器:执行最优的那条计划
	6.1 与存储引擎层建立交互的线程
	6.2 将要执行的sql发给存储引擎层
7.如果有缓存,则走缓存
8.记录日志(binlog)
3)存储引擎层
1.建立与 SQL 层交互的线程
2.接收 SQL 层传来的语句
3.与磁盘交互,获取数据,返回给 SQL 层

MySQL 结构

1.mysql的逻辑结构

1、库
2、表:元数据+真实数据行
3、元数据:列+其它属性(行数+占用空间大小+权限)
4、列:列名字+数据类型+其他约束(非空、唯一、主键、非负数、自增长、默认值)

MySQL逻辑结构与Linux系统对比

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

2.mysql物理结构

1)MySQL的最底层的物理结构是数据文件,也就是说,存储引擎层,打交道的文件,是数据文件。
	#【相当于 /service/mysql/data 中的数据文件】

2)存储引擎分为很多种类(Linux中的FS)
[root@db03 ~]# ll /service/mysql/data/mysql/
# myisam 存储引擎
-rw-rw---- 1 mysql mysql   8820 2020-04-18 16:39 columns_priv.frm
-rw-rw---- 1 mysql mysql      0 2020-04-18 16:39 columns_priv.MYD
-rw-rw---- 1 mysql mysql   4096 2020-04-18 16:39 columns_priv.MYI
# innodb 存储引擎
-rw-rw---- 1 mysql mysql  10719 2020-04-18 16:39 slave_master_info.frm
-rw-rw---- 1 mysql mysql  98304 2020-04-18 16:39 slave_master_info.ibd

3)不同存储引擎的区别:存储方式、安全性、性能

#注意:开发创建数据库及表的时候全都要小写,

3.mysql物理大小

1、段:理论上一个表就是一个段,由多个区构成,(分区表是一个分区一个段)
2、区:连续的多个页构成
3、页:最小的数据存储单元,默认是16k
4、分区表:一个区构成一个段就是一个表,在一个表里面只有一个区
段:整张表=1区+2区+3区
1区=1+2页2区=3+4页3区=5+6页
1页 16k2页 16k3页 16k4页 16k5页 16k6页 16k

MySQL 启动停止

1.启动数据库流程

1./etc/init.d/mysqld start -----> mysql.server -----> mysqld_safe -----> mysqld
2.mysqld_safe --defaults-file=/etc/my.cnf -----> mysqld_safe -----> mysqld
3.systemctl start mysql -----> mysqld_safe -----> mysqld

2.停止数据库

1./etc/init.d/mysqld stop
2.mysqladmin -uroot -p123 shutdown
3.systemctl stop mysql
4.mysqladmin -S /service/3307/mysql.sock shutdown  (多实例关闭方式)

#不推荐的关闭方式
kill -9 mysqlpid
killall mysqld
pkill mysqld
#可能出现的问题
1、如果在业务繁忙的情况下,数据库不会释放pid和sock文件
2、号称可以达到和Oracle一样的安全性,但是并不能100%达到
3、在业务繁忙的情况下,丢数据(补救措施,高可用)

MySQL 配置

1、预编译、初始化、配置文件

1)我不知道程序在哪?	                       --basedir
2)我也不知道我将来启动后去哪找数据库?		   --datadir
3)将来我启动的时候启动信息和错误信息放在哪?		 $datadir/db01.err   --log-error=/mysql/db01.err
4)我启动的时候sock文件pid文件放在哪?			  $datadir/db01.pid   --pid-file=/mysql/db01.pid
5)我启动,你们给了我多少内存?

1)预编译:cmake去指定,硬编码到程序当中去
#程序存放位置
cmake . -DCMAKE_INSTALL_PREFIX=/service/mysql-5.6.46 \
#数据存放位置
-DMYSQL_DATADIR=/service/mysql-5.6.46/data \
#socket文件存放位置
-DMYSQL_UNIX_ADDR=/service/mysql-5.6.46/tmp/mysql.sock \
#设置字符集为 utf8
-DDEFAULT_CHARSET=utf8 \
#设置校验规则为 utf8_general_ci
-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 库支持(zip、gzip相关)
-DWITH_ZLIB=bundled \
#启用 SSL 库支持(安全 套阶层)
-DWITH_SSL=system \
#启用本地数据导入支持
-DENABLED_LOCAL_INFILE=1 \
#编译嵌入式服务支持
-DWITH_EMBEDDED_SERVER=1 \
# mysql5.6 支持了google 的 c++mock 框架,允许下载,否则会安装报错
-DENABLE_DOWNLOADS=1 \
#禁用 debug(默认为禁用)
-DWITH_DEBUG=0

2)在命令行设定启动初始化配置
#启动时不启动授权表【慎用,在忘记密码的时候和 --skip-networking 一起使用】
--skip-grant-tables
#启动时不支持网络访问【慎用】
--skip-networking
#设置数据存储目录
--datadir=/service/mysql/data
#设置数据库目录
--basedir=/service/mysql
#设置配置文件目录
--defaults-file=/etc/my.cnf
#设置 pid 文件目录
--pid-file=/service/mysql/data/mysql.pid
#设置 socket 文件目录
--socket=/service/mysql/data/mysql.sock
#设置用户
--user=mysql
#设置端口
--port=3306
#设置错误日志目录
--log-error=/service/mysql/data/db01.err

3)配置文件 /etc/my.cnf 内容
[mysqld]	#默认有此行
basedir=/service/mysql
datadir=/service/mysql/data
port=3306
socket=/service/mysql/mysql.sock
log-error=/service/mysql/data/mysql.err
log-bin=/service/mysql/data/mysql-bin
server_id=0

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES		#默认有此行
# STRICT_TRANS_TABLES 存储引擎启用严格模式,非法数据值被拒绝
资料来源:https://www.iteye.com/blog/hello-jesson-1569388
# NO_ENGINE_SUBSTITUTION 
#在 sql_mode 中不包涵 no_engine_subtitution 且 create table 中 engine 子句指定的存储引擎不被支持时,mysql会把表的引擎改为 innodb
#当 sql_mode 中包涵 no_engine_subtitution 时,如果 create table 时指定的 engine 项不被支持,这个时候 mysql会支持报错
资料来源:https://www.cnblogs.com/JiangLe/p/5621856.html

总结:预编译、初始化、配置文件,这3项设置,优先级最高的是配置文件

2、数据库配置文件

1)配置文件
/etc/my.cnf
/etc/mysql/my.cnf
$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
~/.my.cnf

#defaults-extra-file (类似include)可以写在以上4个配置文件中
	#也可以用在命令行指定配置文件
mysqldump --defaults-extra-file=/etc/my.cnf

#帮助命令中提示的配置文件信息
mysqld --help --verbose|grep [c]nf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
2)读取配置文件顺序
1./etc/my.cnf
2./etc/mysql/my.cnf
3.$basedir/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
4.~/.my.cnf
3)优先级
1.~/.my.cnf
2.$basedir/my.cnf
3./etc/mysql/my.cnf
4./etc/my.cnf
4)生效顺序测试
#1.配置/etc/my.cnf
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1

#2.配置/etc/mysql/my.cnf
[root@db01 ~]# mkdir /etc/mysql
[root@db01 ~]# vim /etc/mysql/my.cnf
[mysqld]
server_id=2

#3.配置$basedir/mysql/my.cnf
[root@db01 ~]# vim /service/mysql/my.cnf
[mysqld]
server_id=3

#4.配置~/.my.cnf
[root@db01 ~]# vim ~/.my.cnf
[mysqld]
server_id=4

#4.重启数据库(注意重启时不要使用system,因为里面指定了配置文件,就不会读取其他的了)
[root@db01 ~]# systemctl stop mysql
[root@db01 ~]# /etc/init.d/mysqld start

#6.查看数据库server_id
[root@db01 ~]# mysql -uroot -p123456 -e "show variables like 'server_id'"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 4     |
+---------------+-------+

#7.删除~/.my.cnf后查看id
[root@db01 ~]# rm -rf ~/.my.cnf
[root@db01 ~]# /etc/init.d/mysqld restart
[root@db01 ~]# mysql -uroot -p123456 -e "show variables like 'server_id'"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+

#8.删除$basedir/mysql/my.cnf后查看id
[root@db01 ~]# rm -rf /service/mysql/my.cnf
[root@db01 ~]# /etc/init.d/mysqld restart
[root@db01 ~]# mysql -uroot -p123456 -e "show variables like 'server_id'"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

#9.删除/etc/mysql/my.cnf后查看id
[root@db01 ~]# rm -rf /etc/mysql/my.cnf
[root@db01 ~]# /etc/init.d/mysqld restart
[root@db01 ~]# mysql -uroot -p123456 -e "show variables like 'server_id'"
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+

3、执行参数优先级

1)socket 配置文件目录
#cmake:
socket=/service/mysql/tmp/mysql.sock

#命令行:
--socket=/tmp/mysql.sock

#配置文件:
vim /etc/my.cnf
[mysqld]
socket=/opt/mysql.sock

#default参数:
--defaults-file=/tmp/a.txt
vim /tmp/a.txt
[mysqld]
socket=/tmp/test.sock
2)配置参数优先级测试
#1.启动mysql测试socket文件位置
mysql_safe --defaults-file=/tmp/a.txt --socket=/tmp/mysql.sock &
测试结果:
	/tmp/mysql.sock
	
#2.启动mysql测试socket文件位置
mysql_safe --defaults-file=/tmp/a.txt
测试结果:
	/tmp/test.sock
	
#3.启动mysql测试socket文件位置
/etc/init.d/mysqld start
测试结果:
	/opt/mysql.sock  (opt目录要授权mysql权限才能写入sock文件)
	
#4.修改配置文件,启动数据库测试
vim /etc/my.cnf
[mysqld]
#socket=/opt/mysql.sock

/etc/init.d/mysqld restart
测试结果:
	/service/mysql/tmp/mysql.sock

4、优先级总结

#优先级排序
命令行 > --defaults-file > ~/.my.cnf > $basedir/mysql/my.cnf > /etc/mysql/my.cnf > defaults-extra-file (类似include) >/etc/my.cnf > 初始化命令 > cmake

5、配置文件的使用

1)配置文件的作用
1.影响的是客户端的连接
2.影响的是服务端的启动
2)影响客户端的连接
[root@db01 ~]# vim /etc/my.cnf
#在配置文件添加,可以不输入用户密码直接登录
[client]
user=root
password=123456
3)影响服务端的启动
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
#server_id=1 修改
server_id=2

#重启使配置文件生效
[root@db01 ~]# systemctl restart mysql
[root@db01 ~]# mysql -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
[root@db01 ~]# 
4)sql_mode 影响数据
官方网站:https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html
sql_mode 是一组mysql支持的基本语法及校验规则
#重点注意事项
1、在将数据创建和插入到数据库表中之后,更改服务器 sql_mode 可能会导致表发生重大变化,并可能导致数据丢失或损坏。
2、强烈建议,一旦创建了使用用户定义分区的表,就永远不要再更改SQL模式。
3、当复制各个表时,主和从服务器上不同的SQL模式也会导致问题。为了获得最好的结果,在主和从服务器上使用相同的SQL模式。


#显示当前会话 sql_mode 配置
mysql> select @@session.sql_mode;
#显示局部 sql_mode 配置
mysql> select @@sql_mode;
#显示全局 sql_mode 配置
mysql> select @@global.sql_mode;

#临时设置 sql_mode 【如果是全局设置,全局会立即生效,局部和当前会话需要退出再登陆 mysql 生效】
当前会话有效【退出 mysql会话 就失效】
mysql> set session sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
局部 sql_mode 修改【退出 mysql会话 就失效】
mysql> set sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
全局 sql_mode 修改【重启 mysql 失效】
mysql> set @@global.sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';

#永久设置 sql_mode 【设置后需要重启 mysql 生效】
配置文件 /etc/my.cnf 内容
[mysqld]	#默认有此行
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES		#默认有此行

	# NO_ENGINE_SUBSTITUTION
1、sql_mode=无 no_engine_substitution 时,create table 时指定的 engine[存储引擎] 项不被支持,mysql会把表的引擎改为 innodb
2、sql_mode=有 no_engine_substitution 时,create table 时指定的 engine[存储引擎] 项不被支持,这个时候mysql会支持报错

	# STRICT_TRANS_TABLES 存储引擎启用严格模式,非法数据值被拒绝
1、对于InnoDB表,STRICT_TRANS_TABLES与STRICT_ALL_TABLES模式效果一样,插入报错就全部回滚。
2、对于MyISAM表
STRICT_TRANS_TABLES:
    1)插入第一行数据失败会报错,会回滚并且停止。
    2)大于第一行之后的插入数据失败,mysql会把不合法的值强转为最为接近的值或者隐式默认值,并且不会报错。
STRICT_ALL_TABLES:如果插入执行失败会保存错误发生之前插入的行,忽略剩下的行,并报错。

资料来源:https://blog.csdn.net/hjgzj/article/details/77885090
资料来源:https://www.iteye.com/blog/hello-jesson-1569388
资料来源:https://www.cnblogs.com/JiangLe/p/5621856.html
5)总结
1.客户端程序也受配置文件影响      [mysql]  [client]
2.客户端修改配置文件可以不重启
3.服务端配置修改必须重启才能生效  [mysqld]  [server]

4.企业经常配置
[root@db01 ~]# vim /etc/my.cnf
[mysqld]		#或者写 [server]
server_id=2
socket=/tmp/mysql.sock		#服务端启动时设置的 socket 文件位置

[mysql]			#或者写 [client]
socket=/tmp/mysql.sock		#客户端启动 mysql 时,也要设置 socket 相同的文件位置,不然那会报错找不到文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值