现在是 03-28 早上四点,刚刚结束了一波线上环境的数据库迁移,趁着热乎,把用到的技术做一个总结
设置 Mysql 数据目录
前言:
由于之前服务都是采用 AWS 的 RDS 服务,RDS 好是好,但是服务的成本过于的高,大概 1c1g 的机器一个月需要 500~1000 人民币,公司为了削减成本所以将 RDS 数据迁移到本地服务器。但是由于存储的数据有30多G,机器的 /root
目录不足以存储这么大的数据,所以需要进行 mysql 的 data 数据目录更改。
条件:
服务器:ubuntu 16.04
mysql:5.7.1
迁移步骤:
1、查看 data 目录
mysql> select @@datadir;
返回值:
Output
+-----------------+
| @@datadir |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)
2、迁移现有数据
停掉当前 mysql 服务
service mysql stop
复制 mysql data 数据(实例中,将数据复制到 /root/.mysql 目录下)
rsync -av /var/lib/mysql /root/.mysql
备份原有数据
mv /var/lib/mysql /var/lib/mysql.bak
3、修改 mysql 配置
vim /etc/mysql/mysql.conf.d/mysqld.cnf
将 datadir
修改为目标地址
...
datadir=/root/.mysql/mysql
...
4、修改别名
vim /etc/apparmor.d/tunables/alias
修改为如下:
alias /var/lib/mysql/ -> /root/.mysql/mysql/,
重启服务:
sudo systemctl restart apparmor
5、重置 data 目录&重启服务
sudo mkdir /var/lib/mysql/mysql -p
sudo systemctl start mysql
sudo systemctl status mysql
至上,我们就完成了 mysql data 数据的目录迁移,再也不会因为 /root
磁盘空间而担心了。
设置 Mysql 主从
前言:
为了方便演示,咱们这里采用 docker 为 mysql 环境
1、安装 mysql
docker pull mysql
docker run --name master-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:latest //主mysql
docker run --name slave-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 -d mysql:latest //从mysql
为了方便本机演示,我们使用 3307 端口表示主服务器,3308 端口表示从服务器
2、设置主服务器
由于 docker 里没有vim,所以需要安装 vim
apt update;apt install vim -y
2、1 设置服务 id 和开启日志
进入 docker 容器内 docker exec -it xxx /bin/bash
vim /etc/mysql/my.cnf
[mysqld]
server-id=100 # server 的id
log-bin=mysql-bin # log 文件名
修改完成后重启 mysql 服务,docker 容器可以直接重启容器服务即可 docker restart master-mysql
2、2 配置同步账号
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
上述命令中,新建了一个 slave 账号,同时允许所有ip访问
2、设置从服务器
2、1 设置从服务器配置
vim /etc/mysql/my.cnf
[mysqld]
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
上述配置中还可以设置需要同步的数据库、表,或忽略的数据库、表。
2、2 设置从数据账号
master-mysql:
mysql> show master status;
返回值中有 Position
需要将该值记下
获取 master 的ip:
docker inspect --format='{{.NetworkSettings.IPAddress}}' master-mysql
# 172.17.0.2
slave-mysql:
mysql> change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= "此处填写在 master 中的 Position 值", master_connect_retry=30;
2、3 开启同步&查看同步状态
开启同步:
mysql> start slave;
查看同步状态:
mysql> show slave status \G;
主要看:Slave_IO_Running
和 Slave_SQL_Running
,当出现问题时,可看 Slave_SQL_Running_State
具体错误解决
mysql> slave stop;
参考地址:
基于Docker的Mysql主从复制搭建
mysql设置主从同步
可能遇到问题:
MySQL主从同步异常问题解决Client requested master to start replication from position > file size