马哥教育Linux-第06周作业

学号:N74058
1. 完成将server和client端的mysql配置默认字符集为utf8mb4;

[root@localhost ~]# yum -y install mariadb-server mariadb-client > /dev/null 
[root@localhost ~]# systemctl start mariadb && systemctl enable mariadb
[root@localhost ~]# mysql -uroot
MariaDB [(none)]> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
MariaDB [(none)]> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit

[root@localhost ~]# mysql -uroot -p123456
MariaDB [(none)]> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
MariaDB [(none)]> set global character_set_server=utf8mb4;
MariaDB [(none)]> set global character_set_client=utf8mb4;
MariaDB [(none)]> set global character_set_connection=utf8mb4;
MariaDB [(none)]> exit

[root@localhost ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

symbolic-links=0

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

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

!includedir /etc/my.cnf.d

[root@localhost ~]# systemctl restart mariadb
[root@localhost ~]# mysql -uroot -p123456
MariaDB [(none)]> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
MariaDB [(none)]> exit
Bye

2. 掌握如何获取SQL命令的帮助,基于帮助完成添加testdb库,字符集utf8, 排序集合utf8_bin

在CentOS 7.9中,我们可以使用以下命令获取SQL命令的帮助信息:man mysql
该命令可以打开MySQL的帮助文档。在文档中,我们可以找到各种MySQL命令和语句的详细信息,包括它们的语法、用法和选项等。
接下来,我们可以使用以下SQL命令添加testdb数据库并设置字符集和排序集合:
CREATE DATABASE testdb CHARACTER SET utf8 COLLATE utf8_bin;
此命令将创建一个名为“testdb”的新数据库,并将其字符集设置为UTF-8,排序集合设置为UTF-8_BIN。
请注意,如果您没有足够的权限来创建新数据库,请使用具有相应权限的MySQL用户执行此命令。

3.总结mysql常见的数据类型。

MySQL支持多种数据类型,包括:
1. 数值数据类型:
   - INTEGER:整数类型,支持有符号和无符号两种。
   - FLOAT:单精度浮点数。
   - DOUBLE:双精度浮点数。
   - DECIMAL:任意精度小数。
2. 日期/时间数据类型:
   - DATE:日期类型,格式为'YYYY-MM-DD'。
   - TIME:时间类型,格式为'HH:MM:SS'。
   - DATETIME:日期时间类型,格式为'YYYY-MM-DD HH:MM:SS'。
   - TIMESTAMP:时间戳类型,用于记录数据修改的时间信息,格式为'YYYY-MM-DD HH:MM:SS'。
3. 字符串类型:
   - CHAR:定长字符串类型。
   - VARCHAR:变长字符串类型,最大长度为65535个字符。
   - TEXT:长文本字符串类型,最大长度为65535个字符。
   - BLOB:二进制大对象类型,用于存储大量的二进制数据。
4. 枚举类型:
   - ENUM:枚举类型,用于从预定义的选项列表中选择一个值。

4. 创建一个主机表host,放在testdb中,要求字段 1) 主键自增id 无符号, tinyint. 2) hostname可变字符长度256,可为空。。3)ip 可变字符长度256,可为空。4)账号,可变字符长度256,可为空。5)密码,可变字符长度256,可为空。6)创建时间,时间类型,非空。7)更新时间,时间类型,默认当前时间。8)区域,只能在华南,华北,华东,三个区域之一。9)端口,无符号整数,可为空。10)外网地址,可变字符长度256,可为空。11)内网地址,可变字符长度256,可为空。

在testdb数据库中创建主机表host,符合要求的SQL语句如下:
CREATE TABLE host (
  id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  hostname VARCHAR(256) DEFAULT NULL,
  ip VARCHAR(256) DEFAULT NULL,
  account VARCHAR(256) DEFAULT NULL,
  password VARCHAR(256) DEFAULT NULL,
  create_time TIMESTAMP NOT NULL,
  update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  region ENUM('华南', '华北', '华东'),
  port SMALLINT UNSIGNED DEFAULT NULL,
  public_ip VARCHAR(256) DEFAULT NULL,
  private_ip VARCHAR(256) DEFAULT NULL
);

解释一下各个字段的类型和约束:
- `id`:TINYINT类型,UNSIGNED无符号,作为主键,并设为自动增长。
- `hostname`:VARCHAR(256)类型,可为空。
- `ip`:VARCHAR(256)类型,可为空。
- `account`:VARCHAR(256)类型,可为空。
- `password`:VARCHAR(256)类型,可为空。
- `create_time`:TIMESTAMP类型,设定为NOT NULL非空。
- `update_time`:TIMESTAMP类型,设定为DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,即默认为当前时间,且在更新时自动更新为当前时间。
- `region`:ENUM类型,限制只能取值'华南'、'华北'、'华东'三者之一。
- `port`:SMALLINT UNSIGNED类型,可为空。
- `public_ip`:VARCHAR(256)类型,可为空。
- `private_ip`:VARCHAR(256)类型,可为空。

5. 给testdb.host表中添加多条数据。

可以使用以下SQL语句向testdb数据库中的host表中添加多条数据:
INSERT INTO testdb.host (ip_address,hostname) VALUES 
('192.168.1.100','host1'),
('192.168.1.101','host2'),
('192.168.1.102','host3'),
('192.168.1.103','host4');
这个例子中,我们向testdb数据库中的host表中添加了4条数据,分别是IP地址为192.168.1.100,主机名为host1;IP地址为192.168.1.101,主机名为host2;IP地址为192.168.1.102,主机名为host3;IP地址为192.168.1.103,主机名为host4。

