这是在 Linux 中安装 MySQL 的教程:Linux 下 MySQL 安装。本系列测试用的 MySQL 版本是 5.7,机器是 centOS7.6。
实际应用中,一般 MySQL 服务都是部署在 Linux 主机上的,如果想在 Windows 系统中安装,可以参考:Windows 下 MySQL 安装。
MySQL 在安装时会为用户设置一个默认的随机密码,可以通过:
cat /var/log/mysqld.log | grep 'temporary password'
来查看密码:
2023-10-20T08:04:42.247710Z 1 [Note] A temporary password is generated for root@localhost: crOcKwwB;7Wd
其中,crOcKwwB;7Wd
就是密码,使用它来登录:
mysql -uroot -p # 以 root 身份登录
修改 root 用户的密码有多个方法,在此介绍其中一种,在命令行中使用:
[root@xy xy]# mysqladmin -uroot -p'旧密码' password '新密码'
[注] 如果出现以下提示,则说明密码过于简单:
mysqladmin: unable to change password; error: 'Your password does not satisfy the current policy requirements'
mysql -uroot -p # 以 root 身份登录
h: 表示你要连接的 MySQL 服务器所在的主机,127.0.0.1 表示本主机。如果连接的是本地数据库服务器,它可以省略。
P: 表示你要连接的 MySQL 服务器所对应的端口号,一般默认是 3306。
u: 表示用哪一个用户连接 MySQL 服务器,root 表示超级用户。
p: 表示该用户对应的密码,密码可以直接跟在-p 后面,也可以回车后输入。
为了方便学习,都以 root 用户登录数据库服务器。
在 MySQL 服务器的命令行中键入quit
/exit
/\q
回车以退出。
systemctl 是一个用于控制和检查 systemd 系统和服务管理器的工具,它负责在 Linux 内核启动后运行和维护用户空间的组件。systemctl 可以用来启动、停止、重启、重载、启用、禁用等各种操作 systemd 的服务单元,也可以用来查看系统的状态、日志、性能等信息。
终止服务器进程:
systemctl stop mysqld
启动服务器进程:
systemctl start mysqld
重启服务器进程:
systemctl restart mysqld
mysqld
可以是你想要操作的进程名称。
MySQL 的配置文件在这个路径:
cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
port=3306
character-set-server=utf8
default-storage-engine=innodb
其中各个选项的含义是:
其中打*
号的是自定义的选项,可能数据库默认的选项就是它们,但为了保险,仍然显式地在配置文件中设定。datadir 的路径可以自定义,但这里使用默认的路径。当配置完毕后,要使配置文件生效,(重启 mysqld 后)重新连接 MySQL 服务。
在这里简单介绍一下索引:如果说数据库是一本字典,那么索引就是字典的目录。有了目录才能提高查找的效率,但目录本身也是占用数据库的空间的,所以这是空间换时间的做法。
在/var/lib/mysql
路径下, 存放的是 MySQL 的所有数据库和表文件。例如创建了一个数据库test_db
:
mysql> create database test_db
在这个目录下会增加一个同名目录:
这个目录下有一个db.log
文件,它记录这个数据库的默认字符集和字符校验规则:
如果在这个数据库中创建一个表:
mysql> use test_db; # 进入数据库
mysql> create table test_table( # 创建表
-> col int(2)
-> );
.frm 和 .ibd 是两种不同类型的文件:
需要注意的是,这两种文件都不能直接打开查看,而是由 MySQL 组织搭配的文件。如果需要查看或修改表结构,可以使用 SQL 语句;如果需要查看或修改表数据,可以使用 SQL 查询和更新语句。
而 MyISAM 存储引擎创建表时,会创建三个文件。
以上这些内容对于初学者而言可以不细究,只要知道我们在操作数据库或表的本质是对文件操作,只不过是间接地通过数据库软件支持的 SQL 语句操作,而不直接操作文件。
上面这些操作数据库和表的 SQL 语句将会在后续学习,此处只是站在文件的角度理解。
上面的操作是用户使用 SQL 语句,让 MySQL 创建数据库和表,假如用户直接操作这些底层文件会发生什么呢?下面直接将刚才创建的数据库test_db
这个目录下的所有文件删除:
rm -rf test_db/
在 MySQL 客户端中查看数据库:
######## 删除前 ########
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_db |
+--------------------+
5 rows in set (0.00 sec)
######## 删除后 ########
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
从效果上说,直接操作文件和执行 SQL 语句是一样的,但是这样做不能保证数据的安全性。例如多个客户端并发访问同一个数据库的同一张表这种情况,数据库需要限制不同客户端的行为,以保证数据的一致性等。MySQL 会记录用户的所有操作(除了修改密码这类私密的语句),并会进行一定的语法优化,将它们合并到一起。
数据库备份或移植,本质就是将这些文件拷贝,放在其他目录下。虽然这么做不会怎样,但是这是一种越级的操作。MySQL 在操作文件时,也是使用诸如rm
、cp
、mkdir
这些操作的。
注
MySQL 默认有四个数据库,每个数据库都有其特定的用途:
show processlist 命令可以显示当前连接到 MySQL 服务器的线程的信息,可以使用这个命令来监控服务器的性能,排查问题,或者终止某些线程。
其中:
这个命令通常用于监控服务器的性能,排查问题或终止某些线程,也可以帮助分析 SQL 语句的执行时间,锁等待和事务隔离级别等。