Linux平台-数据库技术
日常处理数据库相关工作
- Mysql主从复制,ip地址变化后的处理
- MySQL中对数据库表按月进行水平分区
- 查看Mysql数据库各张表的信息
- 查看Mysql数据库表的分区情况
- Mysql主从复制,延迟从库
- 在 Ubuntu 20.04 上将 MySQL 替换为 MariaDB
- oceanbase单机离线部署
- OceanBase 数据备份与恢复
Mysql主从复制,ip地址变化后的处理
在 Ubuntu 14.04 + MySQL 5.5 的环境下,如果两台虚拟服务器的 IP 地址发生变化,主从复制可能会失效,因为 MySQL 复制配置通常依赖于 IP 地址或主机名。因此,需要手动调整配置并重新建立主从复制。以下是详细步骤:
1. 确认新的 IP 地址
在两台服务器上执行以下命令,获取新的 IP 地址:
ip a
假设:
主服务器 (Master) 新 IP:192.168.1.100
从服务器 (Slave) 新 IP:192.168.1.101
2. 修改 MySQL 主从配置
(1)修改 Master 配置
编辑 MySQL 配置文件:
sudo vi /etc/mysql/my.cnf
检查或添加以下内容:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = your_database # 需要复制的数据库
bind-address = 192.168.1.100 # 修改为新 IP
然后重启 MySQL:
sudo service mysql restart
在 MySQL 主服务器上,重新授权从服务器访问:
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'192.168.1.101' IDENTIFIED BY 'your_password';
FLUSH PRIVILEGES;
(2)修改 Slave 配置
编辑从服务器的 MySQL 配置:
sudo vi /etc/mysql/my.cnf
修改以下内容:
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
replicate-do-db = your_database # 需要复制的数据库
bind-address = 192.168.1.101 # 修改为新 IP
然后重启 MySQL:
sudo service mysql restart
3. 重新配置 Slave
登录从服务器的 MySQL:
mysql -u root -p
停止复制:
STOP SLAVE;
重设主服务器信息:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='replica_user',
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 请使用 SHOW MASTER STATUS 查看的最新 binlog 文件
MASTER_LOG_POS=107; -- 请使用 SHOW MASTER STATUS 查看的最新 Position
启动复制:
START SLAVE;
4. 检查主从同步状态
在从服务器上执行:
SHOW SLAVE STATUS\G
关键检查项:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0(或接近 0)
如果 Slave_IO_Running 或 Slave_SQL_Running 不是 Yes,可以查看 Last_Error 进行排查。
5. 设置主机名绑定(可选,防止 IP 变更问题)
如果 IP 可能再次变动,建议使用主机名代替 IP 地址:
在 /etc/hosts 文件中添加:
192.168.1.100 mysql-master
192.168.1.101 mysql-slave
在 MySQL 的 CHANGE MASTER TO 语句中使用 mysql-master 代替 IP。
总结
确认新的 IP 地址,并修改 MySQL 配置文件。
重新授权从服务器的访问权限。
在 Slave 端重新配置 CHANGE MASTER TO。
启动 Slave 并检查同步状态。
(可选)使用主机名绑定,避免 IP 变更影响。
这样,你的 MySQL 5.5 主从复制应该可以恢复正常运行。
实际操作案例,仅配置从服务器:
当你的 MySQL 主服务器 IP 从 192.168.18.27
更改为 192.168.6.27
后,为了确保主从复制继续正常工作,你需要在从服务器上重新配置复制源的主机地址。下面是操作步骤:
✅ 修改主从复制配置的正确步骤
1. 停止从服务器复制线程
在从服务器上执行:
STOP SLAVE;
2. 修改主服务器地址
重新设置主服务器的 IP 地址(注意保留之前获取的 MASTER_LOG_FILE
和 MASTER_LOG_POS
信息):
CHANGE MASTER TO
MASTER_HOST='192.168.6.27',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='Passw0rd',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=867,
GET_MASTER_PUBLIC_KEY=1;
✅ 说明:
-
GET_MASTER_PUBLIC_KEY=1
是 MySQL 8+ 的特性,MySQL 5.x 不需要。 -
如果你使用的是 MySQL 5.5 / 5.6,忽略
GET_MASTER_PUBLIC_KEY=1
。
3. (可选)保留原来的延迟设置(如果需要)
CHANGE MASTER TO MASTER_DELAY = 3600;
4. 重新启动复制
START SLAVE;
5. 验证从服务器状态
SHOW SLAVE STATUS\G;
重点查看以下字段:
-
Slave_IO_Running: Yes
-
Slave_SQL_Running: Yes
-
Seconds_Behind_Master: 0
或正值
🔁 如有主服务器绑定了 IP,记得确认监听地址
如果主服务器上 MySQL 绑定了旧 IP,确保它现在绑定的是 0.0.0.0
或 192.168.6.27
:
编辑主服务器 /etc/mysql/my.cnf
或 /etc/my.cnf
中的 bind-address
:
bind-address = 0.0.0.0
然后重启 MySQL 服务:
sudo systemctl restart mysql
如有其它限制(如防火墙、iptables、主从网段隔离等),请确保从服务器能正常连接到 192.168.6.27:3306
。
MySQL中对数据库表按月进行水平分区
要在 MySQL 5.5 中对数据库 shunsync 的表 sl_history_data 按月进行水平分区,基于类型为 DATE 的字段 time,你可以按照以下步骤来完成设置。
1. 进入数据库
首先,进入 shunsync 数据库:
sql
USE shunsync;
2. 创建分区表
假设表 sl_history_data 还未创建,我们可以创建表时通过 PARTITION BY RANGE 来按月份对 time 字段进行分区。具体 SQL 语句如下:
sql
CREATE TABLE sl_history_data (
id INT NOT NULL,
time DATE NOT NULL,
data VARCHAR(255),
PRIMARY KEY (id, time)
)
PARTITION BY RANGE (YEAR(time) * 100 + MONTH(time)) (
PARTITION p202301 VALUES LESS THAN (202302),
PARTITION p202302 VALUES LESS THAN (202303),
PARTITION p202303 VALUES LESS THAN (202304),
PARTITION p202304 VALUES LESS THAN (202305),
PARTITION p202305 VALUES LESS THAN (202306),
PARTITION p202306 VALUES LESS THAN (202307),
PARTITION p202307 VALUES LESS THAN (202308),
PARTITION p202308 VALUES LESS THAN (202309),
PARTITION p202309 VALUES LESS THAN (202310),
PARTITION p202310 VALUES LESS THAN (202311),
PARTITION p202311 VALUES LESS THAN (202312),
PARTITION p202312 VALUES LESS THAN (202401)
);
解释:
PARTITION BY RANGE:使用 YEAR(time) * 100 + MONTH(time) 公式将日期转化为整数值,以便按范围进行分区。
PARTITION p202301 等分区:每个分区存储一整个月的数据,比如 p202301 存储 2023 年 1 月的数据,VALUES LESS THAN (202302) 表示截止到 2023 年 2 月 1 日之前的数据都放入 p202301 分区中。
PRIMARY KEY:主键包括 id 和 time,因为分区表要求主键或唯一键必须包含分区字段。
3. 如果表已存在,需要修改表结构
如果表 sl_history_data 已经存在,可以使用 ALTER TABLE 命令将其修改为分区表。首先,需要确保表没有现存的外键约束,然后对表进行分区:
sql
ALTER TABLE sl_history_data
PARTITION BY RANGE (YEAR(time) * 100 + MONTH(time)) (
PARTITION p202301 VALUES LESS THAN (202302),
PARTITION p202302 VALUES LESS THAN (202303),
PARTITION p202303 VALUES LESS THAN (202304),
PARTITION p202304 VALUES LESS THAN (202305),
PARTITION p202305 VALUES LESS THAN (202306),
PARTITION p202306 VALUES LESS THAN (202307),
PARTITION p202307 VALUES LESS THAN (202308),
PARTITION p202308 VALUES LESS THAN (202309),
PARTITION p202309 VALUES LESS THAN (202310),
PARTITION p202310 VALUES LESS THAN (202311),
PARTITION p202311 VALUES LESS THAN (202312),
PARTITION p202312 VALUES LESS THAN (202401)
);
4. 插入数据
当你插入数据时,MySQL 会根据 time 字段的值自动将数据放入对应的分区。例如:
sql
INSERT INTO sl_history_data (uid, time, attr, value)
VALUES ('653b0d8cb23ec96d1146dea8', '2024-10-15 1:01:59', 'noise', '88.888888'),
('653b0d8cb23ec96d1146dea8', '2024-10-15 3:08:59', 'pm2_5', '66.888888'),
('653b0d8cb23ec96d1146dea8', '2024-10-15 5:02:59', 'precipitation', '99.888888');
INSERT INTO sl_history_data (time, attr, value)
VALUES ('2024-10-15 1:01:59', 'noise', '88.888888'),
('2024-10-15 3:08:59', 'pm2_5', '66.888888'),
('2024-10-15 5:02:59', 'precipitation', '99.888888');
DELETE FROM sl_history_data
WHERE time BETWEEN '2024-10-14 00:00:00' AND '2024-10-15 23:59:59';
5. 查询分区数据
查询时,MySQL 只会扫描相关分区的数据,查询效率更高。例如:
sql
SELECT * FROM sl_history_data WHERE time BETWEEN '2023-02-01' AND '2023-02-28';
这个查询只会访问 p202302 分区,忽略其他分区,从而提升性能。
6. 动态管理分区
select TABLE_SCHEMA,TABLE_NAME,PARTITION_NAME,TABLE_ROWS from information_schema.partitions where table_name='sl_history_data';
在 MySQL 中,要查看现有分区的详细信息,包括 VALUES LESS THAN 后面的值,可以通过 SHOW CREATE TABLE 命令来查看表的分区定义。这个命令将展示表的创建语句,包括分区的详细信息。
SHOW CREATE TABLE sl_history_data;
每当进入新的月份,可以使用 ALTER TABLE 命令动态添加新的分区。例如,添加 2024 年 1 月的分区:
sql
SHOW CREATE TABLE sl_history_data;
ALTER TABLE sl_history_data
ADD PARTITION (
PARTITION p108 VALUES LESS THAN ('2026-01-01') ENGINE = InnoDB
);
同样,如果需要删除旧分区(比如删除 2023 年 1 月的数据),可以执行:
ALTER TABLE sl_history_data
DROP PARTITION p202301;
总结
MySQL 5.5 支持基于 DATE 字段的范围分区,通过 YEAR() 和 MONTH() 函数可以实现按月分区的功能。
动态添加或删除分区可以方便地管理不断变化的数据量。
查看Mysql数据库各张表的信息
SELECT table_name, data_length + index_length AS len, table_rows,
CONCAT(ROUND((data_length + index_length)/1024/1024,2),'MB') AS datas
FROM information_schema.tables
WHERE table_schema = '数据库名'
ORDER BY len DESC;
查看Mysql数据库表的分区情况
select TABLE_SCHEMA,TABLE_NAME,PARTITION_NAME,TABLE_ROWS from information_schema.partitions where table_schema = 'shunsync' and table_name='sl_history_data';
Mysql主从复制,延迟从库
1、主从节点开启log_bin,配置文件中移除 skip-log-bin 配置项
2、增加主从复制配置 [mysqld]
a、主节点
vi /etc/my.cnf
server-id = 1
log-bin = /home/shuncom/mysql/data/mysql-bin
binlog_cache_size = 4M
binlog_format = mixed
max_binlog_cache_size = 8M
max_binlog_size = 512M
expire_logs_days = 14
gtid_mode = ON
enforce_gtid_consistency = ON
重启mysql服务
systemctl restart mysqld.service
b、从节点
vi /etc/my.cnf
server-id = 2
slave-skip-errors=1007,1022,1050,1062,1169
relay-log=/home/shuncom/mysql/data/relay-log
max_relay_log_size=512M
relay-log-purge=ON
read-only
gtid_mode = ON
enforce_gtid_consistency = ON
重启mysql服务
systemctl restart mysqld.service
3、创建主从复制账户
a、以root登录主节点
mysql -u root -p'Sz_clighting'
b、创建复制用户(用户名、密码为示例),并授予权限
CREATE USER 'replicator'@'%' IDENTIFIED BY 'Passw0rd';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS\G; -- 获取 MASTER_LOG_FILE、MASTER_LOG_POS
4、从节点开启复制
a、以root用户登录从节点
mysql -u root -p'Sz_clighting'
b、开启复制
CHANGE MASTER TO
MASTER_HOST='172.17.20.17',
MASTER_PORT=3306,
MASTER_USER='replicator',
MASTER_PASSWORD='Passw0rd',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=868,
get_master_public_key=1;
CHANGE MASTER TO MASTER_DELAY = 3600;
START SLAVE;
SHOW SLAVE STATUS\G;
在 Ubuntu 20.04 上将 MySQL 替换为 MariaDB
在 Ubuntu 20.04 上将 MySQL 替换为 MariaDB 的过程相对简单,但需要谨慎操作以确保数据不丢失。以下是详细的步骤:
1. 备份 MySQL 数据库
在任何升级或替换操作之前,务必备份数据。使用以下命令备份所有数据库:
mysqldump -u root -p --all-databases > /path/to/backup/all_databases.sql
2. 卸载 MySQL
首先,停止 MySQL 服务:
sudo systemctl stop mysql
卸载 MySQL:
sudo apt-get remove --purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*
删除 MySQL 配置和数据目录(注意:此操作会删除数据库文件,请确保你已经备份):
sudo rm -rf /etc/mysql /var/lib/mysql
删除 MySQL 相关的库和依赖:
sudo apt-get autoremovesudo apt-get autoclean
3. 安装 MariaDB
现在你可以安装 MariaDB。MariaDB 作为 MySQL 的兼容替代品,它的安装和配置与 MySQL 非常相似。
首先,更新包列表:
sudo apt-get update
安装 MariaDB:
sudo apt-get install mariadb-server mariadb-client
安装后,MariaDB 将自动启动,你可以通过以下命令检查其状态:
sudo systemctl status mariadb
4. 确保 MariaDB 自动启动
如果 MariaDB 没有自动启动,手动启用它:
sudo systemctl enable mariadb
5. 恢复数据库(如果有备份)
如果你之前备份了 MySQL 数据库,可以通过以下命令将其恢复到 MariaDB:
mysql -u root -p < /path/to/backup/all_databases.sql
6. 检查 MariaDB 配置
MariaDB 的配置文件位于 /etc/mysql/mariadb.conf.d/ 目录下。通常可以使用默认配置,但如果你需要自定义配置,修改相关的配置文件即可。
7. 确认 MariaDB 是否正常工作
运行以下命令连接 MariaDB:
sudo mysql -u root -p
然后,你可以通过以下 SQL 命令检查数据库是否恢复成功:
SHOW DATABASES;
8. 调整 MySQL/MariaDB 数据目录(可选)
如果你在安装 MariaDB 时指定了与 MySQL 不同的数据目录,确保 MariaDB 的数据文件路径与之前的 MySQL 数据路径一致。否则,你需要在 MariaDB 配置文件(如 /etc/mysql/mariadb.conf.d/50-server.cnf)中进行调整。
9. 调整客户端工具配置(如果需要)
如果你在使用 MySQL 客户端工具(如 mysqladmin、mysqldump 等),它们在 MariaDB 中应该也能正常工作,但有些配置可能需要调整,特别是在脚本中使用的参数。
10. 清理无用的包
最后,清理系统中不再需要的包和依赖:
sudo apt-get autoremovesudo apt-get autoclean
总结:
通过上述步骤,你可以轻松地将 Ubuntu 20.04 上的 MySQL 换成 MariaDB。MariaDB 完全兼容 MySQL,因此在大多数情况下,迁移后你的应用程序无需任何修改。如果在迁移过程中遇到问题,检查 MariaDB 的日志文件 /var/log/mysql/error.log 或 /var/log/mariadb/mariadb.log,这些文件将帮助你诊断潜在的错误。
oceanbase单机离线部署
基于all-in-one安装包
部署前先对系统参数进行修改,参照“附”部分
可建一个专门的用户进行数据库部署,与运维用的shuncom账号区分,创建用户与组时,指定UID(适配NFS部署逻辑,即用相同的用户部署NFS)
一、解压并安装
tar -xzvf oceanbase-all-in-one-*.tar.gz
cd oceanbase-all-in-one/bin/
./install.sh
source ~/.oceanbase-all-in-one/bin/env.sh
cd ~
sudo cp oceanbase-all-in-one/obclient/u01/obclient/bin/mysqldump /usr/bin
二、配置OBD
1、禁用远程仓库
obd mirror disable remote
2、将安装包添加至本地镜像
obd mirror clone *.rpm
3、查看本地镜像中安装包列表
obd mirror list local
4、配置文件替换
sudo cp mini-single-example.yaml /home/shuncom/.oceanbase-all-in-one/obd/usr/obd/example
三、部署 OceanBase 数据库
1、deploy oceanbase
obd cluster deploy obstandalone -c mini-single-example.yaml
2、启动集群(只有一个节点)
obd cluster start obstandalone
启动并初始化完成示意结果如下:
数据库客户端(obclient)访问示例(访问本机可不带-h参数):
obclient -h192.168.30.97 -P3306 -uroot -p
3、修改root密码
obd cluster edit-config obstandalone
修改 global 下的root_password: Sz_clighting
obd cluster reload obstandalone
4、租户及资源分配(a、b两类方式选一)
a. 修改sys租户配置规格(CPU、内存规格按配置修改)
进入 控制台 obclient -P3306 -uroot -p
ALTER RESOURCE UNIT sys_unit_config MAX_CPU 4, MIN_CPU 4, MEMORY_SIZE '4G', LOG_DISK_SIZE '20G';
b. 创建用户租户shuncom
# 该命令默认根据集群剩余全部可用资源创建租户
obd cluster tenant create obstandalone -n shuncom
# 查看租户列表信息
obd cluster tenant show obstandalone
# 新建租户的root用户默认是无密码,需要修改密码
obclient -P3306 -uroot@shuncom
ALTER USER 'root'@'%' IDENTIFIED BY 'Sz_clighting';
5、重启服务
obd cluster restart obstandalone
附:
1、修改系统参数
echo -e "* soft nproc 655350\n* hard nproc 655350" >> /etc/security/limits.d/nproc.conf
echo -e "* soft nofile 655350\n* hard nofile 655350" >> /etc/security/limits.d/nofile.conf
echo -e "* soft stack unlimited\n* hard stack unlimited" >> /etc/security/limits.d/stack.conf
2、修改虚拟内存参数、IO参数
echo "vm.max_map_count=655360" >> /etc/sysctl.conf
echo "vm.overcommit_memory=0" >> /etc/sysctl.conf
echo "fs.aio-max-nr=1048576" >> /etc/sysctl.conf
sysctl -p