6. 根据表扩展出几个语句,完成总结DDL, DML的用法,并配上示例。

DDL是指数据定义语言,用于定义数据库对象,例如表、列、索引等。常见的DDL语句有CREATE、ALTER、DROP等。
CREATE语句用于创建数据库对象,例如创建表:
CREATE TABLE name (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT,
  salary FLOAT
);

ALTER语句用于修改数据库对象,例如添加列、修改列数据类型等:
ALTER TABLE name ADD COLUMN department VARCHAR(50);
DROP语句用于删除数据库对象,例如删除表:
DROP TABLE name;
DML是指数据操作语言,用于对表中数据进行增、删、改、查操作。常见的DML语句有SELECT、INSERT、UPDATE、DELETE等。

SELECT语句用于查询表中的数据:
SELECT * FROM name;

INSERT语句用于向表中插入数据:
INSERT INTO name (id, name, age, salary, department) VALUES (1, 'cuixuanguo', 25, 5000, 'HR');

UPDATE语句用于修改表中的数据:
UPDATE name SET salary = 6000 WHERE name = 'cuixuanguo';

DELETE语句用于删除表中的数据:
DELETE FROM name WHERE name = 'cuixuanguo';

7. 导入hellodb库,总结DQL, alias, where子句,gruop by, order by, limit, having使用示例。

[root@localhost ~]# mysql -uroot -p123456
MariaDB [(none)]> source /root/hellodb_innodb.sql

假设有一个包含学生信息的表格(students),其中包括学生的ID、姓名、性别、出生日期和学科等级。现在我们想要查询该表格中每个学科的平均分数,并按平均分数从高到低进行排序。我们还希望仅返回平均分数高于80分的学科。
下面是一个实现该功能的SQL查询语句:
SELECT AVG(score) as avg_score, subject
FROM students
GROUP BY subject
HAVING avg_score > 80
ORDER BY avg_score DESC
LIMIT 10;

该查询语句的作用是:
SELECT AVG(score) as avg_score, subject:选择学科和该学科的平均分数,并将平均分数用别名 avg_score 进行重命名。
FROM students:指定要从哪个表格中检索数据。
GROUP BY subject:按照学科对数据进行分组,这样我们就可以计算每个学科的平均分数。
HAVING avg_score > 80:限制只返回平均分数大于80分的学科。
ORDER BY avg_score DESC:按照平均分数从高到低排序。
LIMIT 10:限制只返回前10条结果。
这就是一个基本的SQL查询语句示例,包括了DQL、alias、where子句、group by、order by、limit和having的使用。

8. 基于hellodb 库, 总结子查询,关联查询 ,交叉连接,内连接,左连接,右连接,完全连接,自连接。

这是一个MySQL转储文件,其中包含重新创建数据库及其表以及向其中插入数据所需的SQL语句。
该数据库名为hellodb,包含四个表:classes、coc、courses和scores。classes表中有ClassID、Class和NumOfStu列。coc表有ID、ClassID和CourseID列。courses表中有CourseID和Course两列。表中有ID、StuID、CourseID和Score列。

9. 总结select语句处理顺序。

在 MySQL 中,SELECT 语句的处理顺序如下:
1、FROM 子句:确定要查询的数据表。
2、JOIN 子句:如果查询涉及到多个表,则将它们连接起来,形成虚拟表格。
3、WHERE 子句:对每行记录进行条件过滤,只保留满足条件的记录。
4、GROUP BY 子句:根据指定的列对记录进行分组。
5、HAVING 子句:对分组后的数据进行条件过滤,只保留满足条件的组。
6、SELECT 子句:选择要查询的列,进行计算和聚合操作。
7、DISTINCT 子句:去除重复的记录。
8、ORDER BY 子句:按指定的列对记录进行排序。
9、LIMIT 子句:限制查询结果的数量。
注意,这只是一个大致的处理顺序,实际上在查询执行过程中,MySQL 会对查询语句进行优化和重写,以提高查询效率和减少资源消耗。因此,实际执行顺序可能会有所不同,具体取决于 MySQL 查询优化器的算法和实现细节。

10. 总结mysql事件管理,用户管理,权限管理。

事件管理
MySQL的事件管理允许用户在特定的时间点或时间间隔执行特定的任务,例如备份、数据清理等。用户可以使用事件调度器来创建、修改和删除事件。MySQL事件管理中包括以下重要的概念和语句:
事件调度器:用于管理事件的工具。
创建事件:使用CREATE EVENT语句创建事件。
修改事件:使用ALTER EVENT语句修改事件。
删除事件:使用DROP EVENT语句删除事件。
事件定时器:用于指定事件执行的时间和频率。
事件状态:用于确定事件是否正在运行或已停止。

用户管理
MySQL的用户管理允许用户创建、修改和删除数据库用户,授权和撤销用户权限等。用户管理功能在保护数据安全方面非常重要。MySQL用户管理中包括以下重要的概念和语句:
用户账户:用于访问MySQL服务器的账户。
创建用户:使用CREATE USER语句创建用户。
修改用户:使用ALTER USER语句修改用户。
删除用户:使用DROP USER语句删除用户。
用户权限:用于控制用户访问和操作数据库的权限。
授权:使用GRANT语句向用户授权。
撤销权限:使用REVOKE语句撤销用户的权限。

