[root@db01 ~]# systemctl start mysql #启动 [root@db01 ~]# systemctl enable mysql #设置开机自启动. [root@db01 ~]# ps aux |grep mysqld |grep -v grep #查看进程,mysqld_safe为启动mysql的脚本文件,内部调用mysqld命令 mysql 3329 0.0 0.0 113252 1592 ? Ss 16:19 0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr mysql 3488 0.0 2.3 839276 90380 ? Sl 16:19 0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock [root@db01 ~]# netstat -an |grep 3306 #查看端口 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN [root@db01 ~]## ll -d /var/lib/mysql #权限不对,启动不成功,注意user和group drwxr-xr-x 5 mysql mysql 4096 Jul 20 16:28 /var/lib/mysql
初始状态下,管理员root,密码为空,默认只允许从本机登录localhost 设置密码 [root@egon ~]# mysqladmin -uroot password "123" 设置初始密码 由于原密码为空,因此-p可以不用 [root@egon ~]# mysqladmin -uroot -p"123" password "456" 修改mysql密码,因为已经有密码了,所以必须输入原密码才能设置新密码 命令格式: [root@egon ~]# mysql -h172.31.0.2 -uroot -p456 [root@egon ~]# mysql -uroot -p [root@egon ~]# mysql 以root用户登录本机,密码为空
#启动时,加一条配置跳过授权库 [root@db01 ~]# vim /etc/my.cnf #mysql主配置文件 [mysqld] skip-grant-table [root@db01 ~]# systemctl restart mysql [root@db01 ~]# mysql mysql [(none)]> update mysql.user set password=password("1") where user="root" and host="localhost"; mysql [(none)]> flush privileges; mysql [(none)]> \q [root@db01 ~]# #打开/etc/my.cnf去掉skip-grant-table,然后重启 [root@db01 ~]# systemctl restart mysql [root@db01 ~]# mysql -u root -p123 #以新密码登录
#1. 修改配置文件 [root@db01 ~]# vim /etc/my.cnf [mysqld] default-character-set=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 #mysql5.5以上:修改方式有所改动 [root@db01 ~]# vim /etc/my.cnf ... ... [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 #源码包安装的my.cnf(sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES)与 [mysql] default-character-set=utf8mb4 有冲突,我就删了 #2. 重启服务 #3. 查看修改结果: \s show variables like '%char%'
1)mysql是一个典型的C/S服务结构
1.mysql自带的客户端程序(/service/mysql/bin) mysql mysqladmin mysqldump 2.mysqld一个二进制程序,后台的守护进程 单进程 多线程
2)MySQL的两种连接方式
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连接
1.实例
1.MySQL的后台进程+线程+预分配的内存结构。 2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。 1.什么是实例? 一个进程 + 多个线程 + 预分配内存空间 2.多实例? 多个进程 + 多个线程 + 多个预分配的内存空间
2.mysqld服务器程序构成
mysqld是一个守护进程但是本身不能自主启动 [root@db04 ~]# /etc/init.d/mysqld start
1)连接层
1.验证用户的合法性 2.提供两种连接方式(TCP/IP socket) 3.建立一个与SQL层交互的线程
2)sql层
1.接收连接层传来的SQL语句 2.验证语法 3.验证语义(DML,DDL,DCL,DQL) 检查你输入的SQL语句是 select insert update delete... grant 4.解析器:解析你的SQL语句,生成多种执行计划 5.优化器:接收解析器传来的多种执行计划,选择最优的一种 6.执行器:将优化器选择出的最优的SQL,执行 6.1 建立一个与存储引擎层 交互的线程 6.2 将执行语句交给存储引擎层,取数据 接收存储引擎层,结构化成表的数据结果 7.如果你的前端有缓存,写缓存 8.记录日志(binlog)
3)存储引擎层
1.接收到SQL层传来的SQL语句 2.与磁盘交互,取数据,结构化成表的形式,返回给SQL层 3.建立一个与SQL层交互的线程
/etc/init.d/mysqld start ------> mysql.server ------> mysqld_safe ------> mysqld systemctl start mysql ------> mysqld_safe ------> mysqld mysqld_safe --defaults-file=/etc/my.cnf ------> mysqld_safe ------> mysqld
/etc/init.d/mysqld stop systemctl stop mysqld mysqladmin -uroot -p123 shutdown #不建议使用 kill -9 pid killall mysqld pkill mysqld #出现问题: 1.如果在业务繁忙的情况下,数据库不会释放pid和sock文件 2.号称可以达到和Oracle一样的安全性,但是并不能100%达到 3.在业务繁忙的情况下,丢数据(补救措施,高可用)
1.mysqladmin -uroot -p123 password '1' 2.update mysql.user set password=password('123') where user='root' and host='localhost'; 3.set password=password('1'); 修改当前用户的密码 4.grant all on *.* to 'root'@'localhost' identified by '123';
mysql #常见的特定于客户机的连接选项: -u: 指定用户 mysql -uroot -p: 指定密码 mysql -uroot -p567 -h: 指定主机域 mysql -uroot -p567 -h127.0.0.1 -P: 指定端口 mysql -uroot -p567 -h127.0.0.1 -P3307 -S: 指定socket文件 mysql -uroot -p567 -S /tmp/mysql.sock -e: 指定SQL语句(库外执行SQL语句) mysql -uroot -p567 -e "show databases;" #--protocol: 指定连接方式 mysql --protocol=TCP --protocol=socket
1.sqlyog 2.navicat #注意:数据库是没有外网的,想连接可以使用通道 3.heidisql 4.应用程序连接MySQL #注意:需要加载对应语言程序的API
NGINX多实例就是多个配置文件 mysql多实例: 1.多个数据目录 2.多个端口 3.多个socket文件 4.多个日志文件
[root@db01 ~]# mkdir /data/{3307,3308,3309} -p
[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
[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
[root@db01 scripts]# chown -R mysql.mysql /data
[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 &
[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
[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'
[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 | +---------------+-------+
[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*