mysql基本操作

1,安装mysql

建议一下命令用root用户执行。

1.1 安装

wget -O /tmp/mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz http://219.140.166.58:17242/linuxSoftware/mysql/mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz

解压

[root@centos-template training]# tar -xf /tmp/mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz -C /opt/

创建链接

从解压的MySQL 目录创建一个符号链接到 /usr/local/mysql。当 需要升级时, 可以用新版本的 目录 替换这个符号链接而不 用 覆盖现有 的 版本。

[root@centos-template training]# ln -s /opt/mysql* /usr/local/mysql
[root@centos-template training]# ls /usr/local/mysql/bin/

添加环境变量

将export PATH=$PATH:/usr/local/mysql/bin 添加到 ~/.bashrc 文件 的末行 使 root用户可以搜索到
/usr/local/mysql/bin路径。 若要所有用户可用,也可以添加到 /etc/profile 文件中

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
export PATH=$PATH:/usr/local/mysql/bin
[root@centos-template training]# source .bashrc 

1.2,添加配置文件

新建配置文件 /etc/my.cnf。将以下内容写入 /etc/my.cnf文件:

[root@centos-template training]# vim /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

配置文件参数说明:
• user 该进程以 mysql 用户身份运行。
• log-error 通过 mysqld_safe 启动 MySQL 时,服务器 的错误信息记录 在 /var/log/mysqld.log 文件中
• pid-file PID 文件存放在 /var/run/mysqld 中
• datadir 默认 主 目录为 /usr/local/mysql。

1.3,添加系统用户,初始化

默认情况下mysql 用户在服务器上并不存在 。通过执行 useradd -r 命令将其创建为系统用户。

通过执行mysqld --initialize 初始化数据目录并记下出现的临时密码。

 [root@centos-template training]# useradd -r mysql
 [root@centos-template training]# mysqld --initialize
 2022-09-21T08:33:45.693992Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links
 (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a futu
re release.
2022-09-21T08:33:45.694273Z 0 [System] [MY-013169] [Server] /opt/mysql-8.0.18-linux-glibc2.12-x86_64/bin/mysqld (m
ysqld 8.0.18) initializing of server in progress as process 1765
2022-09-21T08:33:50.041870Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: a62a#)iOx&rt

mysqld --initialize命令敲错成,mysqld --initialize,结果报这个错,而不是命令错误,。。。,检查了半天才出现。

2022-09-21T08:25:57.141401Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links
 (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a futu
re release.
2022-09-21T08:25:57.141823Z 0 [System] [MY-010116] [Server] /opt/mysql-8.0.18-linux-glibc2.12-x86_64/bin/mysqld (m
ysqld 8.0.18) starting as process 1703
2022-09-21T08:25:58.087282Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2022-09-21T08:25:58.098246Z 0 [ERROR] [MY-000068] [Server] unknown option '--initiailze'.
2022-09-21T08:25:58.099121Z 0 [ERROR] [MY-010119] [Server] Aborting
2022-09-21T08:25:59.718434Z 0 [System] [MY-010910] [Server] /opt/mysql-8.0.18-linux-glibc2.12-x86_64/bin/mysqld: S
hutdown complete (mysqld 8.0.18)  MySQL Community Server - GPL.

创建运行所需的目录

pid-file 选项指 定 的是 /var/run/mysqld 目录, 若 不存在 则 创建该目录并将其所有权授予 mysql 用 户和组。

[root@centos-template training]# mkdir /var/run/mysqld
[root@centos-template training]# chown mysql:mysql /var/run/mysqld/
[root@centos-template training]# ll -d /var/run/mysqld/
drwxr-xr-x 2 mysql mysql 40 Sep 21 16:43 /var/run/mysqld/

1.4登录mysql

启动 MySQL

通过执行mysqld_safe 脚本启动 MySQL。

[root@centos-template training]# mysqld_safe &
[1] 1841
[root@centos-template training]# 2022-09-21T08:57:41.908014Z mysqld_safe Logging to '/var/log/mysqld.log'.
2022-09-21T08:57:41.971131Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
[root@centos-template training]# mysql --version
mysql  Ver 8.0.18 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)

在/etc/my.cnf文件中配置 client选项组 。 添加一个 [client] 选项组,该选项组包含与 [mysqld] 选项组中相同的 键值对 socket=/var/lib/mysql/mysql.sock。

[client]
socket=/var/lib/mysql/mysql.sock

若配置文件中未加此内容,使用 mysql命令登录时 则会出现错误 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

mysql命令格式: mysql -h 主机名 -u 用户名 -p
• -h 指定客户端所要登录的 MySQL 主机名 , 登录本机 (localhost 或 127.0.0.1)该参数可以省略 ;
• -u 登录 MySQL所使用的用户名 ;
• -p:登录 MySQL的用户对应的密码 , 如果所要登录的用户名密码为空 , 可以忽略此选项。
以root 用户身份 登录 MySQL服务器。 这里使用的密码为初始化 MySQL时输出的密码。

[root@centos-template training]# mysql -uroot -p'a62a#)iOx&rt'
mysql> alter user user() identified by 'admin@123';
mysql> exit
Bye
[root@centos-template training]# mysql -uroot -p'admin@123'
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

1.5 mysql中常用命令

在MySQL客户端中,可以使用 \h、 ?、 ?、 help来获取帮助。

clear (\c) 可以取消当前的 sql语句,类似于 ctrl c

ego (\G) 可以将输出结果进行垂直显示,相当于列和行进行调换

在使用\G 后,无需再使用结束符。

prompt (\R) 可以修改 MySQL终端的提示符,提示符默认为 mysql>

tee (\T) 可以将 sql终端中的操作和输出存储到文本中。

status (\s) 可以 从服务器获取状态信息。

mysql> \s
--------------
mysql  Ver 8.0.18 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)

Connection id:9
Current database:mysql
Current user:root@localhost
SSL:Not in use
Current pager:stdout
Using outfile:''
Using delimiter:;
Server version:8.0.18 MySQL Community Server - GPL
Protocol version:10
Connection:Localhost via UNIX socket
Server characterset:utf8mb4
Db     characterset:utf8mb4
Client characterset:utf8mb4
Conn.  characterset:utf8mb4
UNIX socket:/var/lib/mysql/mysql.sock
Uptime:9 min 50 sec

Threads: 2  Questions: 49  Slow queries: 0  Opens: 183  Flush tables: 3  Open tables: 100  Queries per sec
ond avg: 0.083
--------------

quit (\q) 或 exit 可以 退出 mysql客户端

