前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql搭建注意事项

mysql搭建注意事项

原创
作者头像
Joseph_青椒
发布2023-08-06 12:00:01
1730
发布2023-08-06 12:00:01
举报
文章被收录于专栏:java_josephjava_joseph

说明

这篇文章主要面向实战,因为平时搭建mysql场景很少,包括主从搭建,等问题,所以在这里写一个工具集,方便后续使用,大家也可用参考。

注:这里采用docker部署,平时也一直用的docker,未来也是趋势,所以采用的docker

mysql的搭建

#opt目录是Linux提供我们扩展的目录,可以存放用户需求的文件 mkdir -p /opt/datas/docker/mysql/conf mkdir -p /opt/datas/docker/mysql/data

配置文件

vim /opt/datas/docker/mysql/conf/my.cnf 放下面这些

代码语言:javascript
复制
[client]
?
#socket = /usr/mysql/mysqld.sock
?
default-character-set = utf8mb4
?
[mysqld]
?
#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
#socket = /usr/mysql/mysqld.sock
#pid-file = /usr/mysql/mysqld.pid
lower_case_table_names=1
datadir = /opt/datas/docker/mysql/data
character_set_server = utf8mb4
collation_server = utf8mb4_bin
secure-file-priv= NULL
?
# Disabling symbolic-links is recommended to prevent assorted security risks
?
symbolic-links=0
?
# Custom config should go here
?
!includedir /etc/mysql/conf.d/
?
?

run容器

代码语言:javascript
复制
docker run \
--name lhc_mysql \
--restart=unless-stopped \
-it -p 3306:3306 \
-v /opt/datas/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/datas/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your password> \
-e lower_case_table_names=1 \
-d mysql:8.0
?
?

这两处是解决大小写敏感问题的地方

image-20230721125802476
image-20230721125802476

进入容器

docker exec -it 容器id /bin/bash;

mysql -uroot -p;

这里开放连接权限 use mysql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码'; flush privileges;

这里开放权限,让程序能连上,mysql8.0以后需要这样做,这就是标准的配置mysql8.0的过程。

这里有必要讲一下存储文件在两大引擎的区别,

先说一下,innoDB和myIsam的区别

最大的区别就是事物,innoDB支持事物,而myIsam不支持,另外只有innoDB支持外键

然后就是索引和锁的差异

innoDB是聚簇索引,myIsam是非聚簇索引 innoDB支持行锁,而innoDB只支持表锁,因此并发处理能力innoDB更好

并发处理能力方面,innoDB通过mvcc来达到高的并发

还有innoDB不支持全文索引和count(*)

最后就是数据文件的差异了

这个会取决于mysql的版本,这里着重说一下

image-20230721125920179
image-20230721125920179

注意,是对应持久化的路径,由于借用的云服务器,在这里不配置volume卷持久化,这里直接在docker中查看,

代码语言:javascript
复制
docker run -p 3307:3306 --name test_mysql_7 \
-e MYSQL_ROOT_PASSWORD=testmysql7 \
-d mysql:5.7

这里跑起来这个容器,1.5.7

再搞一个mysql8.0

代码语言:javascript
复制
docker run -p 3308:3306 --name test_mysql_8 \
-e MYSQL_ROOT_PASSWORD=testmysql8 \
-d mysql:8.0

这里搞两个不同引擎的表,分别放到两个节点里,他们统一放到test库里面

代码语言:javascript
复制
CREATE TABLE `in_user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
?
?
?
CREATE TABLE `my_user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
image-20230717111902863
image-20230717111902863

现在随便往里面先插入数据,四个表都插入

image-20230717112031436
image-20230717112031436

这是两个容器,

现在我们先进入5.7看下文件

image-20230717112708386
image-20230717112708386

可以看到,myslq5.7他们的表结构都是.frm文件,innoDB的.ibd文件存储着索引和数据信息

而myIsam的.MYI文件存储索引信息,.MYD文件存放数据data信息。

再来看mysql8.0

image-20230717113538563
image-20230717113538563

此时myIsam的表结构存储再.sdi文件中,而索引和数据文件仍然是MYI和MYD

而innoDB的索引和数据仍然是.idb文件,但是没有表结构的文件了

此时表结构存储在/var/lib/mysql/ibdata1 目录中,共享表空间,所有表的结构都在这里,

还有一个参数,

启用innodb_file_per_table选项时,InnoDB表会在磁盘上为每个表创建一个单独的.ibd文件来存储数据和索引

也就是我们看到的这个,默认是ON,若是关闭的话,我们连in_user.ibd都看不到了,都在这个文件里

