数据库介绍
数据库课程体系
数据库简介
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.7 建议使用二进制包安装,因为它已经cmake过了,已经装好了 boostorg
1 、MySQL5.7 安装,登录boost.org下载也可以
[ root@db02 ~]
[ root@db02 ~]
[ root@db02 ~]
[ root@db02 ~]
[ root@db02 mysql-5.7.20]
-DMYSQL_DATADIR= /application/mysql-5.7.20/data \
-DMYSQL_UNIX_ADDR= /application/mysql-5.7.20/tmp/mysql.sock \
-DDOWNLOAD_BOOST= 1 \
-DWITH_BOOST= /usr/local/boost_1_59_0 \
-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= bundled \
-DENABLED_LOCAL_INFILE= 1 \
-DWITH_EMBEDDED_SERVER= 1 \
-DENABLE_DOWNLOADS= 1 \
-DWITH_DEBUG= 0
2 、初始化命令的区别
[ root@db01 ~]
[ root@db01 ~]
--user
--basedir
--datadir
--initialize
--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 ~]
总用量 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
/etc/init.d/mysqld stop
[ root@db03 ~]
Starting MySQL.Logging to '/usr/local/mysql/data/db03.err' .
.. ERROR! The server quit without updating PID file ( /usr/local/mysql/data/db03.pid) .
----------------------------------------------------------------------------------------------------
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
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
[ root@db03 ~]
[ root@db03 ~]
[ root@db03 ~]
[ root@db03 ~]
修改安装路径
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
ln -s /service/mysql-5.6.46 /usr/local/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
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
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
[ root@db03 ~]
[ root@db03 ~]
[ root@db03 ~]
[ root@db03 ~]
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
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
sed -i '/^\[mysqld/abasedir=/service/mysql\n datadir=/service/mysql/data' /etc/my.cnf
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
mysqladmin
[ root@db01 ~]
mysqldump
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
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>
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系统对比
MySQL Linux 库 目录 show databases; ls -l / use mysql cd /mysql 表 文件 show tables; ls 二维表=元数据+真实数据行 文件=文件名+文件属性
2.mysql物理结构
1 )MySQL的最底层的物理结构是数据文件,也就是说,存储引擎层,打交道的文件,是数据文件。
2 )存储引擎分为很多种类(Linux中的FS)
[ root@db03 ~]
-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
-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页 16k 2页 16k 3页 16k 4页 16k 5页 16k 6页 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 \
-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
2 )在命令行设定启动初始化配置
--skip-grant-tables
--skip-networking
--datadir= /service/mysql/data
--basedir= /service/mysql
--defaults-file= /etc/my.cnf
--pid-file= /service/mysql/data/mysql.pid
--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
资料来源:https://www.iteye.com/blog/hello-jesson-1569388
资料来源: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
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)生效顺序测试
[ root@db01 ~]
[ mysqld]
server_id = 1
[ root@db01 ~]
[ root@db01 ~]
[ mysqld]
server_id = 2
[ root@db01 ~]
[ mysqld]
server_id = 3
[ root@db01 ~]
[ mysqld]
server_id = 4
[ root@db01 ~]
[ root@db01 ~]
[ root@db01 ~]
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 4 |
+---------------+-------+
[ root@db01 ~]
[ root@db01 ~]
[ root@db01 ~]
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3 |
+---------------+-------+
[ root@db01 ~]
[ root@db01 ~]
[ root@db01 ~]
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
[ root@db01 ~]
[ root@db01 ~]
[ root@db01 ~]
Warning: Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
3、执行参数优先级
1)socket 配置文件目录
socket = /service/mysql/tmp/mysql.sock
--socket= /tmp/mysql.sock
vim /etc/my.cnf
[ mysqld]
socket = /opt/mysql.sock
--defaults-file= /tmp/a.txt
vim /tmp/a.txt
[ mysqld]
socket = /tmp/test.sock
2)配置参数优先级测试
mysql_safe --defaults-file= /tmp/a.txt --socket= /tmp/mysql.sock &
测试结果:
/tmp/mysql.sock
mysql_safe --defaults-file= /tmp/a.txt
测试结果:
/tmp/test.sock
/etc/init.d/mysqld start
测试结果:
/opt/mysql.sock ( opt目录要授权mysql权限才能写入sock文件)
vim /etc/my.cnf
[ mysqld]
/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 ~]
[ client]
user = root
password = 123456
3)影响服务端的启动
[ root@db01 ~]
[ mysqld]
server_id = 2
[ root@db01 ~]
[ root@db01 ~]
+---------------+-------+
| 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模式。
mysql> select @@session.sql_mode;
mysql> select @@sql_mode;
mysql> select @@global.sql_mode;
当前会话有效【退出 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' ;
配置文件 /etc/my.cnf 内容
[ mysqld]
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
1 、sql_mode= 无 no_engine_substitution 时,create table 时指定的 engine[ 存储引擎] 项不被支持,mysql会把表的引擎改为 innodb
2 、sql_mode= 有 no_engine_substitution 时,create table 时指定的 engine[ 存储引擎] 项不被支持,这个时候mysql会支持报错
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 ~]
[ mysqld]
server_id = 2
socket = /tmp/mysql.sock
[ mysql]
socket = /tmp/mysql.sock