权限管理
MySQL的权限管理允许管理员授予用户访问和操作数据库的权限,这对于保护数据的安全非常重要。MySQL权限管理中包括以下重要的概念和语句:
权限:用于控制用户访问和操作数据库的权限。
授权:使用GRANT语句向用户授权。
撤销权限:使用REVOKE语句撤销用户的权限。
角色:用于组织和管理权限的集合。
创建角色:使用CREATE ROLE语句创建角色。
授权角色:使用GRANT语句向角色授权。
撤销角色权限:使用REVOKE语句撤销角色的权限。

11. 基于apache, php, mysql搭建wordpress站点。

[root@localhost ~]# yum install httpd -y >> /dev/null
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd
[root@localhost ~]# yum install mariadb-server mariadb -y >> /dev/null
[root@localhost ~]# systemctl start mariadb && systemctl enable mariadb
[root@localhost ~]# yum install php php-mysql php-gd php-xml php-mbstring -y >> /dev/null
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE wordpress;
MariaDB [(none)]> CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;
[root@localhost ~]# cd /tmp
[root@localhost tmp]# curl -O https://wordpress.org/latest.tar.gz
[root@localhost tmp]# tar xzvf latest.tar.gz
[root@localhost tmp]# cp -a wordpress/. /var/www/html/
[root@localhost tmp]# chown -R apache:apache /var/www/html/
[root@localhost tmp]# cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php
[root@localhost tmp]# vim /var/www/html/wp-config.php
[root@localhost ~]# cat /var/www/html/wp-config.php | grep define
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wordpressuser' );
define( 'DB_PASSWORD', 'password' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8' );
define( 'DB_COLLATE', '' );
define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );
define( 'WP_DEBUG', false );
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', __DIR__ . '/' );
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
# 找到以下内容并将 AllowOverride 设置为 All:
<Directory "/var/www/html">
         AllowOverride All
</Directory>
[root@localhost ~]# systemctl restart httpd
# WordPress,在浏览器中输入服务器的 IP 地址或域名,并进入 WordPress 安装页面。按照提示进行安装,输入相关的站点信息和管理员账号信息,即可完成 WordPress 站点

12. 总结mysql架构原理

连接层(Connection Layer):负责连接管理、授权和安全等方面的任务,为后续处理层提供了统一的接口。
查询缓存层(Query Cache Layer):对于一些相对简单的查询,MySQL会将其结果缓存到内存中,以提高查询效率。
查询解析层(Parsing Layer):对于SQL语句进行解析,确定语法正确性并进行语义分析。对于复杂的SQL语句,MySQL会将其转化成一个内部的语法树(AST)。
优化器层(Optimization Layer):对于解析的SQL语句,MySQL会根据查询的复杂度、表的大小等因素进行查询优化,以得到更高效的查询方案。
执行引擎层(Execution Engine Layer):根据优化器得到的执行方案,执行SQL语句并返回结果。MySQL提供了多种执行引擎,如MyISAM、InnoDB等。
存储层(Storage Layer):MySQL将数据存储在硬盘上,存储层主要负责数据的读写、存储和管理等任务。

13. 总结myisam和Innodb存储引擎的区别。

MyISAM和InnoDB是MySQL两种常用的存储引擎,它们之间有以下几个区别:
锁机制不同:MyISAM采用的是表级锁,即在执行操作时锁定整张表,而InnoDB则采用行级锁,即只锁定需要操作的行,其他行不受影响。
事务支持不同:MyISAM不支持事务,而InnoDB支持事务处理,并且支持ACID属性(原子性、一致性、隔离性、持久性)。
外键约束不同:MyISAM不支持外键约束,而InnoDB支持外键约束,保证了数据的一致性和完整性。
索引结构不同:MyISAM采用的是B-tree索引结构,而InnoDB则采用的是B+tree索引结构,B+tree索引结构更适合于范围查询和排序操作,能够提高查询效率。
数据缓存不同:MyISAM只支持表级缓存,而InnoDB支持表级和页级缓存,能够更好地减少I/O操作,提高查询效率。
总体来说,如果应用场景需要大量的查询操作,MyISAM的查询效率要高于InnoDB,但是如果应用场景需要事务处理、外键约束等高级功能,则需要使用InnoDB。需要根据实际需求选择不同的存储引擎。

14. 总结mysql索引作用,同时总结哪些查询不会使用到索引。

MySQL索引的作用主要有以下几点:
加速查询速度:通过使用索引,数据库可以更快地找到符合查询条件的数据。
优化排序和分组操作:如果查询包含排序或分组操作,索引可以提高查询效率。
提高数据检索效率:通过使用索引,可以快速地定位符合查询条件的数据。
唯一约束:索引可以强制数据表中的数据唯一,避免出现重复数据。
主键约束:索引可以将数据表中的某个字段设置为主键,以便更快地检索和更新数据。

哪些查询不会使用到索引:
使用函数或运算符的查询:如果查询中使用了函数或运算符,则不会使用索引。
对于较小的表,MySQL可能会选择不使用索引,而直接全表扫描。
使用OR操作符连接多个条件的查询,只有其中一个条件有索引,也无法使用索引。
对于某些数据类型(如BLOB和TEXT类型),MySQL无法使用索引。
如果查询中使用了LIKE操作符,而没有使用通配符的查询,则可以使用索引,但是如果使用了前置通配符,索引就无法使用。

15. 总结事务ACID事务特性

ACID是指事务的四个特性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这些特性确保了事务的可靠性和一致性。

