mysql运维

一: 备份 #

1: 备份内容 #

  • 数据 (数据文件或文本格式数据)

  • 操作日志(binlog) (数据库变更日志)

2:冷备份与热备份 #

  • 冷备份 (关闭数据库服务,完整拷贝数据文件)

  • 热备份 (在不影响数据库读写服务的情况下备份数据库)

3:本地备份与远程备份 #

  • 本地备份 (在数据库服务器本地进行备份)

  • 远程备份 (远程连接数据库进行备份)

4:全量备份与增量备份 #

  • 全量备份 (备份完整的数据库)

  • 增量备份 (只备份上一次备份以来发生修改的数据)

5:备份周期 #

  • 考虑因素:
  • 数据库大小(决定备份时间)
  • 恢复速度要求(快速or慢速)
  • 备份方式(全量or增量)

6:常用工具及用法 #

  • mysqldump - 逻辑备份,热备
  • xtrabackup - 物理备份, 热备
  • Lvm/zfs snapshot - 物理备份
  • mydumper - 逻辑备份,热备
  • cp - 物理备份,冷备

常用工具及用法 - mysqldump #

  • 逻辑备份
-- 备份全部数据库的数据库结构
mysqldump -h localhost -p3307 -uroot  -p123456 -A >  D:\data\databases\mysql\mysql_all_2023-09-02.sql
mysqldump -h localhost -p3307 -uroot  -p123456 -A -d >  D:\data\mysql_all.sql

-- 备份全部数据库的数据和结构
mysqldump -h localhost -p3307 -uroot  -p123456 -A >  D:\data\mysql_all_2.sql
mysqldump -h localhost -p3307 -uroot  -p123456 -A >  D:\data\databases\mysql\mysql_all_data_2023-09-02.sql

-- 备份单个数据库的结构和数据
mysqldump -h localhost -p3307 -uroot  -p123456 --databases test3  >  D:\data\test3_all.sql

-- 备份单个数据库的结构(当你需要备份结构和数据同时的时候移除-d 参数即可)
mysqldump -h localhost -p3307 -uroot  -p123456 --databases test3 -d >  D:\data\test3_all_1.sql

-- 备份单个数据库的数据
mysqldump -h localhost -p3307 -uroot  -p123456 --databases test3 -t >  D:\data\test3_data_1.sql
mysqldump -h 127.0.0.1 -p3307 -uroot  -p123456 --databases test3  >  D:\data\databases\mysql\2023-09-02_x_test3.sql

-- 备份多个数据库的数据  (貌似无法备份指定端口和主机的数据)
mysqldump -u root -p123456 --databases mybatis-plus shard-jdbc-slave > D:\data\databases\mysql\2023-09-02_shard-jdbc-slave_mybatis-plus_3306.sql


-- 备份单个数据库的结构
mysqldump -h localhost -p3307 -uroot  -p123456  test3 -d >  D:\data\test3_jiegou.sql

-- 备份单个数据库的结构和数据
mysqldump -h localhost -p3307 -uroot  -p123456 --databases test3 > D:\data\test3.sql

-- 登录数据库
mysql -h localhost -p3307 -uroot  -p123456

-- 备份单个数据库数据 生成环境

mysqldump --column-statistics=0 -h 192.168.2.206 -p3306 -uroot  -p123456 --databases pmcc_acc  >  E:\data\sql\pmcc_acc_all.sql


7:主从复制 #

要求 #

主从复制必须满足一定的条件的 当你随便按照某种写法设置了很可能压根没达到要求

  • 主从配置需要注意的点

    • 主从服务器操作系统版本和位数一致;
    • Master 和 Slave 数据库的版本要一致;
    • Master 和 Slave 数据库中的数据要一致;
    • Master 开启二进制日志, Master 和 Slave 的 server_id 在局域网内必须唯一;
  • MySQL 主从复制(也称 A/B 复制) 的原理

    • Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件, 这些记录叫做二进制日志事件(binary log events);
    • Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志(relay log);
    • Slave 重做中继日志中的事件, 把中继日志中的事件信息一条一条的在本地执行一次,完 成数据在本地的存储, 从而实现将改变反映到它自己的数据(数据重放)。