这就是文件存储在两个引擎的差异。

mysql主从搭建

这个主从搭建目的就是为了做读写分离使用,在mysql调优篇章里提到了软优化中,读写分离的问题,那么读写分离是建立在主从搭建问题上的,既然是搭建主从,先回顾一下主从复制的流程原理

image-20230717120420695
image-20230717120420695

主库中有binlog,记录数据的变动,log dump线程将binlog推送到salve的io线程,io线程写入到Relaylog中继日志,从库slave再通过

SQL线程重放到数据库中。

代码语言:javascript
复制
#opt目录是Linux提供我们扩展的目录,可以存放用户需求的文件
mkdir -p /opt/datas/docker/mysql/conf
mkdir -p /opt/datas/docker/mysql/data
?
配置文件
?
vim /opt/datas/docker/mysql/conf/my.cnf
修改配置文件
?
?
然run容器
docker run \
--name lhc_mysql \
--restart=unless-stopped \
-it -p 3306:3306 \
-v /opt/datas/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/datas/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your password> \
-e lower_case_table_names=1 \
-d mysql:8.0
?

先回顾一下普通单节点的创建,我们目录格式是,/opt/datas/docker/mysql,持久化以及配置,发生再这里,而主从搭建,为了方便管理,

我们在这里也做了区分

主从节点创建

代码语言:javascript
复制
#创建目录
mkdir -p /opt/datas/docker/master/mysql
mkdir -p /opt/datas/docker/slave/mysql
?
#创建配置文件
touch /opt/datas/docker/master/mysql/my.cnf
touch /opt/datas/docker/slave/mysql/my.cnf
?
#部署主节点
?
docker run \
--name test_master_mysql \
--restart=unless-stopped \
-it -p 3307:3306 \
-v /opt/datas/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/datas/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your password> \
-e lower_case_table_names=1 \
-d mysql:8.0
?
#部署从节点
docker run \
--name test_slave_mysql \
--restart=unless-stopped \
-it -p 3308:3306 \
-v /opt/datas/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/datas/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=<your password> \
-e lower_case_table_names=1 \
-d mysql:8.0
    
?

现在直接执行上面的

这里做的是端口的区分,真实企业的话,端口3306,ip修改就可以了,具体的操作是一样的

配置文件设置

追加进去上面给的配置文件即可,

主节点

vim /opt/datas/docker/master/mysql/my.cnf

代码语言:javascript
复制
[mysqld]
# 开启 binlog, 可以不加,默认开启
log-bin=mysql-bin
?
# 选择 ROW 模式
binlog_format=row
?
#server_id不要和slaveId重复
server-id=1

从节点配置 vim /opt/datas/docker/slave/mysql/my.cnf

代码语言:javascript
复制
[mysqld]
# 开启 binlog, 可以不加,默认开启
log-bin=mysql-bin

# 选择 ROW 模式
binlog_format=row

#server_id不要和slaveId重复
server-id=2

这里是否会有疑问,就是原理讲,binlog是主库的,为啥从库也要配置,

答案是为了后续使用,有可能这个主库也是别人的从库!

这里说一下,是追加哈

image-20230721131643979
image-20230721131643979

下一步

重启服务

代码语言:javascript
复制
 docker restart test_slave_mysql

docker restart test_master_mysql

现在两个节点配好了,那么如何知道怎么访问,访问权限,访问谁呢,

看下一步配置

主节点提供从节点登录用户

给这个用户复制权限

进入主节点

docker exec -it test_master_mysql /bin/bash

mysql -uroot -p

代码语言:javascript
复制
-- 创建slave用户,这里%可以配置特定的ip,来实现白名单
CREATE USER 'joseph_canal'@'%';
-- 设置密码
ALTER USER 'joseph_canal'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123456';
-- 授予复制权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'joseph_salve'@'%';
-- 刷新权限
FLUSH PRIVILEGES;

从节点配置

确定主节点的binlog日志位置

去主节点执行

show master status\G

image-20230721133807592
image-20230721133807592

好,文件是这一个 mysql-bin.000004 position 是1095

从节点执行语句

代码语言:javascript
复制
change master to master_host='43.138.11.85', master_user='joseph_slave', master_password='123456789', master_port=3307, master_log_file='mysql-bin.000004', master_log_pos=1101, master_connect_retry=30;
image-20230721134627263
image-20230721134627263

开启主从同步

start slave;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • mysql的搭建
    • 这里有必要讲一下存储文件在两大引擎的区别,
    • mysql主从搭建
      • 主从节点创建
        • 配置文件设置
          • 主节点提供从节点登录用户
            • 从节点配置
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com