原子性(Atomicity):指一个事务中的所有操作,要么全部完成,要么全部不完成。在事务执行过程中,如果出现了任何错误,事务会被回滚到原来的状态,也就是说,它们会像一个原子一样被看待,是一个不可分割的整体。
一致性(Consistency):指事务必须使数据库从一个一致性状态转移到另一个一致性状态。在事务执行过程中,如果出现任何错误,事务会被回滚到原来的状态,保证了数据的一致性。
隔离性(Isolation):指数据库系统中的一个事务不能被其他事务干扰。也就是说,在并发环境下,一个事务的执行不会受到其他事务的影响。
持久性(Durability):指事务处理结束后,对数据的修改是永久性的,即使出现系统故障也不会丢失。

16. 总结事务日志工作原理。

MySQL使用事务日志(Transaction Log,也称为Redo Log)来实现事务的持久性和恢复性。在事务提交之前,MySQL将所有对数据库的修改操作记录到事务日志中,以保证这些修改即使在发生故障时也能被恢复。
事务日志是一种顺序写入的二进制日志文件,它包含了所有已提交的事务的所有修改操作。在数据库崩溃时,MySQL可以使用事务日志来恢复已提交的事务,并撤销未提交的事务。
事务日志的工作原理如下:
在每个事务开始时,MySQL会为这个事务分配一个唯一的事务ID。
在事务执行过程中,MySQL将对数据库的所有修改操作记录到事务日志中。每次修改操作都会被写入事务日志的缓冲区中。
在事务提交之前,MySQL会将所有在事务日志缓冲区中的修改操作写入磁盘中的事务日志文件中。这些操作被写入磁盘时,是按照它们在事务中执行的顺序进行写入的。
一旦事务提交,MySQL会将这个事务的提交信息记录到事务日志中。这个提交信息包含了事务ID、事务提交时间等信息。
MySQL会将提交信息写入磁盘中的事务日志文件中,并将事务日志缓冲区中的内容写入磁盘。
在数据库崩溃或重新启动时,MySQL会根据事务日志文件中的信息来恢复已提交的事务,并撤销未提交的事务。MySQL会从事务日志文件中读取最后一个提交信息,并根据这个信息来确定需要恢复的事务。

17. 总结mysql日志类型,并说明如何启动日志。

MySQL有多种日志类型,每种类型都有其特定的用途和功能。以下是MySQL中常见的日志类型:
错误日志(Error Log):记录MySQL服务器在运行过程中遇到的错误和异常情况。
查询日志(Query Log):记录所有的查询语句,以便在需要时进行审计和性能分析。
慢查询日志(Slow Query Log):记录所有执行时间超过阈值的查询语句,以便在优化性能时进行分析。
二进制日志(Binary Log):记录所有对数据库进行的修改操作,以便在主从复制、数据库恢复和数据备份等方面使用。
事务日志(Transaction Log):记录所有已提交的事务的修改操作,以保证这些修改即使在发生故障时也能被恢复。
要启用MySQL的日志,可以在MySQL的配置文件中设置相应的参数。以下是一些常见的设置:
错误日志:可以通过设置log_error参数来启用错误日志。
查询日志:可以通过设置general_log和general_log_file参数来启用查询日志。需要注意的是,启用查询日志会对MySQL的性能产生一定的影响。
慢查询日志:可以通过设置slow_query_log和slow_query_log_file参数来启用慢查询日志。需要注意的是,启用慢查询日志会对MySQL的性能产生一定的影响。
二进制日志:可以通过设置log_bin和binlog_format参数来启用二进制日志。需要注意的是,启用二进制日志会对MySQL的性能产生一定的影响。
事务日志:事务日志在MySQL中是自动启用的,无需进行任何设置。

18. 总结二进制日志的不同格式的使用场景。

MySQL二进制日志(Binary Log)是MySQL数据库的一种日志记录格式,记录了数据库的所有更改。MySQL支持多种不同的二进制日志格式,每种格式都具有自己的使用场景。
以下是不同格式的使用场景:
1. Statement格式——适用于简单的语句
Statement格式会记录所有会更改数据的SQL语句,然后在日志文件中按照语句的顺序记录下来。这种格式比较简单,在适用的场景下可以提供很好的性能。但是,由于它记录的是SQL语句本身,当使用一些不确定的函数或者存储过程或者触发器,Statement格式可能会导致数据不一致的情况。
2. Row格式——适用于涉及大量行更改的情况
Row格式会记录每行数据的变化,对于涉及大量行更改的情况,这种格式比Statement格式更加高效,并且可以保证数据的一致性。但是,由于它记录的是每一行的变化,因此会导致日志文件变得更大,并且在处理过程中需要更多的CPU和内存资源。
3. Mixed格式——结合了前两种格式的优点
Mixed格式会根据具体情况来决定使用哪种格式。这种格式结合了Statement格式和Row格式的优点,最常规的情况下使用Statement格式,但是对于一些可能导致数据不一致的情况,会自动切换到Row格式以保证数据的一致性。

19. 总结mysql备份类型,并基于mysqldump, xtrabackup完成数据库备份与恢复验证。

MySQL备份类型:
1. 逻辑备份:逻辑备份是指备份数据库的逻辑结构,以SQL语句的形式来备份数据。主要有两种逻辑备份方式:mysqldump和mysqlhotcopy。
2. 物理备份:物理备份是指备份数据库的物理结构,以二进制的形式来备份数据。主要有两种物理备份方式:拷贝数据文件备份和基于InnoDB存储引擎备份的物理备份,如xtrabackup。
基于mysqldump完成备份与恢复验证:
1. 备份数据库:
mysqldump -u root -p mydatabase > mydatabase.sql