主从配置的简要步骤

  • Master 上的配置

    • 安装数据库;
    • 修改数据库配置文件, 指明 server_id, 开启二进制日志(log-bin);
    • 启动数据库, 查看当前是哪个日志, position 号是多少;
    • 登录数据库, 授权数据复制用户(IP 地址为从机 IP 地址, 如果是双向主从, 这里的还需要授权本机的 IP 地址, 此时自己的 IP 地址就是从 IP 地址);
    • 备份数据库(记得加锁和解锁);
    • 传送备份数据到 Slave 上;
    • 启动数据库;
  • Slave 上的配置

    • 安装数据库;
    • 修改数据库配置文件, 指明 server_id(如果是搭建双向主从的话, 也要开启二进制 日志 log-bin);
    • 启动数据库, 还原备份;
    • 查看当前是哪个日志, position 号是多少(单向主从此步不需要, 双向主从需要);
    • 指定 Master 的地址、 用户、 密码等信息;
    • 开启同步, 查看状态。

第一种 #

主mysql #

  • 配置
[mysqld]
# skip-grant-tables 暂时注释了 容易引起 mysql服务启动后立马关闭 这个错误
# 设置3306端口
port=3306

# 自定义设置mysql的安装目录,即解压mysql压缩包的目录
# 切记此处一定要用双斜杠\\,单斜杠这里会出错。
basedir=D:\CS\databases\mysql-8.0.27-winx64

# 自定义设置mysql数据库的数据存放目录
datadir=D:\CS\databases\mysql-8.0.27-winx64\\data

# 允许最大连接数
max_connections=200

# 允许连接失败的次数,这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10

# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4


# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password



#要同步的数据库 binlog-do-db:指定mysql的binlog日志记录哪个db
binlog-do-db=shard-jdbc-master

# 设置 MySQL 服务器的唯一标识符  mysql同步的数据中是包含server-id的,用于标识该语句最初是从哪个server写入的,因此server-id一定要有的
server-id = 1
# 开启主库的binlog日志
log-bin = mysql-bin
#屏蔽系统库同步
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

[client]
# 设置mysql客户端连接服务端时默认使用的端口和默认字符集
port=3306
default-character-set=utf8mb4
  • 命令
-- 授权主备复制专用账号
-- 创建用户 前面db_sync是用户名后面的db_sync是密码
CREATE USER 'db_sync'@'%' IDENTIFIED BY 'db_sync'; 

-- 查看用户
select user,host from mysql.user;

-- 权限赋予
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' ;

-- 刷新权限

FLUSH PRIVILEGES;

-- 确认位点 记录下文件名以及位点
show master status;

从mysql #

  • 配置
[mysqld]
# skip-grant-tables 暂时注释了 容易引起 mysql服务启动后立马关闭 这个错误
# 设置3309端口
port=3309

# 自定义设置mysql的安装目录,即解压mysql压缩包的目录
# 切记此处一定要用双斜杠\\,单斜杠这里会出错。
basedir=D:\CS\databases\mysql-8.0.27-slave

# 自定义设置mysql数据库的数据存放目录
datadir=D:\CS\databases\mysql-8.0.27-slave\\data

# 允许最大连接数
max_connections=200

# 允许连接失败的次数,这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10

# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4


# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password



#屏蔽系统库同步
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema

#开启日志
log-bin=mysql-bin
#设置服务id,主从不能一致
# 设置 MySQL 服务器的唯一标识符  mysql同步的数据中是包含server-id的,用于标识该语句最初是从哪个server写入的,因此server-id一定要有的
server-id = 2
#设置需要同步的数据库
replicate_wild_do_table=shard-jdbc-master.%
#屏蔽系统库同步
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

[client]
# 设置mysql客户端连接服务端时默认使用的端口和默认字符集
port=3309
default-character-set=utf8mb4
  • 命令
#先停止同步
STOP SLAVE;


#修改从库指向到主库,使用上一步记录的文件名以及位点
CHANGE MASTER TO
master_host = 'localhost',
master_user = 'db_sync',
master_password = 'db_sync',
master_log_file = 'mysql-bin.000001',
master_log_pos = 654363;


#启动同步
START SLAVE;


#查看从库状态Slave_IO_Runing和Slave_SQL_Runing都为Yes说明同步成功,如果不为Yes,请检查error_log,然后排查相关异常。
show slave status ;
stop slave

#master服务器的ip地址
CHANGE MASTER TO master_host ='localhost',
#第5步中创建的账号
master_user ='db_sync',
#第5步中创建的密码
master_password ='db_sync',
#上一步中的File
master_log_file ='mysql-bin.000004',
#上一步中的Position
master_log_pos = 525,
get_master_public_key=1;

start slave ;

