Mysql的多主一从相关配置参考之前的Blog,不再细述,下面主要是解决这次在树莓派上同步时所出现的问题,及解决方案。

在树莓派下安装Mysql服务,apt-get update & apt-get mysql-server

默认安装为5.5版本的Mysql。

修改/etc/mysql/my.cnf配置,创建两个新的实例,这里主要出现几个问题。

 

1.生成新的实例时使用--basedir路径导致找不到my_print_defaults

 

2.实例mysqld1无法运行,默认运行原本的实例,导致无法在指定目录下生成mysqld.sock。(最主要的问题

 

3.Mysql5.5运行实例不支持--config-file,出现找不到--config-file报错

 

 

第一个问题解决方案:

1、进入mysql安装目录,使用--basedir的相对路径

2、使用默认my.cnf下的--basedir    /usr/bin/mysql_install_db  --datadir=/home/mysql/data1/ --user=mysql

3、找到my_print_defaults,使用软链接如:

ln -s /usr/local/mysql/bin/my_print_defaults /usr/bin/
重新运行/usr/bin/mysql_install_db --basedir=/usr/bin --datadir=/home/mysql/data2/ --user=mysql

 

 

 

剩下的小问题均是由问题2引起,主要解决掉问题2,就可以了,在这也做一个小总结

刚刚开始以新建的实例1已成功运行,但是根据sock连接缺发现指定路径上不存在,mysqld.sock

查找mysqld.sock存在路径

find / -name mysqld.sock 找到该路径为:/run/mysqld/mysqld.sock

访问实例

/usr/bin/mysql -uroot -p123456 -P3306 -S /run/mysqld/mysqld.sock(这里是坑,我以为是新的实例1,其实并不是,而是默认的/var/lib/mysql
发现居然能用旧密码登录,登陆后开始进行同步,
slave stop;
CHANGE MASTER TO MASTER_HOST='104.168.26.50',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='q250305917',MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=107;
以上两句均为正常,但是slave start;时报错,抛出一个无法改变master状态的错误,
查询server_id,show variables like '%server_id%';  

  • +---------------+-------+
  • | Variable_name | Value |
  • +---------------+-------+
  • | server_id     |0     |
  • +---------------+-------+

发现service_id为0,其实也就说明了my.cnf上的实例1配置其实是无效的,只是我还是不死心,报有一线希望(当时并未发现启动的其实并非实例1)

通过sql语句修改全局server_id,SET GLOBAL server_id=20;再次运行slave start;成功。

但是问题来了,每次机器重启server_id都会被重置为0,导致无法同步。

试着查看service mysql stats(如实例1运行成功默认的将会被关闭)发现

● mysql.service - LSB: Start and stop the mysql database server daemon
Loaded: loaded (/etc/init.d/mysql)
Active: active (running) since Tue 2017-02-28 01:26:36 UTC; 2s ago
Process: 3400 ExecStart=/etc/init.d/mysql start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/mysql.service
├─775 /bin/sh /usr/bin/mysqld_safe
├─861 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/lib/mysql/raspberrypi.pid
└─862 logger -t mysqld -p daemon.error

WHAT THE FUCK?

默认的实例还在运行,这是什么鬼,终于找到问题所在

第二个问题的解决方案:

1、修改mysql.service运行的实例路径,--datadir指向实例1的路径

2、直接删除mysql.service,或禁止开机启动

3、修改my.cnf下实例1【mysqld1】socket,及pid-file为原本实例的路径/run/mysqld/

4、如果以上都不行,请直接走终极解决方案...创建实例3吧,或者如果有更好的方案,请告知,让我也学习学习

 

关闭默认实例service mysql stop;

运行实例一:/usr/bin/mysqld_multi --config-file=/etc/mysql/my.cnf start 1

报错:

Unknown option: config-file
Error with an option, see mysqld_multi --help for more info.

Mysql5.6以下不支持--config-file,使用--defaults-extra-file代替

 

第三个问题解决方案:

重新运行:/usr/bin/mysqld_multi --defaults-extra-file=/etc/mysql/my.cnf start 1

启动成功,登入实例1mysql -uroot -p -P3306 -S /run/mysqld/mysqld.sock查询server_id是否为my.cnf设置的值,

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 20 |
+---------------+-------+

正确,重新设置同步,成功。

 

此次总结告一段落,主要的坑还是问题2。