2. 恢复数据库:
mysql -u root -p mydatabase < mydatabase.sql

基于xtrabackup完成备份与恢复验证:
1. 备份数据库:
innobackupex --user=root --password=123456 --slave-info /data/backups

2. 恢复数据库:
innobackupex --copy-back /data/backups/2019-11-16_10-00-02/

以上命令中,`--user`指定数据库用户名,`--password`指定数据库密码,`mydatabase`为要备份的数据库名称,`/data/backups`为备份目录,`2019-11-16_10-00-02`为备份目录下生成的备份文件夹名。

20. 编写crontab,每天按表备份所有mysql数据。将备份数据放在以天为时间的目录下。

以下是每天按表备份所有MySQL数据并将备份数据放在以天为时间的目录下的crontab编写步骤:
1. 在终端中使用以下命令打开定时任务配置:
crontab -e

2. 在打开的文件中添加以下内容:
0 0 * * * mkdir -p /backup/mysql/$(date '+\%Y-\%m-\%d') && mysqldump -u [username] -p[password] --all-databases --tables --single-transaction > /backup/mysql/$(date '+\%Y-\%m-\%d')/backup.sql

这个命令将备份所有MySQL数据,然后将备份文件存储在以当天日期命名的目录中。
注意:需要将 [username] 和 [password] 替换为实际的MySQL用户名和密码。
3. 保存并关闭文件,完成crontab的编写。
此时每天凌晨0点会在 /backup/mysql/ 目录下新建一个以当前日期为名称的目录,并将当天备份的MySQL数据保存在该目录下的 backup.sql 文件中。

21. 编写crontab, 基于xtrabackup,每周1,周5进行完全备份,周2到周4进行增量备份。

以下是基于xtrabackup实现每周1、周5进行完全备份,周2到周4进行增量备份的crontab编写步骤:
1. 在终端中使用以下命令打开定时任务配置:
crontab -e

2. 在打开的文件中添加以下内容:
# 每周一,周五凌晨1点进行完全备份
0 1 * * 1,5 xtrabackup --backup --user=[username] --password=[password] --target-dir=/backup/full-backup-$(date '+\%Y-\%m-\%d')

# 每周二到周四凌晨1点进行增量备份
0 1 * * 2-4 xtrabackup --backup --user=[username] --password=[password] --target-dir=/backup/incremental-backup-$(date '+\%Y-\%m-\%d') --incremental-basedir=/backup/full-backup-$(date '+\%Y-\%m-\%d' -d "last Friday")

这个命令将在周一、周五凌晨1点进行完全备份,将备份文件存储在以当天日期命名的 full-backup-xxxx-xx-xx 目录中。在周二到周四凌晨1点进行增量备份,将备份文件存储在以当天日期命名的 incremental-backup-xxxx-xx-xx 目录中。增量备份将以周五的完全备份文件为基础进行备份。
注意:需要将 [username] 和 [password] 替换为实际的MySQL用户名和密码。
3. 保存并关闭文件,完成crontab的编写。
完成以上步骤后,每周一、周五凌晨1点将进行完全备份,周二到周四凌晨1点将进行增量备份。备份文件将保存在对应的以日期命名的目录中。

22. 总结mysql主从复制原理。

MySQL的事务日志(Transaction Log,又称为redo log)是用于实现事务的ACID特性的关键组成部分。事务日志记录了所有数据更新操作的详细信息,这些操作包括插入、修改和删除。

事务日志工作原理如下:
日志写入:当一个事务开始时,MySQL会在内存中创建一个新的事务日志缓冲区。每当一个数据更新操作被执行时,MySQL将其记录到事务日志缓冲区中,同时也会将其应用到内存中的数据页。
提交事务:当事务提交时,MySQL会将该事务日志缓冲区中的所有更新操作写入磁盘上的事务日志文件中,同时也会将其标记为已提交。这样即使在写入磁盘之前系统崩溃,也可以通过事务日志恢复数据。
恢复:如果MySQL在写入磁盘之前崩溃了,当MySQL重启后会检查事务日志文件,找到最后一个已提交的事务,并将其应用到内存中的数据页中。这样可以确保数据的完整性和一致性。
需要注意的是,MySQL的事务日志是基于磁盘顺序写入的,这样可以保证写入性能。同时,MySQL也支持将事务日志写入多个物理设备中,以提高事务日志的可靠性和容错性。

23. 实现mysql主从复制,主主复制,半同步复制,过滤复制,

实现MySQL主从复制、主主复制、半同步复制和过滤复制的步骤:

主从复制
在主服务器上,修改MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld]
log-bin=mysql-bin  # 开启二进制日志
server-id=1        # 主服务器的唯一标识符

重启MySQL服务使配置生效:systemctl restart mysqld
在从服务器上,修改MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld]
server-id=2        # 从服务器的唯一标识符

重启MySQL服务使配置生效:systemctl restart mysqld
在主服务器上创建用于从服务器复制的账户,并授予复制权限:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

在主服务器上执行以下命令获取主服务器当前的二进制日志文件名和偏移量:
SHOW MASTER STATUS;

在从服务器上执行以下命令连接主服务器并开始复制:
CHANGE MASTER TO
  MASTER_HOST='master_host_name_or_ip',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='the_log_file_name_from_the_master',
  MASTER_LOG_POS=the_position_from_the_master;