#查看从库状态Slave_IO_Runing和Slave_SQL_Runing都为Yes说明同步成功,如果不为Yes,请检查error_log,然后排查相关异常。
show slave status ;

第二种 #

主mysql #

  • 配置
[mysqld]
# skip-grant-tables 暂时注释了 容易引起 mysql服务启动后立马关闭 这个错误
# 设置3307端口
port=3307

# 自定义设置mysql的安装目录,即解压mysql压缩包的目录
# 切记此处一定要用双斜杠\\,单斜杠这里会出错。
basedir=D:\CS\databases\mysql_8.027

# 自定义设置mysql数据库的数据存放目录
datadir=D:\CS\databases\mysql_8.027\\data

# 允许最大连接数
max_connections=200

# 允许连接失败的次数,这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10

# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4


# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION


# 开启慢sql

slow_query_log=ON

# 慢sql存的地址

slow_query_log_file=D:\CS\databases\mysql_8.027\log\slow.log

# 会记录没有使用索引的查询sql,但前提是必须开启 slow_query_log='ON'

log-queries-not-using-indexes =on

# 超过10秒则属于慢SQL,慢查询时间,这里为10秒,超过10秒会被记录

long_query_time=10
# 查询日志,开启对所有执行语句进行记录

general_log=on

# 查询日志,存放位置

general_log_file=D:\CS\databases\mysql_8.027\log\query.log

# 查询日志,文件中的时间显示已系统时间为准

log_timestamps = SYSTEM

server-id = 3
# 开启主库的binlog日志
log-bin=mysql-bin
#屏蔽系统库同步
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema

#要同步的数据库 binlog-do-db:指定mysql的binlog日志记录哪个db
binlog-do-db=chinese


[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

[client]
# 设置mysql客户端连接服务端时默认使用的端口和默认字符集
port=3307
default-character-set=utf8mb4
  • 命令

-- 授权主备复制专用账号
-- 创建用户 前面repl_xx_gongsi是用户名后面的xx_gongsi_master_123456是密码
CREATE USER 'repl_xx_gongsi'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'xx_gongsi_master_123456';


-- 查看用户
select user,host from mysql.user;


-- 权限赋予
GRANT REPLICATION SLAVE ON *.* TO 'repl_xx_gongsi'@'127.0.0.1';


-- 刷新权限

FLUSH PRIVILEGES;

-- 确认位点 记录下文件名以及位点
show master status;

从mysql #

[mysqld]
# skip-grant-tables 暂时注释了 容易引起 mysql服务启动后立马关闭 这个错误
# 设置3308端口
port=3308

# 自定义设置mysql的安装目录,即解压mysql压缩包的目录
# 切记此处一定要用双斜杠\\,单斜杠这里会出错。
basedir=D:\CS\databases\mysql_8.027_3308_slave

# 自定义设置mysql数据库的数据存放目录
datadir=D:\CS\databases\mysql_8.027_3308_slave\\data

# 允许最大连接数
max_connections=200

# 允许连接失败的次数,这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10

# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4


# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION


# 开启慢sql

slow_query_log=ON

# 慢sql存的地址

slow_query_log_file=D:\CS\databases\mysql_8.027_3308_slave\log\slow.log

# 会记录没有使用索引的查询sql,但前提是必须开启 slow_query_log='ON'

log-queries-not-using-indexes =on

# 超过10秒则属于慢SQL,慢查询时间,这里为10秒,超过10秒会被记录

long_query_time=10
# 查询日志,开启对所有执行语句进行记录

general_log=on

# 查询日志,存放位置

general_log_file=D:\CS\databases\mysql_8.027_3308_slave\log\query.log

# 查询日志,文件中的时间显示已系统时间为准

log_timestamps = SYSTEM

server-id = 4
#屏蔽系统库同步
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=sys.%
#设置需要同步的数据库
replicate_wild_do_table=chinese.%


[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

[client]
# 设置mysql客户端连接服务端时默认使用的端口和默认字符集
port=3308
default-character-set=utf8mb4
  • 命令
#先停止同步
STOP SLAVE;

#修改从库指向到主库,使用上一步记录的文件名以及位点

CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_USER='repl_xx_gongsi',
master_port = 3307,
MASTER_PASSWORD='xx_gongsi_master_123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=1099;

#启动同步
START SLAVE;

#查看从库状态Slave_IO_Runing和Slave_SQL_Runing都为Yes说明同步成功,如果不为Yes,请检查error_log,然后排查相关异常。
show slave status ;