1.6 配置 MySQL 服务使用 systemd来管理

停止 MySQL

[root@centos-template training]# mysqladmin -uroot -p'admin@123' shutdown
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
2022-09-21T09:11:06.087594Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
[1]+  Done                    mysqld_safe

创建配置文件

创建/usr/lib/systemd/system/mysqld.service服务单元配置文件 。

[root@centos-template training]# vim /usr/lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://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

# Have mysqld write its state to the systemd notify socket
Type=notify

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE=5000
Restart=on-failure
RestartPreventExitStatus=1

# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false

创建/usr/local/mysql/data/目录,并修改拥有人

[root@centos-template training]# mkdir /usr/local/mysql/data/
[root@centos-template training]# chown mysql.mysql /usr/local/mysql/ -R

使用systemctl命令 启动 mysqld服务。并设为开机自启动

[root@centos-template training]# systemctl start mysqld
[root@centos-template training]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system
/mysqld.service.
[root@centos-template training]# systemctl status mysqld

2,配置mysql

2.1,使用命令行修改设置

查看系统变量,启动一个终端t1,打开 mysql 客户端会话并 查看 port 和 max_connections 系统变量的值。

[root@centos-template training]# mysql -uroot -p'admin@123'
mysql> SHOW VARIABLES LIKE 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.07 sec)

mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.01 sec)

在终端窗口t2 中,使用 mysqladmin 停止 MySQL 服务

在t2 中,使用 mysqld 命令将 MySQL 守护进程作为后台服务启动,并为以下设置指定命令行选项:
• 端口: 3300
• 最大连接数: 50
记下新启动进程的进程ID。

[root@centos-template training]# mysqladmin -uroot -p'admin@123' shutdown
[root@centos-template training]# mysqld --port=3300 --max-connections=50 &
[1] 3162

查看系统监听端口

[root@centos-template training]# ss -antpu | grep mysql
tcp    LISTEN     0      70     [::]:33060              [::]:*                   users:(("mysqld",pid=3162,fd=32))
tcp    LISTEN     0      50     [::]:3300               [::]:*                   users:(("mysqld",pid=3162,fd=29))

可以发现已经监听了3300 端口

在t1 中,显示 port 和 max_connections 系统变量的值。可以发现变量的值已经变为启动时指定的值。

在t1,在 mysql执行 SHUTDOWN命令关闭 mysqld进程

mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)

在t2中,使用 systemctl启动 mysqld进程,并 查看其状态 。

[root@centos-template training]# systemctl start mysqld
[root@centos-template training]# systemctl status mysqld

在t1 中的 mysql 提示符下,验证 port 和 maximum_connections 系统变量是否 恢复 为默认值(分别为3306 和 151。)

可以发现这两个变量都恢复为默认值。

2.2 使用 配置文件 修改设置

通过编辑 /etc/my.cnf 配置文件来更改 MySQL 设置 ,此章节使用两个 Linux终端窗口。将这些终端窗口称为 t1 和 t2。

在t2 中,使用文本编辑器编辑 /etc/my.cnf 文件,添加配置以下设置的选项:
• 端口: 3302
• 最大连接数: 52

[root@centos-template training]# vim /etc/my.cnf
[mysqld]
port=3302
max-connections=52

在终端窗口t1 的 mysql 提示符下,输入 SQL 命令以显示 port 和 max_connections 变量的值。

恢复默认设置

在t2 中,使用文本编辑器编辑 /etc/my.cnf 文件,删除上述 步骤 中配置的端口和 max_connections 设置。
在终t2中 重启 MySQL服务器。

验证port 和 max_connections 系统变量是否设置为默认值(分别为 3306 和 151)。

2.3创建特定用户的配置文件配置mysql 客户端

查看 MySQL连接方式。在mysql 客户端执行 STATUS 命令,并使用其输出来确定客户端连接 MySQL 服务器的方法。

mysql> status
--------------
mysql  Ver 8.0.18 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)

Connection id:8
Current database:
Current user:root@localhost
SSL:Not in use
Current pager:stdout
Using outfile:''
Using delimiter:;
Server version:8.0.18 MySQL Community Server - GPL
Protocol version:10
Connection:Localhost via UNIX socket
Server characterset:utf8mb4
Db     characterset:utf8mb4
Client characterset:utf8mb4
Conn.  characterset:utf8mb4
UNIX socket:/var/lib/mysql/mysql.sock
Uptime:10 min 30 sec

Threads: 2  Questions: 6  Slow queries: 0  Opens: 115  Flush tables: 3  Open tables: 35  Queries per second avg: 0.009
--------------

当前连接使用 socket进行连接 /var/lib/mysql/mysql.sock.退出mysql客户端。

设置免密登录

使用文本编辑器在家目录 创建文件 .my.cnf

[root@centos-template training]# vim ~/.my.cnf
[mysql]
prompt='\U[\d]'
protocol=tcp
user=root
password=admin@123

使用MySQL命令登录 MySQL服务器时,不要提供任何参数。

注意:
• 在登录 MySQL时没有提供密码。 mysql 客户端使用了放置在选项文件中的密码。
• 先前出现在 mysql 客户端中的 mysql> 提示已被替换为包含用户名、您连接的主机和默认数据库的提示。 由于尚未选择数据库,因此会显示提示( none)。

再次执行STATUS命令, 查看 客户端是如何连接到服务器的。

注意:
这种配置的 密码为明文, 并 不安全。 以下步骤将使用更安全的配置。
从用户的
~/.my.cnf 配置文件中删除用户和密码选项。

使用加密的文件登录

使用mysql_config_editor 程序创建一个名为 mysql 的 路径 ,该路径指定您在上一步中从纯文本配置文件
中删除的用户和密码值。

[root@centos-template training]# mysql_config_editor set --login-path=mysql --user=root --password
Enter password: 

注意:
此命令 会在 主目录中创建一个名为 ~/.mylogin.cnf 的加密文件,其中包含名为 [mysql] 的选项组中的用户、端口和密码设置。 mysql客户端默认读 取这个选项组,所以启动客户端时不需要指定 mysql登录路径。

若要取消不带参数登录MySQL 删除 ~/.my.cnf 和 ~/.mylogin.cnf 文件 即可。

3,mysql基础操作

创建数据库

在登陆MySQL 后,可以使用 create 命令创建数据库,语法如下 :

CREATE DATABASE 数据库名;
root@localhost[(none)]>create DATABASE db01;
Query OK, 1 row affected (0.01 sec)