START SLAVE;

主主复制
在服务器1上,修改MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld]
log-bin=mysql-bin
server-id=1
log-slave-updates
auto-increment-increment=2
auto-increment-offset=1

重启MySQL服务使配置生效:systemctl restart mysqld
在服务器2上,修改MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld]
log-bin=mysql-bin
server-id=2
log-slave-updates
auto-increment-increment=2
auto-increment-offset=2

重启MySQL服务使配置生效:systemctl restart mysqld
在服务器1上创建用于服务器2复制的账户,并授予复制权限:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

在服务器2上创建用于服务器1复制的账户,并授予复制权限:
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

在服务器1上执行以下命令获取主服务器当前的二进制日志文件名和偏移量:
SHOW MASTER STATUS;

在服务器2上执行以下命令连接服务器1并开始复制:
CHANGE MASTER TO
  MASTER_HOST='server1_host_name_or_ip',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='the_log_file_name_from_the_master',
  MASTER_LOG_POS=the_position_from_the_master;
START

24. 总结GTID复制原理,并完成GTID复制集群。

GTID(Global Transaction Identifier)是MySQL 5.6引入的一个特性,用于解决主从复制中的一些问题。GTID通过给每个事务分配一个唯一的全局事务ID来跟踪主从复制中的所有事务,而不是像传统的基于二进制日志的复制那样,使用文件名和偏移量来跟踪。
GTID复制的优点是:
自动检测和跳过重复的事务,即使日志被清理或旧的备份被恢复,也能保证数据的一致性。
允许进行基于GTID的故障转移和自动故障恢复,以及更灵活的主从切换。
GTID复制的原理:
在主服务器上,每个事务都会被分配一个唯一的全局事务ID(GTID)。
主服务器将每个事务的GTID写入二进制日志中,同时将日志发送给从服务器。
从服务器维护自己的GTID集,通过与主服务器通信,从主服务器获取缺少的事务,并在本地执行这些事务。
如果从服务器在执行事务时遇到错误,它会停止复制并等待管理员的干预。

GTID复制集群的实现步骤:
配置主服务器
修改MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld]
log-bin=mysql-bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=true
binlog_format=ROW

重启MySQL服务使配置生效:systemctl restart mysqld
配置第一个从服务器
修改MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld]
server-id=2
gtid_mode=ON
enforce_gtid_consistency=true

重启MySQL服务使配置生效:systemctl restart mysqld
在从服务器上执行以下命令连接主服务器并开始复制:
CHANGE MASTER TO
  MASTER_HOST='master_host_name_or_ip',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_AUTO_POSITION=1;
START SLAVE;

配置第二个从服务器
修改MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld]
server-id=3
gtid_mode=ON
enforce_gtid_consistency=true

重启MySQL服务使配置生效:systemctl restart mysqld
在从服务器上执行以下命令连接主服务器并开始复制:
CHANGE MASTER TO
  MASTER_HOST='master_host_name_or_ip',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_AUTO_POSITION=1;
START SLAVE;

配置第三个从服务器
修改MySQL配置文件/etc/my.cnf,添加以下配置:
[mysqld]
server-id=4
gtid_mode=ON
enforce_gtid_consistency=true
``

25. 总结主从复制不一致的原因,如何解决不一致,如何避免不一致

主从复制不一致是指在主数据库和从数据库之间存在数据差异的情况。主从复制不一致的原因可以是多方面的,包括:
主服务器上的数据被错误地修改或删除。
网络问题导致复制数据包丢失或延迟,从服务器没有及时复制主服务器上的数据。
从服务器上的数据被错误地修改或删除。
主服务器和从服务器的硬件、软件或操作系统配置不一致。

解决主从复制不一致的方法可以根据具体情况而定,以下是一些可能的解决方法:
恢复主数据库上的数据到一个已知的一致状态,然后重新启动从数据库并进行复制。
使用备份来还原从数据库的状态。
停止从服务器的复制进程,手动将差异数据同步到从服务器,然后重新启动复制进程。
定位并解决网络问题,例如增加带宽、优化网络拓扑结构等。

为了避免主从复制不一致的情况发生,可以采取以下措施:
使用GTID复制,确保所有的事务都能被正确地复制到从服务器。
监控主从复制状态,及时发现和解决复制问题。
定期检查主从服务器之间的数据差异,及时发现和解决数据同步问题。
避免在从服务器上执行写操作,防止误操作导致数据不一致。
对主服务器进行备份和恢复操作时,需要注意备份和恢复的完整性和一致性。

26. 总结数据库水平拆分和垂直拆分

数据库拆分是指将一个大型数据库拆分成多个小型数据库,以实现横向或纵向的扩展。数据库拆分通常可以分为水平拆分和垂直拆分两种方式。
水平拆分(Sharding):水平拆分是将一个表按照某个字段进行拆分,使每个表只包含部分数据,这样可以将数据分散到多个服务器上,实现横向扩展。水平拆分需要考虑数据的均匀分布、数据查询的路由、数据分片的容错和数据迁移等问题。
垂直拆分(Vertical Partitioning):垂直拆分是将一个表按照某个字段进行拆分,使每个表只包含某些列,这样可以将不同的表分散到不同的服务器上,实现纵向扩展。垂直拆分需要考虑表之间的关系、查询的优化和数据的一致性等问题。
对于水平拆分和垂直拆分的选择,需要根据具体的业务需求和数据特点来进行权衡。一般来说,水平拆分适用于数据量大、读写比较平均的场景,而垂直拆分适用于数据结构复杂、查询较为复杂的场景。
无论是水平拆分还是垂直拆分,都需要考虑数据一致性、查询路由、数据迁移和容错等问题。对于数据一致性问题,可以使用分布式事务、数据同步和数据备份等技术来解决;对于查询路由问题,可以使用负载均衡和查询路由等技术来解决;对于数据迁移和容错问题,可以使用数据迁移和数据备份等技术来解决。

