mysql笔记:25. docker环境中mysql主从复制、主主复制实操
文章目录
- 一、准备工作
- 1. 安装配置Docker
- 2. 准备MySQL相关的配置和数据目录
- 二、基于日志点的主从复制
- 1. 配置Master服务器
- 1.1 修改配置文件
- 1.2. 在docker中启动Master节点
- 1.3. 创建用户并授权
- 2. 配置Slave1服务器
- 2.1. 修改配置
- 2.2. 启动服务
- 2.3. 指定Master
- 2.4. 开始复制
- 3. 配置Slave2服务器
- 3.1. 修改配置
- 3.2. 启动服务
- 3.3. 指定Master
- 3.4. 开始复制
- 4. 测试效果
- 4.1. 更新数据
- 4.2. 查看同步结果
- 三、基于GTID的主从复制
- 1. Master配置文件
- 2. Slave配置文件
- 3. 指定Master信息
- 四、主主复制
- 1. 基于日志点的主主复制
- 1.1. 修改节点1的MySQL配置
- 1.2. 修改节点2的MySQL配置
- 1.3. 启动两个MySQL
- 1.4. 连接MySQL并创建用户
- 1.5. 配置Master信息
- 1.6. 开启复制
- 1.7. 复制测试
- 2. 基于GTID的主主复制
- 2.1. 修改节点的MySQL配置
- 2.2. 配置Master信息
Docker容器是现在的主流技术,容器提供了细粒度的系统隔离机制,每个容器都完全独立,其中包括了应用以及所有需要的系统依赖,可以把系统中每个服务放入容器,让各个服务都以容器的形式运行,这样就大大简化了系统的部署过程,更加便于维护。
一、准备工作
1. 安装配置Docker
各位看官根据自己的操作系统和喜好选择相应的Docker进行安装和配置。使用docker pull命令拉取mysql 8的镜像文件。
> docker pull mysql:8
2. 准备MySQL相关的配置和数据目录
本次演示以一主二从共三台服务器为例进行演示。在当前目录创建三个配置文件目录和三个数据目录:
> cd /Users/Tom/docker
>
> mkdir mysqlconf
> mkdir mysqlconf/master
> mkdir mysqlconf/slave1
> mkdir mysqlconf/slave2
>
> mkdir mysqldata
> mkdir mysqldata/master
> mkdir mysqldata/slave1
> mkdir mysqldata/slave2
>
> tree -L 2
.
├── README.md
├── mysqlconf
│ ├── master
│ ├── slave1
│ └── slave2
└── mysqldata├── master├── slave1└── slave2
运行MySQL容器并从中拷贝MySQL配置文件到本地备用,配置文件目录:/etc/my.cnf
。
# 语法:
docker cp <containerId>:/path/to/file /path/on/host# 示例:temp_mysql8是本次启动的MySQL容器名称
docker cp temp_mysql8:/etc/my.cnf .
拷贝配置文件到已创建的配置文件目录:
cp my.cnf mysqlconf/master/my.cnf
cp my.cnf mysqlconf/slave1/my.cnf
cp my.cnf mysqlconf/slave2/my.cnf> tree -L 3
.
├── README.md
├── mysqlconf
│ ├── master
│ │ └── my.cnf
│ ├── slave1
│ │ └── my.cnf
│ └── slave2
│ └── my.cnf
└── mysqldata├── master├── slave1└── slave2
二、基于日志点的主从复制
1. 配置Master服务器
1.1 修改配置文件
编辑主服务器的MySQL配置文件mysqlconf/master/my.cnf
,添加下列配置项:
[mysqld]
server-id=1
log-bin=mysql-binlog
binlog-do-db=your-database-name
default_authentication_plugin=mysql_native_password
1.2. 在docker中启动Master节点
docker run -P --name mysqlmaster \-v $PWD/mysqldata/master:/var/lib/mysql \-v $PWD/mysqlconf/master/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8
参数含义说明:
-P
:本机与容器的端口映射--name
:为容器指定一个名称mysqlmaster
MYSQL_ROOT_PASSWORD
:指定MySQL中root用户的密码为123456-d
:指定容器运行方式为后台运行
容器启动后登录MySQL并检查配置是否生效:
$> docker exec -it mysqlmaster bash
# mysql -uroot -p123456
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
如果登录MySQL提示错误:
Access denied for user 'root'@'localhost' (using password: YES)
,可能是你密码输入错误,也可能是加密插件导致的。MySQL8使用的默认加密插件是 caching_sha2_password,而MySQL5.6使用的是mysql_native_password,当你在控制台使用明文密码登录的时候走的是mysql_native_password加密,而数据库记录的是caching_sha2_password加密后的密码。两个密文不一致导致登录失败。解决办法是在配置文件中指定加密插件:default_authentication_plugin=mysql_native_password
1.3. 创建用户并授权
在Master上创建一个复制用户并授权
mysql> CREATE USER 'repl'@'%' identified by 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# 刷新用户权限信息
mysql> FLUSH PRIVILEGES;# 查看Master状态
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 1531 | | | |
+------------------+----------+--------------+------------------+-------------------+
执行结果中显示二进制日志文件为mysql-bin.000003,日志位置为1531。Slave就是从这个日志点开始进行复制的。
2. 配置Slave1服务器
2.1. 修改配置
编辑从服务器slave1的MySQL配置文件mysqlconf/slave1/my.cnf
,添加下列配置项:
[mysqld]
server-id=2
relay-log=mysql-relay-bin
replicate-do-db=your_database_name
2.2. 启动服务
docker run -P --name mysqlslave1 \-v $PWD/mysqldata/slave1:/var/lib/mysql \-v $PWD/mysqlconf/slave1/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8
容器启动后登录MySQL并检查配置是否生效:
$> docker exec -it mysqlslave1 bash
# mysql -uroot -p123456
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
2.3. 指定Master
指定Master的信息,包括IP、用户、密码、日志文件和位置。
mysql> change master to master_host='172.17.0.2', master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=828
可以使用
docker inspect mysqlmaster | grep IPAddress
查看Master节点的IP信息
2.4. 开始复制
mysql> start slave;mysql> show slave status \G;
...
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
最关键的是这两项信息:
- Slave_IO_Running:
- Slave_SQL_Running:
3. 配置Slave2服务器
3.1. 修改配置
编辑从服务器slave2的MySQL配置文件mysqlconf/slave2/my.cnf
,添加下列配置项:
[mysqld]
server-id=3
relay-log=mysql-relay-bin
replicate-do-db=your_database_name
3.2. 启动服务
docker run -P --name mysqlslave2 \-v $PWD/mysqldata/slave2:/var/lib/mysql \-v $PWD/mysqlconf/slave2/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8
容器启动后登录MySQL并检查配置是否生效:
$> docker exec -it mysqlslave2 bash
# mysql -uroot -p123456
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3 |
+---------------+-------+
3.3. 指定Master
指定Master的信息,包括IP、用户、密码、日志文件和位置。
mysql> change master to master_host='172.17.0.2', master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=828
3.4. 开始复制
mysql> start slave;mysql> show slave status \G;
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
最关键的是这两项信息:
- Slave_IO_Running:
- Slave_SQL_Running:
4. 测试效果
4.1. 更新数据
在Master节点上创建一个新的数据库和表,并任意插入一条数据:
mysql> create database test;
mysql> use test;
mysql> create table user(id bigint(20) primary key, name varchar(20));
mysql> insert into user value(1, 'Tom');
mysql> select * from user;
4.2. 查看同步结果
在Slave1和Slave2节点查看test.user
表的数据:
mysql> select * from test.user;
+----+------+
| id | name |
+----+------+
| 1 | Tom |
+----+------+
结果表明主从复制环境配置成功。
三、基于GTID的主从复制
基于GTID的主从复制配置步骤跟基于日志点的主从复制配置基本相似,差别在于配置和指定Master时使用的命令参数略有差异。具体如下:
1. Master配置文件
打开配置文件mysqlconf/master/my.cnf
,在[mysqld]部分添加配置:
[mysqld]
server-id=1
# 启动二进制日志
log-bin=mysql-bin
binlog_format=row
# 开启GTID模式
gtid_mode=on
# 强制GTID一致性
enforce_gtid_consistency=true
- binlog_format:指定二进制日志格式为row
2. Slave配置文件
打开配置文件mysqlconf/slave1/my.cnf
和mysqlconf/slave2/my.cnf
,分别在[mysqld]部分添加配置:
# slave1节点配置
server_id=2
log-bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
read_only=ON
- log_slave_updates:参数决定了在从服务器上是否将复制事件写入二进制日志文件(Binary Log)。默认情况下,这个参数是0,表示关闭,也就是说从服务器不会将复制事件写入二进制日志。
- relay_log_info_repository:指定中继日志的存储方式,默认是文件,这样配置是使用了两个表,是INNODB存储引擎,好处是当出现数据库崩溃时,利用INNODB引擎事务的特点,对这两个表进行恢复,以保证从服务器可以从正确位置恢复数据。
- read_only:指定从服务器是否只读,此参数对超级用户无效,并且不会影响从服务器的复制。这个参数主要保证从服务器的数据安全性。
# slave2节点配置
server_id=3
log-bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
read_only=ON
3. 指定Master信息
change master to master_host='172.17.0.2', master_user='repl', master_password='123456', master_auto_position=1;
CHANGE MASTER TO MASTER_HOST='172.17.0.2',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_AUTO_POSITION=1;
四、主主复制
主从复制支持在一台Master数据库的写入和其他Slave数据库只读操作。但这种部署架构有个缺点:只有Master数据库具有写操作。当数据库写操作很多时,它的压力比较大。为了解决这个问题,可以对上述主从架构优化,改成主主复制,使每个数据库都能写入操作,同时,将写入的数据复制到其他数据库中。即数据库之间互为主从复制关系。
主主复制的搭建也比较简单,就是在主从复制的操作基础上增加一些配置和步骤即可。
使用两个MySQL服务器节点互为主从进行演示。
1. 基于日志点的主主复制
1.1. 修改节点1的MySQL配置
配置文件路径:mysqlconf/master1/my.cnf
[mysqld]
server_id=10
log-bin=mysql-bin
binlog_format=row
auto-increment-increment=2
auto-increment-offset=1
- auto-increment-increment:设置自增长的步进值,一般有n台MySQL设置为n即可
- auto-increment-offset:设置自增长的起始值,一般用n台MySQL的顺序号即可
主主备份配置中,最重要的就是配置自增长的步进值和起始值。通过设置它们防止多个数据库更新数据时主键重复而造成冲突。
1.2. 修改节点2的MySQL配置
配置文件路径:mysqlconf/master2/my.cnf
[mysqld]
server_id=11
log-bin=mysql-bin
binlog_format=row
auto-increment-increment=2
auto-increment-offset=2
1.3. 启动两个MySQL
docker run -P --name mysqlmaster1 \-v $PWD/mysqldata/master1:/var/lib/mysql \-v $PWD/mysqlconf/master1/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8docker run -P --name mysqlmaster2 \-v $PWD/mysqldata/master2:/var/lib/mysql \-v $PWD/mysqlconf/master2/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8
1.4. 连接MySQL并创建用户
分别连接上两个MySQL,并在每一个MySQL上创建复制用户用于后续的配置。
create user 'repl'@'%' identified by '123456';
grant replication slave on *.* to 'repl'@'%';
flush privileges;
1.5. 配置Master信息
通过docker inspect
命令得知当前两个节点的IP分别为172.17.0.3
、172.17.0.4
。
先登录172.17.0.3
,查询:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 843 | | | |
+------------------+----------+--------------+------------------+-------------------+
登录172.17.0.4
,使用上述查询的File、Position信息配置Master节点信息:
change master to master_host='172.17.0.3', master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=843;
同理,登录172.17.0.4
查询master节点信息,然后登录172.17.0.3
配置Master。
# 在172.17.0.4上查询
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 1577 | | | |
+------------------+----------+--------------+------------------+-------------------+# 在172.17.0.3上配置
mysql> change master to master_host='172.17.0.4', master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=1577;
1.6. 开启复制
在两个节点上分别执行start命令开启复制功能
mysql> start slave;mysql> show slave status;
1.7. 复制测试
分别在两个节点上执行一些更新操作,如INSERT、UPDATE或DELETE,然后去另一个节点查询相关数据是否已变更。
2. 基于GTID的主主复制
这种方式比上述方式更加简单,不用去查看日志File和Position,直接配置即可。注意复制用户创建两次要配置忽略mysql库,也可以创建一次复制用户,然后同步信息后另一个库不再创建复制用户。只是这种方式相当于多个节点使用相同的用户账号、密码,存在一定的安全风险。
2.1. 修改节点的MySQL配置
配置文件路径:mysqlconf/master1/my.cnf
[mysqld]
server_id=1
log-bin=mysql-bin
binlog_format=row
gtid_mode=on
enforce_gtid_consistency=true
auto-increment-increment=2
auto-increment-offset=1
配置文件路径:mysqlconf/master2/my.cnf
[mysqld]
server_id=2
log-bin=mysql-bin
binlog_format=row
gtid_mode=on
enforce_gtid_consistency=true
auto-increment-increment=2
auto-increment-offset=2
2.2. 配置Master信息
change master to master_host='172.17.0.3', master_user='repl', master_password='123456', master_auto_position=1;change master to master_host='172.17.0.4', master_user='repl', master_password='123456', master_auto_position=1;start slave;
相关文章:
mysql笔记:25. docker环境中mysql主从复制、主主复制实操
文章目录 一、准备工作1. 安装配置Docker2. 准备MySQL相关的配置和数据目录 二、基于日志点的主从复制1. 配置Master服务器1.1 修改配置文件1.2. 在docker中启动Master节点1.3. 创建用户并授权 2. 配置Slave1服务器2.1. 修改配置2.2. 启动服务2.3. 指定Master2.4. 开始复制 3. …...
大数据面试专题 -- kafka
1、什么是消息队列? 是一个用于存放数据的组件,用于系统之间或者是模块之间的消息传递。 2、消息队列的应用场景? 主要是用于模块之间的解耦合、异步处理、日志处理、流量削峰 3、什么是kafka? kafka是一种基于订阅发布模式的…...
深度学习入门简单实现一个神经网络
实现一个三层神经网络 引言测试数据 代码 引言 今天我们实现一个简单的神经网络 俩个输入神经元 隐藏层两个神经元 一个输出神经元 激活函数我们使用sigmoid 优化方法使用梯度下降 我们前期准备是需要把这些神经元的关系理清楚 x1:第一个输入 x2:第二个…...
win11 环境配置 之 Jmeter(JDK17版本)
一、安装 JDK 1. 安装 jdk 截至当前最新时间: 2024.3.27 jdk最新的版本 是 官网下载地址: https://www.oracle.com/java/technologies/downloads/ 建议下载 jdk17 另存为到该电脑的 D 盘下,新建jdk文件夹 开始安装到 jdk 文件夹下 2. 配…...
Windows下载使用nc(netcat)命令
‘nc’ 不是内部或外部命令,也不是可运行的程序? 点击链接地址,下载压缩包。 完成后解压 使用方式(三种): 1、直接双击exe使用 2、把这个exe放到cmd启动的默认路径下 放到默认路径下,使用nc&a…...
istio 设置 istio-proxy sidecar 的 resource 的 limit 和 request
方式一 修改 configmap 查看当前 sidecar 的 cpu 和 memory 的配额 在 istio-sidecar-injector 中查找,修改后重启 pod 可以生效(下面那个 proxy_init 配置不管,不知道是干嘛的) 方式二 如果是通过 iop 安装的 istio…...
flutter弹框
alertDialog:弹框 simpleDialog:选择弹框 showModalBottomSheet:底部弹出弹框 showtoast:三方插件弹框 Navigator.of(context).pop(点击取消) 关闭弹框,传递参数 import package:flutter/material.dart; // import package:flutter/cupertino.dart; import package:flut…...
2013年认证杯SPSSPRO杯数学建模B题(第一阶段)流行音乐发展简史全过程文档及程序
2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现: 随着互联网的发展,流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好,自动推荐并播放其它音乐。由于每个人喜好…...
代码随想录算法训练营第39天 | 62.不同路径, 63不同路径II
Leetcode - 62:不同路径 题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &#…...
Redis 的慢日志
Redis 的慢日志 Redis 的慢日志(Slow Log)是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈,定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…...
第十四届蓝桥杯第十题:蜗牛分享
问题描述 输入格式 输出格式 输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。 样例输入 3 1 10 11 1 1 2 1样例输出 4.20样例说明 蜗牛路线:(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0)(0,0)→(1,0)→(1,1)→(10,1…...
不懂技术的老板,如何避免过度依赖核心技术人员
在这个日新月异、技术驱动的时代,即使作为非技术背景的老板,也深知核心技术人员的价值。然而,过度依赖某几位核心技术人员,不仅可能带来经营风险,还可能限制企业的创新与发展。那么,不懂技术的老板…...
Vue系列-el挂载
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>el:挂载点</title> </head> <body&g…...
python--os和os.path模块
>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…...
前端通用命名规范和Vue项目命名规范
通用命名规范 变量和常量命名:变量和常量的命名应具有描述性,清晰明了,使用驼峰命名法或下划线命名法,例如:firstName、MAX_VALUE。 函数和方法命名:函数和方法的命名应该能够准确描述其功能&…...
NTP服务搭建
一、ntpd和ntpdate区别 1.ntpd是自动执行的远程更新本地系统时钟的服务,是平滑同步; 2.ntpdate是手工执行的服务,也就是一般用它执行一次本地时间更新,如果做成半自动,可以写入到crontab自动任务,从而变成…...
Linux离线安装mysql,node,forever
PS:本文是基于centos7实现的,要求系统能够查看ifconfig和unzip解压命令, 实现无网络可安装运行 首先现在百度网盘的离线文件包****安装Xftp 和 Xshell 把机房压缩包传到 home目录下****解压unzip 包名.zip 获取IP先获取到 linux 主机的ip ifconfig Xftp 连接输入IP,然后按照…...
WPF中获取TreeView以及ListView获取其本身滚动条进行滚动
实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) TreeView:TreeViewAutomationPeer lvap new TreeViewAutomationPeer(treeView); var svap lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer; var scroll svap.Owner as ScrollVie…...
C语言: 指针讲解
为什么需要指针? (1)指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果,但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能…...
C#使用Stopwatch类来实现计时功能
前言 在 C# 中,Stopwatch 类是用于测量经过的时间的工具类,提供了高精度的计时功能。Stopwatch 类位于 System.Diagnostics 命名空间中。通常情况下,使用 Stopwatch 的流程是创建一个 Stopwatch 对象,然后调用 Start 方法开始计时…...
ubuntu18.04安装qt
ubuntu18.04安装qt 1、下载文件 比如我下载的是5.13.0版本 下载链接 2、安装 wget https://download.qt.io/archive/qt/5.13/5.13.0/qt-opensource-linux-x64-5.13.0.runsudo chmod x qt-opensource-linux-x64-5.13.0.runsudo ./qt-opensource-linux-x64-5.13.0.run参考文…...
ElasticSearch、java的四大内置函数式接口、Stream流、parallelStream背后的技术、Optional类
第四周笔记 一、ElasticSearch 1.安装 apt-get install lrzsz adduser -m es 创建用户组: useradd *-m* xiaoming(用户名) *PS:追加参数-m* passwd xiaoming(用户名) passwd xiaoming 输入新的 UNIX 密码: 重新输入新的 UNIX 密码&…...
深入MNN:开源深度学习框架的介绍、安装与编译指南
引言 在人工智能的世界里,深度学习框架的选择对于研究和应用的进展至关重要。MNN,作为一个轻量级、高效率的深度学习框架,近年来受到了众多开发者和研究人员的青睐。它由阿里巴巴集团开源,专为移动端设备设计,支持跨平…...
[LeetCode][400]第 N 位数字
题目 400. 第 N 位数字 给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。 示例 1: 输入:n 3 输出:3 示例 2: 输入:n 11 输出:…...
clickhouse 查询group 分组最大值的一行数据。
按照 sql_finger_md5 分组取query_time_ms 最大的一行数据。 使用any函数可以去匹配到的第一行数据,所以可以先让数据按照query_time_ms 排序,然后再使用group by 和any结合取第一行数据,就是最大值的那一行数据。 selectany (time) as time…...
Python装饰器与生成器:从原理到实践
一、引言 Python 是一种功能强大且易于学习的编程语言,其丰富的特性使得开发者能够高效地完成各种任务。在 Python 中,装饰器和生成器是两个非常重要的概念,它们能够极大地增强代码的可读性和可维护性。本文将详细介绍如何学习 Python 装饰器…...
python-函数引入模块面向对象编程创建类继承
远离复读机行为 def calculate_BMI(weight,height):BMI weight / height**2if BMI < 18.5:category "偏瘦"elif BMI < 25:category "正常"elif BMI < 30:category "偏胖"else:category "肥胖"print(f"您的BMI分类…...
Spring:面试八股
文章目录 参考Spring模块CoreContainerAOP 参考 JavaGuide Spring模块 CoreContainer Spring框架的核心模块,主要提供IoC依赖注入功能的支持。内含四个子模块: Core:基本的核心工具类。Beans:提供对bean的创建、配置、管理功能…...
Flask Python:请求上下文和应用上下文
请求上下文和应用上下文详解 一、背景二、什么是上下文2.1、请求上下文2.2、应用上下文2.3、两种上下文的底层逻辑 三、写在最后 一、背景 在如何实现异步发送邮件的时候,遇到过这样一个报错 RuntimeError: Working outside of request context.This typically me…...
哔哩哔哩直播姬有线投屏教程
1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …...
公司网站建设工作重点/提高网站搜索排名
问题描述 今天在设计python串口代码时遇见一个问题,接收到的数据打印出来,一直都是两三组连在一起,即我的目标数据是: 7e307d02087d01557e 但是我把接收到的数据经过处理打印出来后是:7e307d02087d01557e7e307d02087d…...
12306网站很难做吗/广告网站留电话不用验证码
1 doctype写完整<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 IE请使用标准模式转载于:https://www.cnblogs.com/sunzhihua/p/8425282.html...
辽宁平台网站建设平台/百度网盘资源搜索引擎
题目:原题链接(困难) 标签:SQL 解法时间复杂度空间复杂度执行用时Ans 1 (Python)450ms (5.06%)Ans 2 (Python)Ans 3 (Python) 解法一: SELECT T.product_id,P.product_name,T.report_year,T.total_amount FROM (SEL…...
邯郸小程序定制开发/公司网站seo外包
插入排序,就是将数组中的一个个元素插入到已经排好序的数组中. 代码实现: public static void insertSort2(int[] arr){//从第二个元素开始,往前依次比较相邻的两个元素,如果后面的比前面的元素大,则直接终止此次循环.这样可以节省比较次数.for (int i 1; i < arr.length; …...
福州网签查询系统/网络推广与优化
我在国庆期间将公司的oracle 8i数据库升级到10G 64,升级完成之后发现Sysaux Tablespace 的Datafile竟然没有.原来是我在升成Control File时用的Datafile list是我在升级之前导出来的,没有将升级过程中生成的新的Tablespace Sysaux 的Datafile加进List中去造成的.我在之前的多次…...
建设婚恋网站/北京seo外包 靠谱
这是一个简单的jQuery代码段,每次加载时都会在您的网页上显示随机引用。 这对于在每次加载网页时显示不同的推荐信很有用,每次都会显示一个新的推荐信。 var a Math.random() "" var rand1 a.charAt(5) quotes new Array quotes[1] "…...