MySQL
一、MySQL简介
1.1 MySQL 组成和常用工具
1.1.1 客户端程序
mysql: 交互式或非交互式的CLI工具
mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成 insert等写操作语句保存文本文件中
mysqladmin:基于mysql协议管理mysqld
mysqlimport:数据导入工具
MyISAM存储引擎的管理工具:
myisamchk:检查MyISAM库
myisampack:打包MyISAM表,只读
1.1.2 服务器端程序
mysqld_safe
mysqld
mysqld_multi 多实例 ,示例:mysqld_multi --example
1.1.3 mysql命令使用格式
mysql [OPTIONS] [database]
常用选项:
-A, --no-auto-rehash 禁止补全
-u, --user= 用户名,默认为root
-h, --host= 服务器主机,默认为localhost
-p, --passowrd= 用户密码,建议使用-p,默认为空密码
-P, --port= 服务器端口
-S, --socket= 指定连接socket文件路径
-D, --database= 指定默认数据库
-C, --compress 启用压缩
-e "SQL" 执行SQL命令
-V, --version 显示版本
-v --verbose 显示详细信息
--print-defaults 获取程序默认使用的配置
1.1.4 mysqladmin命令使用格式
mysqladmin [OPTIONS] command command....
范例:
#查看mysql服务是否正常,如果正常提示mysqld is alive
mysqladmin -uroot -pcentos ping
#关闭mysql服务,但mysqladmin命令无法开启
mysqladmin -uroot -pcentos shutdown
#创建数据库testdb
mysqladmin -uroot -pcentos create testdb
#删除数据库testdb
mysqladmin -uroot -pcentos drop testdb
#修改root密码
mysqladmin -uroot -pcentos password 'magedu'
#日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N
mysqladmin -uroot -pcentos flush-logs
1.1.5 服务器端配置
1.1.5.1 服务器端配置文件
服务器端(mysqld):工作特性有多种配置方式
1、命令行选项
2、配置文件: 类似ini格式集中式的配置,能够为mysql的各种应用程序提供配置信息
服务端配置文件:
/etc/my.cnf #Global选项
/etc/mysql/my.cnf #Global选项
~/.my.cnf #User-specific 选项
配置文件格式:
[mysqld]
[mysqld_safe]
[mysqld_multi]
[mysql]
[mysqldump]
[server]
[client]
配置值格式:
parameter = value
说明:
_和- 相同
1,ON,TRUE意义相同, 0,OFF,FALSE意义相同,无区分大小写
1.1.5.2 socket 连接说明
服务器监听的两种socket地址:
-
IP socket: 监听在tcp的3306端口,支持远程通信,侦听3306/tcp端口可以在绑定有一个或全部接口的IP上
-
unix sock:监听在sock文件上,仅支持本机通信,如:/var/lib/mysql/mysql.sock
说明:host为localhost时自动使用unix sock
范例:Mysql端口
mysql> SHOW VARIABLES LIKE 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port | 3306 |
+---------------+-------+
1 row in set (0.01 sec)
#MySQL8.0增加了一个33060/tcp端口
#Port 33060 is the default port for the MySQL Database Extended Interface (the
MySQL X Protocol).
mysql> SHOW VARIABLES LIKE 'mysqlx_port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| mysqlx_port | 33060 |
+---------------+-------+
1 row in set (0.00 sec)
1.1.5.3 关闭mysqld网络连接
只侦听本地客户端口,所有客户端和服务器的交互都是通过一个socket文件实现,socket的配置存放在/var/lib/mysql/mysql.sock 可在/etc/my.cnf修改
范例:
vim /etc/my.cnf
[mysqld]
skip-networking=1
bind_address=127.0.0.1
二、MySQL安装
2.1 二进制安装
2.1.1 通用二进制格式安装 MySQL 8
2.1.1.1 准备用户
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 -d /data/mysql mysql
2.1.1.2 准备数据目录,建议使用逻辑卷
#可选做,后面的脚本mysql_install_db可自动生成此目录
mkdir /data/mysql
chown mysql:mysql /data/mysql
2.1.1.3 准备二进制程序
root@mysql01:~#tar -xvf mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz -C /app/
cd /app
ln -sv mysql-VERSION mysql
chown -R root:root /app/mysql/
2.1.1.4 准备配置文件
root@mysql01:/app/mysql# vim /etc/my.cnf
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/app/mysql
# 设置mysql数据库的数据的存放目录
datadir=/data/mysql
# 允许最大连接数
#max_connections=151
# 服务端使用的字符集默认为UTF8MB4
#character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
#default-storage-engine=INNODB
# 设置mysql的socket文件位置
socket=/data/mysql.sock
# 设置mysql服务的pid文件位置
pid-file=/data/mysql/mysql.pid
# 启用查询缓存
#query_cache_type=1
#query_cache_size=16M
# 设置默认时区
#default-time-zone='+08:00'
# 设置内部内存临时表的最大值
#tmp_table_size=16M
# 设置内存临时表的最大大小
#max_heap_table_size=16M
# 开启慢查询日志
#slow_query_log=1
#slow_query_log_file=/usr/local/mysql/data/mysql-slow.log
# 慢查询时长
#long_query_time=10
# 二进制日志配置
log_bin=/data/mysql/mysql-bin
server-id=1
skip_name_resolve = on #禁止主机名解析,建议使用
#[mysql]
# 设置客户端默认字符集
#default-character-set=utf8mb4
[client]
# 设置客户端连接服务端时默认使用的端口和socket
#port=3306
socket=/tmp/mysql.sock
#default-character-set=utf8mb4
2.1.1.5 准备环境变量
root@mysql01:/app/mysql# echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
root@mysql01:/app/mysql# . /etc/profile.d/mysql.sh
2.1.1.6 初始化数据库文件并提取root密码
2.1.1.6.1 生成随机密码
root@mysql01:/app/mysql# mysqld --initialize --user=mysql --datadir=/data/mysql
2024-06-12T06:19:03.447111Z 0 [System] [MY-013169] [Server] /app/mysql-8.0.19-linux-glibc2.12-x86_64/bin/mysqld (mysqld 8.0.19) initializing of server in progress as process 55880
2024-06-12T06:19:05.715056Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: )=r=u>j;K0i) #随机密码
2.1.1.6.2 生成空密码
mysqld --initialize-insecure --user=mysql --datadir=/data/mysql
2.1.1.7安全配置向导
root@mysql01:~# mysql_secure_installation
Securing the MySQL server deployment.
Enter password for user root:
The existing password for the user account root has expired. Please set a new password.
New password:
Re-enter new password:
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : no
... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : no
... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.
All done!
排错:
root@mysql01:~# mysql -uroot -p
mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
解决方案:
root@mysql01:~# apt install libncurses5
缺少这个包
2.2 源码编译安装
三、MySQL多实例
3.1 多实例介绍
- 什么是数据库多实例
多实例类似微信双开,端口号类比微信账号,数据库类比聊天窗口,表类比聊天记录(N50期张柏杰 语录)
MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306、3307等),同时运 行多个MySQL服务进程,这些服务进程通过不同的Socket监听不同的服务端口来提供服务。 多实例可能是MySQL的不同版本,也可能是MySQL的同一版本实现
- 多实例的好处
可有效利用服务器资源。当单个服务器资源有剩余时,可以充分利用剩余资源提供更多的服务,且 可以实现资源的逻辑隔离节约服务器资源。例如公司服务器资源紧张,但是数据库又需要各自尽量 独立的提供服务,并且还需要到主从复制等技术,多实例就是最佳选择
- 多实例弊端
存在资源互相抢占的问题。比如:当某个数据库实例并发很高或者SQL查询慢时,整个实例会消耗 大量的CPU、磁盘I/O等资源,导致服务器上面其他的数据库实例在提供服务的质量也会下降,所以 具体的需求要根据自己的实际情况而定。
3.2 多实例部署
生产中使用较少
SQL语言
一、关系型数据库的常见组件
- 数据库:databases
- 表:table,行:row,列:column
- 索引:index
- 视图:view
- 存储过程:procedure
- 存储函数:function
- 触发器:trigger
- 事件调度器:event scheduler,任务计划
- 用户:user
- 权限:privilege
1.1 SQL语言规范
- SQL标准:
#单行注释,注意有空格
-- 注释内容
#多行注释
/*注释内容
注释内容
注释内容*/
-
mysql注释:
#注释内容