27. 基于mycat实现读写分离

Mycat是一个开源的基于MySQL协议和JDBC协议的分布式数据库中间件,可以实现MySQL的读写分离、分库分表、数据分片等功能。下面是基于Mycat实现MySQL读写分离的步骤:
安装Mycat服务器:首先需要下载Mycat服务器,并按照官方文档进行安装和配置。
配置Mycat服务器:在Mycat的配置文件中,需要配置数据源、数据节点和分片规则等信息。在读写分离的场景下,需要配置主从数据源、数据节点和读写分离规则。
配置MySQL主从复制:在MySQL数据库中,需要开启主从复制,并配置Mycat服务器连接到MySQL主库。
配置Mycat读写分离规则:在Mycat的配置文件中,需要配置读写分离规则,指定哪些SQL语句需要走主库,哪些SQL语句需要走从库。读写分离规则可以根据业务需求和数据特点来进行调整和优化。
启动Mycat服务器:完成以上配置后,就可以启动Mycat服务器,并在应用程序中使用Mycat的JDBC驱动连接到Mycat服务器,进行读写分离的操作。

需要注意的是,在使用Mycat进行读写分离时,需要保证数据的一致性和完整性。在写操作完成后,需要确保数据被正确地同步到主库和从库,以保证数据的一致性。同时,在读操作中,需要确保从库的数据是最新的,以保证数据的完整性。

28. 总结mysql高可用方案及高可用级别,搭建MHA集群和galera cluster,尝试搭建TIDB集群。

MySQL高可用方案是指通过使用多种技术手段,确保MySQL数据库的高可用性、可靠性和稳定性,从而保证业务的连续性和稳定性。以下是常见的MySQL高可用方案和高可用级别:
主从复制:主从复制是MySQL最常用的高可用方案之一,通过将数据从主库同步到多个从库上,实现读写分离和容灾备份等功能。
MHA集群:MHA(Master High Availability)是一个基于主从复制的高可用解决方案,可以自动检测主库故障,将从库提升为新的主库,并重建从库复制关系,从而实现MySQL数据库的自动故障转移。
Galera Cluster:Galera Cluster是一个基于同步复制的MySQL高可用解决方案,通过将多个MySQL节点组成一个集群,实现MySQL的自动容错和故障转移。
TiDB集群:TiDB是一个分布式数据库,通过将数据分散到多个节点上,实现MySQL的自动故障转移和分布式事务等功能,从而实现MySQL的高可用性和可伸缩性。

以下是搭建MHA集群和Galera Cluster集群的步骤:
搭建MHA集群:首先需要安装MHA软件,并配置MHA的管理节点和MySQL节点信息。在MySQL节点中,需要开启主从复制,并将MHA的脚本复制到节点上。启动MHA的管理节点后,就可以进行主库故障转移的测试和操作。
搭建Galera Cluster集群:首先需要安装Galera Cluster软件,并在所有节点上配置相同的my.cnf文件。在MySQL节点中,需要开启同步复制,并配置Galera Cluster集群的节点信息。在所有节点上启动MySQL服务,就可以组成Galera Cluster集群。
尝试搭建TiDB集群:首先需要安装TiDB软件,并配置TiDB集群的拓扑结构和节点信息。在TiDB集群中,数据分散到多个节点上,每个节点可以同时作为TiDB的组件和MySQL的服务。在所有节点上启动TiDB服务和MySQL服务,就可以组成TiDB集群。
需要注意的是,MySQL高可用方案的选择和搭建需要根据具体的业务需求和数据特点来进行权衡和选择。在搭建集群时,需要注意配置文件的同步、节点的健康检查和容错备份等问题,以确保MySQL的高可用性和可靠性。

29. 总结mysql配置最佳实践。

MySQL配置的最佳实践是指通过优化MySQL的配置参数,提高MySQL的性能、可靠性和安全性。以下是MySQL配置的最佳实践:
选择合适的存储引擎:MySQL支持多种存储引擎,如InnoDB、MyISAM等,根据实际需求选择合适的存储引擎可以提高MySQL的性能和可靠性。
配置缓存和缓冲池:MySQL的缓存和缓冲池可以提高查询的效率和响应速度,需要根据系统的内存和负载情况进行适当的调整和优化。
配置日志和复制:MySQL的日志和复制可以提供数据备份和容灾恢复的功能,需要根据业务需求和系统负载进行配置和管理。
设置安全参数:MySQL的安全参数可以保护数据库的数据安全和防止黑客攻击,需要设置合适的密码、权限和防火墙等参数。
配置优化器和查询缓存:MySQL的优化器和查询缓存可以提高查询的效率和性能,需要根据具体的业务需求和数据特点进行优化和调整。
调整线程池和连接池:MySQL的线程池和连接池可以提高系统的并发处理能力和响应速度,需要根据实际负载情况进行调整和优化。
监控和诊断工具:MySQL的监控和诊断工具可以实时监测系统的性能和状态,帮助管理员及时发现和解决问题。