root@localhost[(none)]>show databases;
+--------------------+
| Database           |
+--------------------+
| db01               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)

选择数据库

root@localhost[(none)]>use db01;
Database changed

执行以上命令后,你就已经成功选择了db01 数据库,在后续的操作中都会在 db01 数据库中执行。

删除数据库

drop 命令格式:

drop database 数据库名;
root@localhost[db01]>drop database db01;
Query OK, 0 rows affected (0.02 sec)

创建数据表

要在数据库中创建一个新表,可以使用MySQL CREATE TABLE语句。
以下为创建MySQL数据表的 SQL通用语法:

CREATE TABLE [IF NOT EXISTS] table_name (column_name data_type[size] [NOT NULL|NULL] [DEFAULT value]
[AUTO_INCREMENT]);

• table_name为表的名称。表名在数据库中必须是唯一的。
• IF NOT EXISTS是语句的可选部分,允许您检查正在创建的表是否已存在于数据库中。 如果是这种情况, MySQL将忽略整个语句,不会创建任何新的表。 强烈建议在每个 CREATE TABLE语句中使用 IF NOT EXISTS来防止创建已存在的新表而产生错误。
• table_name后括号中的部分为定义表中的列,若有多个列,则在各列中间使用逗号 (,,)分隔。括号中的部分为定义表的列属性
• column_name指定列的名称。每列具有特定数据类型和大小,例如: VARCHAR(255)。
• NOT NULL或 NULL表示该列是否接受 NULL值。
• DEFAULT值用于指定列的默认值。

AUTO_INCREMENT指示每当将新行插入到表中时,列的值会自动增加。每个表都有一个且只有一个 AUTO_INCREMENT

以下示例在db01 数据库中创建数据表 db01_tb1:

root@localhost[db01]>CREATE TABLE IF NOT EXISTS `db01_tb1` ( `id` INT PRIMARY KEY AUTO_INCREMENT, `title` VARCHAR(100) NOT NULL, `author` VARCHAR(40) NOT NULL,  `date`  DATE );
Query OK, 0 rows affected (0.03 sec)

root@localhost[db01]>show tables;
+----------------+
| Tables_in_db01 |
+----------------+
| db01_tb1       |
+----------------+
1 row in set (0.01 sec)

root@localhost[db01]>desc db01_tb1;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| title  | varchar(100) | NO   |     | NULL    |                |
| author | varchar(40)  | NO   |     | NULL    |                |
| date   | date         | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

插入数据

以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:

INSERT INTO table_name (field1, field2,...fieldN)
					VALUES
					(value1, value2,...valueN)

如果数据是字符型,必须使用单引号或者双引号,如::“value”。
以下示例中将向db01_tbl 表插入三条数据 :

root@localhost[db01]>insert into db01_tb1 values (1,'红楼梦', '曹雪芹', '2022-07-05');
Query OK, 1 row affected (0.02 sec)

root@localhost[db01]>insert into db01_tb1 (title, author, date) values ('西游记', '吴承恩', NOW());
Query OK, 1 row affected, 1 warning (0.00 sec)

root@localhost[db01]>insert into db01_tb1 (title,author) values ('水浒传', '施耐庵');
Query OK, 1 row affected (0.01 sec)

root@localhost[db01]>select * from db01_tb1;
+----+-----------+-----------+------------+
| id | title     | author    | date       |
+----+-----------+-----------+------------+
|  1 | 红楼梦    | 曹雪芹    | 2022-07-05 |
|  2 | 西游记    | 吴承恩    | 2022-09-21 |
|  3 | 水浒传    | 施耐庵    | NULL       |
+----+-----------+-----------+------------+
3 rows in set (0.00 sec)

MySQL UPDATE 更新

以下是UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法:

UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]

• 可以同时更新一个或多个字段。
• 可以在 WHERE 子句中指定条件。
以下示例将更新数据表中
id 为 3 的 date字段值:

root@localhost[db01]>update db01_tb1 set date='2021-11-23' where id=3;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

root@localhost[db01]>select * from db01_tb1;
+----+-----------+-----------+------------+
| id | title     | author    | date       |
+----+-----------+-----------+------------+
|  1 | 红楼梦    | 曹雪芹    | 2022-07-05 |
|  2 | 西游记    | 吴承恩    | 2022-09-21 |
|  3 | 水浒传    | 施耐庵    | 2021-11-23 |
+----+-----------+-----------+------------+
3 rows in set (0.00 sec)

MySQL DELETE 语句

可以使用SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录。
以下是SQL DELETE 语句从 MySQL 数据表中删除数据的通用语法:

DELETE FROM table_name [WHERE Clause]

• 如果没有指定 WHERE 子句, MySQL 表中的所有记录将被删除。
• 可以在 WHERE 子句中指定任何条件
以下示例将删除db01_tbl 表中 db01_id 为 3 的记录:

root@localhost[db01]>DELETE FROM db01_tb1 where id=3;
Query OK, 1 row affected (0.01 sec)

root@localhost[db01]>select * from db01_tb1;
+----+-----------+-----------+------------+
| id | title     | author    | date       |
+----+-----------+-----------+------------+
|  1 | 红楼梦    | 曹雪芹    | 2022-07-05 |
|  2 | 西游记    | 吴承恩    | 2022-09-21 |
+----+-----------+-----------+------------+
2 rows in set (0.00 sec)

MySQL ALTER命令

当需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。

删除,添加或修改表字段

以下示例使用
ALTER 命令及 DROP 子句来删除 db01_tbl表的 date 字段:

