(第二十二天)

上午
1 、为 mysql 添加开机启动 chkconfig
[root@mysql1 ~] # chkconfig --list // 列出系统服务在不同运行级别下的启动状态
注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。 SysV 配置数据
可能被原生 systemd 配置覆盖。
要列出 systemd 服务,请执行 'systemctl list-unit-files'
查看在具体 target 启用的服务请执行
'systemctl list-dependencies [target]'
netconsole 0 : 1 : 2 : 3 : 4 : 5 : 6 :
network 0 : 1 : 2 : 3 : 4 : 5 : 6 :
[root@mysql1 ~] # chkconfig --add mysql8 // 将名为 mysql8 的服务添加到系统的服务管
理列表中,以便通过 chkconfig 工具来管理它在不同运行级别的启动状态
[root@mysql ~] # chkconfig mysql8 on // 设置 mysql8 服务在特定运行级别(或多个运行
级别)自动启动
2 、编辑配置文件 my.cnf
[root@mysql1 ~] # vim /usr/local/mysql/my.cnf
[mysqld]
basedir = /usr/local/mysql/ # 指明了 MySQL 的安装根目录
datadir = /usr/local/mysql/data # 指明了数据文件的存储目录
socket = /tmp/mysql.sock # 定义了 MySQL 服务器用于本地连接的套接字文件路径
[root@mysql1 ~] # service mysql8 restart
[root@mysql1 ~] # /usr/local/mysql/bin/mysql_secure_installation // 增强 MySQL
服务器安全性
3 、修改环境变量
mysql bin 也添加到 $PATH
[root@mysql1 ~] # sed -i '$a export PATH=/usr/local/mysql/bin/:$PATH'
/etc/profile
[root@mysql1 ~] # source /etc/profile
4 mysql 角色授权
[root@mysql1 ~] # mysql -uroot -p'Root@123456'
mysql> select host,user from mysql.user;
+ ----------- + ------------------ +
| host | user |
+ ----------- + ------------------ +
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+ ----------- + ------------------ +
4 rows in set (0.01 sec)
mysql> create user 'aaa' @ '%' identified by 'aaa' ;
Query OK, 0 rows affected (0.11 sec)
[root@mysql1 ~] # firewall-cmd --zone=public --add-port=3306/tcp --permanent
// 防火墙打开 3306 端口
success
[root@mysql1 ~] # firewall-cmd --reload // 重新加载防火墙
success
mysql> create role a;
Query OK, 0 rows affected (0.06 sec)
mysql> select host,user from mysql.user;
+ ----------- + ------------------ +
| host | user |
+ ----------- + ------------------ +
| % | a |
| % | aaa |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+ ----------- + ------------------ +
6 rows in set (0.00 sec)
mysql> show grants for a;
+ ------------------------------- +
| Grants for a@% |
+ ------------------------------- +
| GRANT USAGE ON *.* TO `a` @ `%` |
+ ------------------------------- +
1 row in set (0.00 sec)
mysql> grant all on *.* to a;
Query OK, 0 rows affected (0.02 sec)
mysql> grant a to aaa;
Query OK, 0 rows affected (0.01 sec)
mysql> show grants for aaa;
+ --------------------------------- +
| Grants for aaa@% |
+ --------------------------------- +
| GRANT USAGE ON *.* TO `aaa` @ `%` |
| GRANT `a` @ `%` TO `aaa` @ `%` |
+ --------------------------------- +
2 rows in set (0.00 sec)
角色不生效
在配置文件中不添加 activate_all_roles_on_login=on
glibc 安装, my.cnf 在项目目录之下
rpm 安装, my.cnf 文件在 /etc/my.cnf
[root@mysql1 ~] # vim /usr/local/mysql/my.cnf
activate_all_roles_on_login = on # 在登录时激活所有的角色
[root@mysql1 ~] # service mysql8 restart
Shutting down MySQL... SUCCESS!
Starting MySQL........ SUCCESS!
5 、自动安装 mysql 脚本(主)
#!/bin/bash
yum list installed |grep libaio # 在已安装的软件包列表中搜索包含 libaio 字样的软
件包
if [ $? -ne 0 ]; then
yum -y install libaio # 如果没有安装这个软件包就安装这个软件
fi
echo libaio yes
rm -rf /etc/my.cnf # 删除 /etc/my.cnf 文件,后续要创建到项目中
/usr/local/mysql/
echo remo my.cnf yes
#tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar
#echo tar yes
tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz # 解压软件包
echo tar xz yes
cp -r ~/mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql # root 家目
录下的已经解压过的软件包下的内容复制到 /usr/local/mysql 目录下
echo copy file to /usr/local/mysql yes
mkdir /usr/local/mysql/mysql-files # /usr/local/mysql 目录下创建 mysql
files 目录
echo mysql-files yes
grep mysql /etc/passwd # 查看是否有 mysql 用户
useradd -r -s /sbin/nologin mysql # 创建 mysql 用户( -r 选项表示创建一个系统用户
(通常系统用户的 UID 范围在 1 499 之间))
chown mysql:mysql /usr/local/mysql/mysql-files # 使 mysql-files 目录的所属主和
所属组都为 mysql
chmod 750 /usr/local/mysql/mysql-files # 设置 mysql-files 目录的权限为 750
/usr/local/mysql/bin/mysqld --initialize --user = mysql --
basedir = /usr/local/mysql/ # 初始化 MySQL 数据库服务器
/usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir = /usr/local/mysql/data
# MySQL 服务器设置 SSL Secure Sockets Layer ,安全套接层)和 RSA Rivest–
Shamir–Adleman ,一种非对称加密算法)相关的配置
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql8 #
/usr/local/mysql/support-files/mysql.server 文件复制到 /etc/init.d/ 目录下并改名为
mysql8 ,方便后续启服务
sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile # 修改环境变
量,方便后续进入 mysql
source /etc/profile # 激活配置
--initialize 选项会执行初始化操作,包括生成随机的初始密码、创建必要的数据库结构等。
--user=mysql 指定以 mysql 用户来运行数据库服务。
--basedir=/usr/local/mysql/ 指明了 MySQL 的安装根目录。
执行此命令后,您可以在输出中找到生成的初始密码,请注意记录好这个密码,以便后续登录和修
改密码使用。
--datadir=/usr/local/mysql/data 选项指定了 MySQL 数据文件的存储目录。
执行此命令可以帮助确保 MySQL 服务器在通信过程中的安全性,通过使用 SSL 加密连接来保护数据
传输。
6 、数据库时间同步
[root@slave-mysql ~] # yum -y install ntpdate.x86_64
[root@slave-mysql ~] # ntpdate cn.ntp.org.cn
6 Aug 11 :21:15 ntpdate[1165]: adjust time server 203 .107.6.88 offset 0 .000143
sec
[root@mysql ~] # yum -y install ntpdate.x86_64
[root@mysql ~] # ntpdate cn.ntp.org.cn
6 Aug 11 :21:15 ntpdate[1165]: adjust time server 203 .107.6.88 offset 0 .000143
sec
下午
环境准备:主从服务器关闭防火墙和 selinux ,时间同步
1 、使用脚本重新搭建主服务器
[root@mysql ~] # sh mysql.sh
[root@mysql ~] # vim /usr/local/mysql/my.cnf
[mysqld]
basedir = /usr/local/mysql/
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
activate_all_roles_on_login = on
port = 3306 # 指定了 MySQL 服务器监听的端口为 3306 ,这是
MySQL 的默认端口,客户端连接时将使用这个端口进行通信
log-error = /usr/local/mysql/data/db01-master.err # 定义了错误日志的存储路径为
/usr/local/mysql/data/db01-master.err ,服务器运行过程中的错误信息将被记录到这个文件中
log-bin = /usr/local/mysql/data/binlog # 启用了二进制日志,并指定其存储位置为
/usr/local/mysql/data/binlog ,二进制日志可用于数据备份、主从复制等场景
server-id = 10 # 为服务器分配了一个唯一的标识符 10 ,在主从复制架构中用于区分不同的
服务器
character_set_server = utf8mb4 # 设置了服务器的默认字符集为 utf8mb4 ,确保在处理数据
时使用这种更广泛支持 Unicode 字符的字符集
[root@mysql ~] # service mysql8 restart
Shutting down MySQL. SUCCESS!
Starting MySQL... SUCCESS!
[root@mysql-zhu ~] # mysql -uroot -p'y-Hqum4J)X!='
mysql> alter user 'root' @ 'localhost' identified by '123' ; // 修改 root 密码
Query OK, 0 rows affected (0.07 sec)
2 、使用脚本重新搭建从服务器
[root@mysql-slave ~] # vim mysql.sh
#!/bin/bash
yum list installed |grep libaio
if [ $? -ne 0 ]; then
yum -y install libaio
fi
echo libaio yes
rm -rf /etc/my.cnf
echo remo my.cnf yes
#tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar
#echo tar yes
tar -xf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz
echo tar xz yes
cp -r ~/mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql
echo copy file to /usr/local/mysql yes
mkdir /usr/local/mysql/mysql-files
echo mysql-files yes
grep mysql /etc/passwd
useradd -r -s /sbin/nologin mysql
chown mysql:mysql /usr/local/mysql/mysql-files
chmod 750 /usr/local/mysql/mysql-files
#/usr/local/mysql/bin/mysqld --initialize --user=mysql --
basedir=/usr/local/mysql/ 从服务器不初始化 mysql
#/usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
也就没有 data 目录
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql8
sed -i '$aexport PATH=/usr/local/mysql/bin:$PATH' /etc/profile
source /etc/profile
[root@mysql-slave ~] # source mysql.sh
[root@mysql-slave ~] # vim /usr/local/mysql/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
port = 3310 # 指定了 MySQL 服务器监听的端口为 3310
log-error = /usr/local/mysql/data/db01-slave.err
relay-log = /usr/local/mysql/data/relaylog
server-id = 11 # 为服务器分配了一个唯一的标识符 11 ,在主从复制架构中用于区
分不同的服务器
character_set_server = utf8mb4
3 、数据同步
[root@mysql-zhu ~] # service mysql8 stop // 停止主 mysql 服务
Shutting down MySQL. SUCCESS!
[root@mysql-zhu ~] # ls /usr/local/mysql/data/
auto.cnf // 主要用于存储一些服务器自动生成的配置信息,其中可能包括服务器的 UUID
Universally Unique Identifier ,通用唯一标识符)等重要的标识信息
[root@mysql-zhu ~] # rm -rf /usr/local/mysql/data/auto.cnf
[root@mysql-zhu ~] # yum -y install rsync // 下载同步软件
[root@mysql-slave ~] # yum -y install rsync // 下载同步软件
[root@mysql-zhu ~] # rsync -av /usr/local/mysql/data
root@10.0.0.60:/usr/local/mysql/ // 将主中的 data 目录同步到从中
[root@mysql-slave ~] # ls /usr/local/mysql/data/
binlog.000001 client-key.pem #innodb_redo public_key.pem
binlog.000002 db01-master.err #innodb_temp server-cert.pem
binlog.index #ib_16384_0.dblwr mysql server-key.pem
ca-key.pem #ib_16384_1.dblwr mysql.ibd sys
ca.pem ib_buffer_pool performance_schema undo_001
client-cert.pem ibdata1 private_key.pem undo_002
[root@mysql-slave ~] # service mysql8 start // 启动从的 mysql 服务
Starting MySQL.... SUCCESS!
[root@mysql-slave ~] # mysql -P3310 -p123 // 可以登录到从的 mysql 中了
4 、主从复制实现
replication slave :指定授予的权限类型为复制从服务器的权限
[root@mysql-zhu ~] # service mysql8 start // 启动主的 mysql 服务
Starting MySQL.... SUCCESS!
[root@mysql-zhu ~] # mysql -uroot -p'123' // 登录到主的 mysql
mysql> create user 'slave' @ '%' identified by '123' ; // 创建一个 slave 用户, %
表示在每个主机上都可以使用 slave 登录到该主机上的 mysql
Query OK, 0 rows affected (0.06 sec)
mysql> grant replication slave on *.* to 'slave' @ '%' ; // 将所有的数据库的所有
表的 replication slave 操作权限给到 slave 用户
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges; // 重新加载权限表
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables with read lock; // 刷新所有表并施加一个全局读锁
Query OK, 0 rows affected (0.00 sec)
mysql> create database if not exists abc charset utf8;
ERROR 1223 (HY000): Can 't execute the query because you have a conflicting
read lock
mysql> show master status; // 显示主服务器当前二进制日志的状态信息 ,
+ --------------- + ---------- + -------------- + ------------------ + ---------------
---- +
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
Executed_Gtid_Set |
+ --------------- + ---------- + -------------- + ------------------ + ---------------
---- +
| binlog.000003 | 1067 | | |
|
+ --------------- + ---------- + -------------- + ------------------ + ---------------
---- +
1 row in set (0.01 sec)
File :当前正在写入的二进制日志文件的名称。
Position :当前写入的位置(偏移量)在二进制日志文件中的位置。
[root@mysql-slave ~] # mysql -uslave -p123 -h10.0.0.51 -P3306 --get-server
public-key // 用于以指定的用户 slave 和密码 123 连接到主机地址为 10.0.0.51 、端口为
3306 MySQL 服务器,并获取服务器的公共密钥
[root@mysql-slave ~] # mysql -P3310 -p123 // 登录到从的数据库中
mysql> change master to
- > master_host = '10.0.0.51' , // 指定主服务器的主机地址
- > master_user = 'slave' , // 指定用于连接主服务器进行复制的用户名
- > master_password = '123' , // 指定对应的密码
- > master_port = 3306 , // 指定主服务器的端口
- > master_log_file = 'binlog.000003' , // 指定从哪个二进制日志文件开始复制
- > master_log_pos = 1067 ; // 指定在指定的二进制日志文件中的起始位置
Query OK, 0 rows affected, 9 warnings (0.01 sec)
mysql> start slave; // 启动从服务器的复制进程
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> show slave status\G // 查看从服务器的复制状态详细信息
5 、同步测试
主服务器
mysql> unlock tables; // 释放之前通过 LOCK TABLES 命令施加的表锁
Query OK, 0 rows affected (0.00 sec)
mysql> create database if not exists test charset utf8mb4; // 创建数据库 test
Query OK, 1 row affected (0.02 sec)
mysql> use test; // 使用 test 数据库
Database changed
mysql> create table user(id int primary key,username varchar(45) not
null,passwordvarchar(45) not null); // 创建 user
Query OK, 0 rows affected (0.03 sec)
mysql> insert into user values(1, 'zhangsan' , 'abc' ); // user 表中插入数据
Query OK, 1 row affected (0.03 sec)
从服务器
mysql> show databases; // 查看数据库
+ -------------------- +
| Database |
+ -------------------- +
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+ -------------------- +
5 rows in set (0.02 sec)
mysql> use test; // 使用 test 数据库
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> show tables; // 查看所有表
+ ---------------- +
| Tables_in_test |
+ ---------------- +
| user |
+ ---------------- +
1 row in set (0.00 sec)
mysql> select * from user; // 查看 user 表的内容
+ ---- + ---------- + ---------- +
| id | username | password |
+ ---- + ---------- + ---------- +
| 1 | zhangsan | abc |
+ ---- + ---------- + ---------- +
1 row in set (0.00 sec)
  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,使得子数组的和大于等于给定的目标值。这里可以使用滑动窗口的方法来解决问题。使用两个指针来表示滑动窗口的左边界和右边界,通过移动指针来调整滑动窗口的大小,使得滑动窗口中的元素的和满足题目要求。具体实现的代码如下: ```python def minSubArrayLen(self, target: int, nums: List[int]) -> int: left = 0 right = 0 ans = float('inf') total = 0 while right < len(nums): total += nums[right] while total >= target: ans = min(ans, right - left + 1) total -= nums[left] left += 1 right += 1 return ans if ans != float('inf') else 0 ``` 以上就是第二十二的算法训练营的内容。通过这些题目的练习,可以提升对双指针和滑动窗口等算法的理解和应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值