需要注意的是,MySQL配置的最佳实践需要根据具体的业务需求和系统特点进行细致的调整和优化,以达到最佳的性能和可靠性。同时,需要定期进行系统的性能测试和评估,及时发现和解决潜在的问题和瓶颈。

30. 总结openvpn原理,并完成1键安装不同版本vpn脚本,可以适配rocky, ubuntu, centos主机。同时支持添加账号,注销账号。

OpenVPN是一种开源的VPN(虚拟私人网络)解决方案,可以通过使用SSL/TLS协议来保证数据传输的安全性和私密性。以下是OpenVPN的工作原理:
OpenVPN使用SSL/TLS协议来建立VPN连接,通过加密传输数据来保护数据的安全性和私密性。
OpenVPN支持多种认证方式,如用户名/密码、证书等,可以根据实际需求进行配置。
OpenVPN通过在本地和远程主机上安装客户端和服务端,实现VPN的建立和数据传输。
OpenVPN可以通过配置文件来定义VPN连接的参数和属性,包括IP地址、端口、加密方式、认证方式等。
OpenVPN可以通过使用桥接或路由模式来连接不同的网络,实现不同网络之间的数据传输。 
#!/bin/bash

# 安装OpenVPN
if [[ -f /etc/rocky-release ]]; then   # 检查Rocky Linux发行版
    yum -y install epel-release
    yum -y install openvpn
elif [[ -f /etc/centos-release ]]; then   # 检查CentOS发行版
    yum -y install epel-release
    yum -y install openvpn
elif [[ -f /etc/lsb-release ]]; then   # 检查Ubuntu发行版
    apt-get update
    apt-get -y install openvpn
else
    echo "不支持的操作系统"
    exit 1
fi

# 添加账号
add_user() {
    echo "请输入要添加的用户名:"
    read username
    echo "请输入要添加的密码:"
    read password
    cd /etc/openvpn/easy-rsa/
    . ./vars
    ./easyrsa build-client-full $username nopass
    mkdir -p /etc/openvpn/client-configs/files/$username
    cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/easy-rsa/pki/issued/$username.crt /etc/openvpn/easy-rsa/pki/private/$username.key /etc/openvpn/client-configs/files/$username/
    cat /etc/openvpn/client-configs/make_config.sh | sed "s/USERNAME/$username/g" > /etc/openvpn/client-configs/files/$username/$username.ovpn
    sed -i "s/remote my-server-1 1194/remote yourserverip 1194/g" /etc/openvpn/client-configs/files/$username/$username.ovpn
    echo -e "$username\t$password" >> /etc/openvpn/creds
    echo "已添加用户:$username"
}

# 删除账号
del_user() {
    echo "请输入要删除的用户名:"
    read username
    cd /etc/openvpn/easy-rsa/
    . ./vars
    ./easyrsa --batch revoke $username
    ./easyrsa gen-crl
    rm -f /etc/openvpn/client-configs/files/$username/*
    rm -f /etc/openvpn/creds
    touch /etc/openvpn/creds
    sed -i "/^$username\t/d" /etc/openvpn/creds
    echo "已删除用户:$username"
}

# 主菜单
menu() {
    echo "请选择操作:"
    echo "1. 添加账号"
    echo "2. 删除账号"
    echo "3. 退出"
    read choice
    case $choice in
        1) add_user;;
        2) del_user;;
        3) exit;;
        *) echo "无效的选择";;
    esac
}

# 运行主菜单
while true; do
    menu
done

  31. 配置LAMP要求 域名使用主从dns, dns解析到2个apache节点,apache和php在同一个节点, mariadb使用mycat读写分离并且要求后端为MHA集群。 架构规划图及解析一次请求和响应的流程和实践过程。

在这个架构中,CentOS 7.9系统运行了一个LAMP服务器,其中LAMP代表Linux操作系统,Apache web服务器,MySQL/MariaDB数据库和PHP编程语言。域名通过主从DNS服务器进行解析,并且解析到两个Apache web服务器上。Apache和PHP运行在同一个节点上,而MariaDB则使用了MyCat进行读写分离,并且MyCat后端连接到MHA集群。MHA集群由多个MySQL数据库节点组成。

下面是一次请求和响应的流程:
客户端通过域名访问web服务器,发出HTTP请求。
DNS服务器解析域名并返回IP地址。
客户端向web服务器发送HTTP请求。
Apache web服务器接收到请求并将请求转发到后端的MyCat服务器。
MyCat服务器进行读写分离,将读请求转发到MHA集群中的一个MySQL数据库节点进行处理,将写请求转发到主节点上。
MySQL节点接收到读请求并执行查询操作,将查询结果返回到MyCat服务器。
MyCat服务器将查询结果返回给Apache web服务器。
Apache web服务器使用PHP进行动态页面生成,并将结果返回给客户端。
客户端收到HTTP响应并显示结果。

实践过程需要按照以下步骤进行:
安装CentOS 7.9操作系统并进行基本的系统配置。
安装Apache web服务器,PHP编程语言以及MariaDB数据库。
配置MyCat进行读写分离,并将其后端连接到MHA集群。
配置Apache web服务器和PHP运行环境,并将其与MariaDB和MyCat进行集成。
配置主从DNS服务器,并将域名解析到两个Apache web服务器。
对整个系统进行测试和优化,确保其能够正常工作并具有良好的性能。
posted @ 2023-04-06 19:53  Jack_Cui  阅读(41)  评论(0编辑  收藏  举报