root@localhost[db01]>ALTER TABLE db01_tb1 DROP date;
Query OK, 0 rows affected (0.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

root@localhost[db01]>select * from db01_tb1;
+----+-----------+-----------+
| id | title     | author    |
+----+-----------+-----------+
|  1 | 红楼梦    | 曹雪芹    |
|  2 | 西游记    | 吴承恩    |
+----+-----------+-----------+
2 rows in set (0.00 sec)

注意:如果数据表中只剩余一个字段则无法使用DROP来删除字段。
MySQL 中使用 ADD 子句来向数据表中添加列,如下示例在表 db01_tbl中添加 des 字段,并定义数据类型 :

root@localhost[db01]>ALTER TABLE db01_tb1 ADD des varchar(255) null;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

root@localhost[db01]>desc db01_tb1;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| title  | varchar(100) | NO   |     | NULL    |                |
| author | varchar(40)  | NO   |     | NULL    |                |
| des    | varchar(255) | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

执行以上命令后,des字段会自动添加到数据表字段的末尾。

如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列 AFTER 字段名(设定位于某个字段之后)。尝试以下ALTER TABLE 语句 , 在执行成功后,使用 DESC 查看表结构的变化:

root@localhost[db01]>ALTER TABLE db01_tb1 ADD add_time datetime AFTER author;
Query OK, 0 rows affected (0.16 sec)
Records: 0  Duplicates: 0  Warnings: 0

FIRST 和 AFTER 关键字可用于 ADD 与 MODIFY 子句

修改字段类型及名称

如果需要修改字段类型及名称, 可以在 ALTER命令中使用 MODIFY 或 CHANGE 子句 。
以下示例将 字段 author 的类型从 varchar(40) 改为 varchar(20) :

root@localhost[db01]>ALTER TABLE db01_tb1 MODIFY author varchar(20);
Query OK, 2 rows affected (0.07 sec)
Records: 2  Duplicates: 0  Warnings: 0

使用CHANGE 子句 , 语法有很大的不同。 在 CHANGE关键字之后,紧跟着的是你要修改的字段名,
然后指定新字段名及类型。 示例 如下

root@localhost[db01]>ALTER TABLE db01_tb1 CHANGE des description text;
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@localhost[db01]>desc db01_tb1;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| title       | varchar(100) | NO   |     | NULL    |                |
| author      | varchar(20)  | YES  |     | NULL    |                |
| add_time    | datetime     | YES  |     | NULL    |                |
| description | text         | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

默认值的影响

当修改字段时,可以指定是否包含值或者是否设置默认值。
以下示例,指定字段add_time为 NOT NULL且默认值为当前时间

root@localhost[db01]>ALTER TABLE db01_tb1 MODIFY add_time timestamp NOT NULL DEFAULT NOW();
Query OK, 2 rows affected (0.07 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@localhost[db01]>select * from db01_tb1;
+----+-----------+-----------+---------------------+-------------+
| id | title     | author    | add_time            | description |
+----+-----------+-----------+---------------------+-------------+
|  1 | 红楼梦    | 曹雪芹    | 2022-09-21 21:16:20 | NULL        |
|  2 | 西游记    | 吴承恩    | 2022-09-21 21:16:20 | NULL        |
+----+-----------+-----------+---------------------+-------------+
2 rows in set (0.00 sec)

更新默认值后,之前存在的数据中,该列会自动填充默认值;

修改字段默认值

你可以使用ALTER 来修改字 段的默认值,尝试以下示例:

root@localhost[db01]>ALTER TABLE db01_tb1 ALTER author SET DEFAULT '书名';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

root@localhost[db01]>desc db01_tb1;
+-------------+--------------+------+-----+-------------------+-------------------+
| Field       | Type         | Null | Key | Default           | Extra             |
+-------------+--------------+------+-----+-------------------+-------------------+
| id          | int(11)      | NO   | PRI | NULL              | auto_increment    |
| title       | varchar(100) | NO   |     | NULL              |                   |
| author      | varchar(20)  | YES  |     | 书名              |                   |
| add_time    | timestamp    | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| description | text         | YES  |     | NULL              |                   |
+-------------+--------------+------+-----+-------------------+-------------------+
5 rows in set (0.00 sec)

你也可以使用ALTER 命令及 DROP子句来删除字段的默认值,如下示例:

root@localhost[db01]>ALTER TABLE db01_tb1 ALTER author DROP DEFAULT;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

修改表名

如果需要修改数据表的名称,可以在ALTER TABLE 语句中使用 RENAME 子句来实现。
尝试以下示例将数据表testalter_tbl 重命名为 alter_tb01:

root@localhost[db01]>ALTER TABLE db01_tb1 RENAME TO tb1;
Query OK, 0 rows affected (0.02 sec)

root@localhost[db01]>show tables;
+----------------+
| Tables_in_db01 |
+----------------+
| tb1            |
+----------------+
1 row in set (0.00 sec)

4,MySQL 查询数据

1,准备数据

[root@centos-template training]# wget -O /opt/world.sql http://219.140.166.58:17242/data/world.sql

使用以下命令将数据导入数据库:

[root@centos-template training]# mysql -uroot -padmin@123 < /opt/world.sql

2,SELECT语句

MySQL 数据库使用 SQL SELECT语句来查询数据。
以下为在MySQL数据库中查询数据通用的 SELECT 语法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

查询语句中你可以使用一个或者多个表,表之间使用逗号 (,)分割,并使用 WHERE语句来设定查询条件。
• SELECT 命令可以读取一条或者多条记录。
• 可以使用星号( (*)来代替其他字段 SELECT语句会返回表的所有字段数据
• 可以使用 WHERE 语句来包含条件。
• 可以使用 LIMIT 属性来设定返回的记录数。
• 可以通过 OFFSET指定 SELECT语句开始查询的数据偏移量。默认情况下偏移量为 0。
以下示例将通过SQL SELECT 命令来获取 country 表中的所有数据:

root@localhost[world]>select * from country;

由于该表中列太多,导致输出结果错位。可以在查询时限制列的数量,或者使用\G。示例如下:

root@localhost[world]>select * from country \G;

4.3 MySQL WHERE 子句

SELECT 语句可以用来读取数据。如果需要有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
以下是SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]]
condition2.....

查询语句中你可以使用一个或者多个表,表之间使用逗号 , 分割,并使用 WHERE语句来设定查询条件。
• 可以在 WHERE 子句中指定任何条件。
• 可以使用 AND 或者 OR 指定一个或多个条件。
• WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
• WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
以下为操作符列表,可用于WHERE 子句中。

给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。

root@localhost[world]>select * from country where Name='china';

MySQL 的 WHERE 子句的字符串比较是不区分大小写的。

BINARY 关键字

root@localhost[world]>select * from country where binary Name='china' \G
Empty set (0.00 sec)

root@localhost[world]>select * from country where binary Name='China' \G
*************************** 1. row ***************************
          Code: CHN
          Name: China
     Continent: Asia
        Region: Eastern Asia
   SurfaceArea: 9572900.00
     IndepYear: -1523
    Population: 1277558000
LifeExpectancy: 71.4
           GNP: 982268.00
        GNPOld: 917719.00
     LocalName: Zhongquo
GovernmentForm: People'sRepublic
   HeadOfState: Jiang Zemin
       Capital: 1891
         Code2: CN
1 row in set (0.00 sec)

4.4 MySQL LIKE 子句

WHERE 子句中可以使用等号 = 来设定获取数据的条件 ,若需要获取 db01_author 字段含有 “COM” 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
• SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于 UNIX或正则表达式中的星号 *。
• 如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。
以下是SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

• 你可以在 WHERE 子句中指定任何条件。
• 你可以在 WHERE 子句中使用 LIKE子句。
• 你可以使用 LIKE子句代替等号 =。
• LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
• 你可以使用 AND 或者 OR 指定一个或多个条件。
• 你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件。
以下示例将从country 表中获取 Name字段中以 chi 开头的所有记录:

root@localhost[world]>select code, name, continent, code2 from country where Name like 'chi%';
+------+-------+---------------+-------+
| code | name  | continent     | code2 |
+------+-------+---------------+-------+
| CHL  | Chile | South America | CL    |
| CHN  | China | Asia          | CN    |
+------+-------+---------------+-------+
2 rows in set (0.00 sec)

4.5 MySQL 排序

如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
以下是SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC] [ 默认 ASC]], [field2... [ASC [DESC] [ 默认 ASC]]

• 可以使用任何字段 来作为排序的条件,从而返回排序后的查询结果。
• 可以设定多个字段来排序。
• 可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,按升序排列。
• 可以添加 WHERE…LIKE 子句来设置条件。
以下示例根据District字段排序:

mysql> select from city order by District;
mysql> select from city order by Name;
mysql> select from city order by Name desc;

4.6 MySQL GROUP BY 语句

GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上可以使用 COUNT, SUM, AVG,等函数。
GROUP BY 语法

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

使用GROUP BY 语句将数据表按 District进行分组,并统计每个 District有多少条记录:

root@localhost[world]> SELECT District,count(*) FROM city GROUP BY District;

使用WITH ROLLUP 可以实现在分组统计数据基础上再进行统计。
例如将以上的数据表按District进行分组,再统计汇总:

root@localhost[world]> SELECT District,count(*) FROM city GROUP BY District with rollup;

其中记录NULL 表示分组后的结果的值的总和。
可以使用coalesce 来设置一个可以取代 NUll 的名称, coalesce 语法:

select coalesce(a,b,c);

以下示例中如果District为空则使用‘总数 ’代替:

root@localhost[world]>SELECT coalesce(District,'总数'), count(*) FROM city GROUP BY District with rollup;

4.7 MySQL 连接的使用

可以在SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。
JOIN 按照功能大致分为如下三类:
• INNER JOIN(内连接 ,或等值连接):获取两个表中字段匹配关系的记录。
• LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
• RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

INNER JOIN

MySQL的 INNER JOIN 可以省略 INNER 使用 JOIN,效果一样

root@localhost[world]>select a.name, a.countrycode, a.district,b.name,b.continent from city a INNER JOIN country b ON a.countrycode
=b.code;

以上SQL 语句等价于:

root@localhost[world]>select a.name, a.countrycode, a.district,b.name,b.continent from city a, country b WHERE a.countrycode=b.code

LEFT JOIN

MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即使右边表无对
应数据。
以下示例中 ,以 city为左表, country 为右表,理解 MySQL LEFT JOIN 的应用:

mysql> select a.name,a.countrycode,a.district,b.name,b.continent from city a LEFT JOIN country b ON a.countrycode=b.code;

RIGHT JOIN

MySQL RIGHT JOIN 会读取右边数据表的全部数据,即使左边边表无对应数据。

mysql> select a.name,a.countrycode,a.district,b.name,b.continent from city a RIGHT JOIN country b ON a.countrycode=b.code;

5 管理 MySQL 用户

5.1 用户和角色管理

创建用户和角色

在主机%.abc.com 上创建一个名为 kari 的新用户。

创建2 个名为 r_manager 和 r_staff 的新角色。

root@localhost[world]>CREATE USER kari@'%.abc.com';
Query OK, 0 rows affected (0.02 sec)

root@localhost[world]>CREATE ROLE r_manager, r_staff;
Query OK, 0 rows affected (0.01 sec)

通过查询mysql.user 表的 user、 host 和 authentication_string 列确认新用户和角色已创建。

root@localhost[world]>SELECT user, host, authentication_string FROM mysql.user \G

查看mysql.user中 r_staff账号行的全部内容。

root@localhost[world]>SELECT FROM mysql.user WHERE user='r_staff' \G

默认使用的身份认证插件为caching_sha2_password

角色管理

使用RENAME USER 语句将 r_staff 角色的名称更改为 r_check。

root@localhost[world]>RENAME USER r_staff TO r_check;
Query OK, 0 rows affected (0.01 sec)

root@localhost[world]>SELECT user, host FROM mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| r_check          | %         |
| r_manager        | %         |
| kari             | %.abc.com |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
7 rows in set (0.01 sec)

用户 密码管理

使用ALTER USER 语句将 %.abc.com 主机上 kari 用户的密码更改为 NewPass。

配置kari@‘%.abc.com’ 帐户,使密码在 30 天后过期。

设置kari@‘%.abc.com’ 帐户的密码为过期。

root@localhost[world]>ALTER USER kari@'%.abc.com' IDENTIFIED BY 'NewPass';
Query OK, 0 rows affected (0.02 sec)

root@localhost[world]>ALTER USER kari@'%.abc.com' PASSWORD EXPIRE INTERVAL 30 DAY;
Query OK, 0 rows affected (0.01 sec)

root@localhost[world]>ALTER USER kari@'%.abc.com' PASSWORD EXPIRE;
Query OK, 0 rows affected (0.00 sec)

• password_lifetime 密码过期的时间
• password_expired 默认值为 N,当值为 Y时,用户可以登录到 MySQL服务器,但是在设置新密码前不能执行任何语句。

删除用户和角色

使用DROP USER 语句删除主机 ‘%.abc.com’ 上的 kari 用户。确认该帐户不再存在。

使用DROP ROLE 语句删除 r_clerk 角色。确认该角色不再存在。

root@localhost[world]>ALTER USER kari@'%.abc.com' PASSWORD EXPIRE;
Query OK, 0 rows affected (0.00 sec)

root@localhost[world]>DROP USER  kari@'%.abc.com' ;
Query OK, 0 rows affected (0.01 sec)

root@localhost[world]>SELECT user, host FROM mysql.user WHERE user='kari';
Empty set (0.00 sec)

root@localhost[world]>DROP ROLE r_check;
Query OK, 0 rows affected (0.01 sec)

root@localhost[world]>SELECT user, host FROM mysql.user WHERE user='r_check';
Empty set (0.00 sec)

5.2 权限管理

创建用户和角色

root@localhost[world]>CREATE USER jan@localhost IDENTIFIED BY 'passwd';
Query OK, 0 rows affected (0.03 sec)

创建两个名为r_mgr 和 r_emp 的新角色。

root@localhost[world]>CREATE ROLE r_mgr, r_emp;
Query OK, 0 rows affected (0.01 sec)

用户和角色授权

将world 数据库中 city 表的 SELECT 权限授予 r_emp 角色。

将world 数据库中所有表的 INSERT、 UPDATE 和 DELETE 权限授予 r_mgr 角色。

将r_emp 角色授予 r_mgr 和 jan@localhost。

将world 数据库中 country 表的 SELECT 权限授予 jan@localhost 用户。

root@localhost[world]>GRANT SELECT ON world.city TO r_emp;
Query OK, 0 rows affected (0.01 sec)

root@localhost[world]>GRANT INSERT,UPDATE,DELETE ON world.* TO r_mgr;
Query OK, 0 rows affected (0.01 sec)

root@localhost[world]>GRANT r_emp TO r_mgr, jan@localhost;
Query OK, 0 rows affected (0.01 sec)

root@localhost[world]>GRANT SELECT ON world.country TO jan@localhost;
Query OK, 0 rows affected (0.01 sec)

验证授权

打开一个新的Linux 终端窗口并以 jan@localhost 用户身份启动另一个 mysql 客户端会话。

将默认数据库更改为world。尝试从 city表中检索五行数据,从 country表中检索五行数据。

[root@centos-template training]# mysql -ujan -ppasswd
jan@localhost[world]>select * from city limit 5;
ERROR 1142 (42000): SELECT command denied to user 'jan'@'localhost' for table 'city'
jan@localhost[world]>select * from country limit 5;
+------+-------------+---------------+---------------------------+-------------+-----------+------------+----------------+---------
+---------+-----------------------+----------------------------------------------+--------------------------+---------+-------+
| Code | Name        | Continent     | Region                    | SurfaceArea | IndepYear | Population | LifeExpectancy | GNP     
| GNPOld  | LocalName             | GovernmentForm                               | HeadOfState              | Capital | Code2 |
+------+-------------+---------------+---------------------------+-------------+-----------+------------+----------------+---------
+---------+-----------------------+----------------------------------------------+--------------------------+---------+-------+
| ABW  | Aruba       | North America | Caribbean                 |      193.00 |      NULL |     103000 |           78.4 |  828.00 
|  793.00 | Aruba                 | Nonmetropolitan Territory of The Netherlands | Beatrix                  |     129 | AW    |
| AFG  | Afghanistan | Asia          | Southern and Central Asia |   652090.00 |      1919 |   22720000 |           45.9 | 5976.00 
|    NULL | Afganistan/Afqanestan | Islamic Emirate                              | Mohammad Omar            |       1 | AF    |
| AGO  | Angola      | Africa        | Central Africa            |  1246700.00 |      1975 |   12878000 |           38.3 | 6648.00 
| 7984.00 | Angola                | Republic                                     | José Eduardo dos Santos  |      56 | AO    |
| AIA  | Anguilla    | North America | Caribbean                 |       96.00 |      NULL |       8000 |           76.1 |   63.20 
|    NULL | Anguilla              | Dependent Territory of the UK                | Elisabeth II             |      62 | AI    |
| ALB  | Albania     | Europe        | Southern Europe           |    28748.00 |      1912 |    3401200 |           71.6 | 3205.00 
| 2500.00 | Shqipëria             | Republic                                     | Rexhep Mejdani           |      34 | AL    |
+------+-------------+---------------+---------------------------+-------------+-----------+------------+----------------+---------
+---------+-----------------------+----------------------------------------------+--------------------------+---------+-------+
5 rows in set (0.01 sec)

从查询结果可以看出:用户jan对 city表没有查询权限,但是对 country表有查询权限。

查看用户角色及权限

查看在jan@localhost 会话中激活了哪些角色,并显示授予用户的所有权限。

jan@localhost[world]>select current_role();
+----------------+
| current_role() |
+----------------+
| NONE           |
+----------------+
1 row in set (0.01 sec)

jan@localhost[world]>SHOW GRANTS;
+--------------------------------------------------------+
| Grants for jan@localhost                               |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `jan`@`localhost`                |
| GRANT SELECT ON `world`.`country` TO `jan`@`localhost` |
| GRANT `r_emp`@`%` TO `jan`@`localhost`                 |
+--------------------------------------------------------+
3 rows in set (0.00 sec)

可以从SELECT CURRENT_ROLE(); 查询 结果中看到此会话未启用 任何角色。
SHOW GRANTS; 查询结果中显示用户已被授予 r_emp 角色

激活权限

激活已连接会话中授予用户jan@localhost 的所有角色,并检查已启用哪些角色。再次显示授予用户的所有权限。

jan@localhost[world]>SET ROLE ALL;
Query OK, 0 rows affected (0.00 sec)

jan@localhost[world]>select current_role();
+----------------+
| current_role() |
+----------------+
| `r_emp`@`%`    |
+----------------+
1 row in set (0.00 sec)

jan@localhost[world]>SHOW GRANTS;
+--------------------------------------------------------+
| Grants for jan@localhost                               |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `jan`@`localhost`                |
| GRANT SELECT ON `world`.`city` TO `jan`@`localhost`    |
| GRANT SELECT ON `world`.`country` TO `jan`@`localhost` |
| GRANT `r_emp`@`%` TO `jan`@`localhost`                 |
+--------------------------------------------------------+
4 rows in set (0.00 sec)

在激活所有角色后,可以看到此用户增加了employees表的查询权限。

用户在启用角色r_emp后,就有权限从 employess表中查询数据。

6 MySQL数据迁移

wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql80-community-release-el7-3.noarch.rpm
yum --enablerepo=mysql80-community install mysql-community-server
如果有以下报错
 Failing package is: mysql-community-common-8.0.30-1.el7.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
则
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

[root@centos-template training]# systemctl start mysqld.service
[root@centos-template training]# cat /var/log/mysqld.log | grep password
2022-10-09T08:14:34.694393Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ue/1/laQUpYd
[root@centos-template training]# mysql -uroot -p

mysql> show variables like 'validate_password%';
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123';
Query OK, 0 rows affected (0.02 sec)

mysql> set global validate_password.policy=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password.length=4;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'admin123';
Query OK, 0 rows affected (0.01 sec)

1.1 准备数据

这个数据库也是官方数据库的一个例子

[root@centos-template training]# wget -O /opt/test_db-master.zip http://219.140.166.58:17242/data/test_db-master.zip
[root@centos-template training]# unzip /opt/test_db-master.zip -d /opt/

导入数据

[root@centos-template training]# mysql -uroot -p < /opt/test_db-
ERROR at line 113: Failed to open file 'load_departments.dump', error: 2

如果报上面这个错,就进入到解压缩的文件夹再运行。

1.2 使用 mysqldump备份

配置系统变量

显示secure_file_priv系统变量的值。

[root@centos-template test_db-master]# mysql -uroot -padmin123 -e "SHOW VARIABLES LIKE 'secure_file%'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+

secure_file_priv 参数说明:

  • secure_file_prive=null 限制 mysqld 不允许导入导出

  • secure_file_priv=/tmp/ 限制 mysqld 的导入导出只能发生在/tmp/目录下

  • secure_file_priv=’ ’ 不对 mysqld 的导入导出做限制

配置 /etc/my.cnf 文件,将 secure_file_priv 系统变量的值更改为 /backups 目录的位置。 在[mysqld]选项组中添加 secure-file-priv=/backups

[mysqld]
secure-file-priv=/backups

创建/backups 目录并授权

[root@centos-template test_db-master]# mkdir /backups
[root@centos-template test_db-master]# chown mysql /backups/
[root@centos-template test_db-master]# ll -d /backups/
drwxr-xr-x 2 mysql root 6 Oct  9 17:10 /backups/

重启 MySQL 服务器,使配置生效,验证 secure_file_priv 的新值现在是否适用。

[root@centos-template test_db-master]# systemctl restart mysqld
[root@centos-template test_db-master]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-10-09 17:11:59 CST; 10s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 2237 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 2261 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─2261 /usr/sbin/mysqld

Oct 09 17:11:57 centos-template.example.com systemd[1]: Starting MySQL Server...
Oct 09 17:11:59 centos-template.example.com systemd[1]: Started MySQL Server.
[root@centos-template test_db-master]# mysql -uroot -padmin123 -e "SHOW VARIABLES LIKE 'secure_file%'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+-----------+
| Variable_name    | Value     |
+------------------+-----------+
| secure_file_priv | /backups/ |
+------------------+-----------+

使用 mysqldump 工具进行备份

使用 mysqldump 工具,将 employees 数据库备份到 /backups 目录。以行数据的方式进行备份,使用–tab 等同于-T,此方式会生成两类文件,一个.sql 文件,一个.txt 文件

[root@centos-template test_db-master]# mysqldump -uroot -p --tab=/backups employees
Enter password: 

查看 /backups 目录的内容。

查看 dept_manager.sql 文件的内容。

查看 /backups/dept_manager.txt 文件的内容。注意文件内容的格式。

[root@mysql01 ~]# ls /backups/ -l
[root@mysql01 ~]# cat /backups/dept_manager.sql
[root@mysql01 ~]# cat /backups/dept_manager.txt

测试恢复数据

使用 mysqladmin 工具,创建一个名为 emps2 的新数据库。

[root@centos-template test_db-master]# mysqladmin -uroot -padmin123 create emps2

使用 mysql 应用程序,将您在步骤 2 中使用 mysqldump 工具创建的 employees、departments 和 dept_manager 表的每个 *.sql 文件加载到 emps2 数据库中。

[root@centos-template backups]# mysql -uroot -padmin123 emps2 < /backups/departments.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@centos-template backups]# mysql -uroot -padmin123 emps2 < /backups/employees.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@centos-template backups]# mysql -uroot -padmin123 emps2 < /backups/dept_manager.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.

注意:您必须在导入 dept_manager 表之前导入部门和员工表,因为 dept_manager 对部门和员工表具有外 键依赖关系。

使用 mysqlimport 工具,为您在步骤 2 中创建的部门、员工和部门经理表加载每个 *.txt 文件。

[root@mysql01 ~]# mysqlimport -uroot -pAdmin@123 emps2 /backups/departments.txt
emps2.departments: Records: 10 Deleted: 0 Skipped: 0 Warnings: 0
[root@mysql01 ~]# mysqlimport -uroot -pAdmin@123 emps2 /backups/employees.txt
emps2.employees: Records: 300024 Deleted: 0 Skipped: 0 Warnings: 0
[root@mysql01 ~]# mysqlimport -uroot -pAdmin@123 emps2 /backups/dept_manager.txt
emps2.dept_manager: Records: 24 Deleted: 0 Skipped: 0 Warnings: 0

注意:在从 dept_manager 表导入行之前,必须将数据导入到部门和员工表中,这样导入过程才不会违反 dept_manager 表中的外键约束。

验证恢复的数据

使用 mysql 客户端,查看 emps2 数据库中的表。

mysql> select count(*) from emps2.departments;
+----------+
| count(*) |
+----------+
|        9 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from employees.departments;
+----------+
| count(*) |
+----------+
|        9 |
+----------+
1 row in set (0.00 sec)

1.3 使用二进制日志备份

在此章节中,将使用完整的逻辑备份和新增的二进制日志来备份 employees 数据库。然后,将数据还原到 新的服务器实例。此实验将使用两个窗口来进行练习,且将这两个窗口称为 t1 和 t2.

完整备份

在 t1 中,启动 mysql 客户端并列出 employees 数据库中 title 表的前 15 行。

mysql> use employees;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from titles kimit 15;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the 
right syntax to use near '15' at line 1
mysql> select * from titles limit 15;
+--------+--------------------+------------+------------+
| emp_no | title              | from_date  | to_date    |
+--------+--------------------+------------+------------+
|  10001 | Senior Engineer    | 1986-06-26 | 9999-01-01 |
|  10002 | Staff              | 1996-08-03 | 9999-01-01 |
|  10003 | Senior Engineer    | 1995-12-03 | 9999-01-01 |
|  10004 | Engineer           | 1986-12-01 | 1995-12-01 |
|  10004 | Senior Engineer    | 1995-12-01 | 9999-01-01 |
|  10005 | Senior Staff       | 1996-09-12 | 9999-01-01 |
|  10005 | Staff              | 1989-09-12 | 1996-09-12 |
|  10006 | Senior Engineer    | 1990-08-05 | 9999-01-01 |
|  10007 | Senior Staff       | 1996-02-11 | 9999-01-01 |
|  10007 | Staff              | 1989-02-10 | 1996-02-11 |
|  10008 | Assistant Engineer | 1998-03-11 | 2000-07-31 |
|  10009 | Assistant Engineer | 1985-02-18 | 1990-02-18 |
|  10009 | Engineer           | 1990-02-18 | 1995-02-18 |
|  10009 | Senior Engineer    | 1995-02-18 | 9999-01-01 |
|  10010 | Engineer           | 1996-11-24 | 9999-01-01 |
+--------+--------------------+------------+------------+
15 rows in set (0.00 sec)

在新的终端窗口 t2 中,使用 mysqldump 将 employees 数据库备份到/backups 目录下名为 employees_full.sql 的文件中。

[root@centos-template training]# mysqldump -uroot -padmin123 --single-transaction --master-data=2 employees > /backups//employees
_full.sql

在转储文件中找到二进制日志的位置,在 /backups/employees_full.sql 文件中找到包含 CHANGE MASTER TO 注释的行。记下该注释中的二进制日志文件和日志位置。

[root@centos-template training]# cat /backups/employees_full.sql | grep 'CHANGE MASTER TO'
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000005', MASTER_LOG_POS=8253237;

修改数据

切换到登录 MySQL 服务器的 t1 窗口,在 UPDATE 语句中使用 REPLACE 函数将 titles 表中的“Assistant” 更改为缩写“Asst”。

mysql> UPDATE titles SET title = REPLACE(title,'Assisant','Asst');
Query OK, 0 rows affected (2.32 sec)
Rows matched: 443308  Changed: 0  Warnings: 0

切换回包含 Linux 终端提示的 t2 窗口,并确定哪些二进制日志文件包含完整备份中记录的日志位置之后 的所有事件。将这些二进制日志文件从数据目录复制到 /backups 目录。

[root@centos-template training]# ls -l /var/lib/mysql/binlog*
-rw-r----- 1 mysql mysql     5338 Oct  9 16:44 /var/lib/mysql/binlog.000001
-rw-r----- 1 mysql mysql     4706 Oct  9 16:54 /var/lib/mysql/binlog.000002
-rw-r----- 1 mysql mysql     4706 Oct  9 16:57 /var/lib/mysql/binlog.000003
-rw-r----- 1 mysql mysql 66378619 Oct  9 17:11 /var/lib/mysql/binlog.000004
-rw-r----- 1 mysql mysql  8253237 Oct  9 21:45 /var/lib/mysql/binlog.000005
-rw-r----- 1 mysql mysql       80 Oct  9 17:11 /var/lib/mysql/binlog.index
[root@centos-template training]# cp /var/lib/mysql/binlog.000005 /backups/

注意:前面的输出显示了 5个 binlog 文件和一个索引文件。在 /backups/employees_full.sql 文件中记录的 文件为’binlog.00005’。那么在此次实验中只需复制 binlog.00005 文件即可。
通过在 mysql 终端窗口中执行 FLUSH BINARY LOGS 语句来刷新二进制日志。
在 UPDATE 语句中使用 REPLACE 函数将单词“Senior”更改为 title 表中的缩写“Snr”。
退出 mysql 客户端。

mysql> flush binary logs;
Query OK, 0 rows affected (0.01 sec)

mysql> UPDATE titles SET title = REPLACE(title,'Sensior','Snr');
Query OK, 0 rows affected (2.02 sec)
Rows matched: 443308  Changed: 0  Warnings: 0

mysql> exit
Bye

将包含步骤 3 中记录的日志位置之后的所有事件的二进制日志文件从数据目录到 /backups 目录。
使用 systemctl 停止 MySQL 服务器进程。

[root@centos-template training]# ls -l /var/lib/mysql/binlog*
-rw-r----- 1 mysql mysql     5338 Oct  9 16:44 /var/lib/mysql/binlog.000001
-rw-r----- 1 mysql mysql     4706 Oct  9 16:54 /var/lib/mysql/binlog.000002
-rw-r----- 1 mysql mysql     4706 Oct  9 16:57 /var/lib/mysql/binlog.000003
-rw-r----- 1 mysql mysql 66378619 Oct  9 17:11 /var/lib/mysql/binlog.000004
-rw-r----- 1 mysql mysql  8253281 Oct  9 22:03 /var/lib/mysql/binlog.000005
-rw-r----- 1 mysql mysql      157 Oct  9 22:03 /var/lib/mysql/binlog.000006
-rw-r----- 1 mysql mysql       96 Oct  9 22:03 /var/lib/mysql/binlog.index
[root@centos-template training]# cp /var/lib/mysql/binlog.000005 /var/lib/mysql/binlog.000006  /backups/
cp: overwrite ‘/backups/binlog.000005’? 
[root@centos-template training]# systemctl stop mysqld

创建新的数据库实例

创建一个新的 MySQL 实例,用来恢复修改后的 employees 数据库
创建 /datadir 目录并将所有权授予 mysql 用户

[root@centos-template training]# mkdir /datadir
[root@centos-template training]# chown mysql:mysql /datadir

使用 mysqld --initialize-insecure 命令设置一个新实例,使用/datadir 目录作为临时数据目录,并且没有 root 密码。
按 Enter 键返回 Linux 命令提示符。
将新实例作为后台进程启动。

[root@centos-template training]# mysqld --datadir=/datadir --initialize-insecure --user=root
[1]+  Exit 1                  mysqld --datadir=/datadir

[root@centos-template training]# mysqld --datadir=/datadir --user=root &

登录新的数据库,登录时不需要密码。

恢复数据

创建一个名为 employees 的新数据库,并切换到该数据库。
恢复之前步骤中创建的完整备份。

mysql> CREATE DATABASE employees; 
Query OK, 1 row affected (0.00 sec) 
mysql> USE employees 
Database changed

mysql> SOURCE /backups/employees_full.sql

在 t2 中,使用 mysqlbinlog 程序从二进制日志中恢复完全备份后发生的改动。

[root@centos-template training]# mysqlbinlog --start-position=8253237 /backups/binlog.000005 /backups/binlog.000006 | mysql -uroot

注意:这里的–start-position=的值要更换为之前步骤中查看到的值。binlog 文件名为复制到/backups 目录中 的文件。

验证数据

在 t1 中,验证 employees 数据库是否包含来自完整数据库备份的数据以及所有后续记录的更改。

mysql> select * from titles limit 15;

通过输出可以看到 title 列中修改后的 Snr 和 Asst 均在表中,表明完整备份和二进制日志中的所有更改都在 新数据库中
这个二进制一整套下来,我没有实验成功。

你可能感兴趣的:(云运维,mysql,linux,数据库)