环境:
系统 centos EL6
mysql : 5.7.18
最近要给存储在mysql中大量的数据,做个从库,防止机器挂了,数据丢失。
安装
root账户
1 添加 MySQL Yum Repository
下载 MySQL Yum Repository http://dev.mysql.com/downloads/repo/yum/
2 安装 MySQL Yum Repository
yum localinstall mysql57-community-release-el6-{version-number}.noarch.rpm
当然如果是centos的其他环境,安装方法类似,只是install 后面的名称有变化。
3 选择正式发布的版本
yum repolist all | grep mysql
会列出所有的跟mysql相关的发布版本。包括是否是enable状态。并且可以更改其状态。
命令类似
yum-config-manager --disable mysql57-community
4 安装
yum install mysql-community-server
5 启动mysql服务
sudo service mysqld start
以上具体更详细内容见官网(参考文章中)。
安装完 mysql 后,还要进行些配置,如mysql 存储目录等,具体可见网上的资料。
2 重设密码
1 修改配置文件my.cnf, 在 [mysqld] 下面添加 skip-grant-tables
vim /etc/my.cnf
[mysqld]
skip-grant-tables
2 重启mysql
sudo service mysqld restart
or
sudo service mysqld stop
sudo service mysqld start
3 无密码登录 mysql shell
mysql -u root
4 重设密码
网上很多的方法建议直接
update MySQL.user set password=PASSWORD('新密码') where User='root';
但是行不通,
也有人建议使用 alter user
的方法,但是执行的时候会报错。需要重新加载grant tables。
执行命令进行加载
flush privileges;
然后重新设置密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
有人说不同版本只见使用的方法不一样。
有的执行:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
or
update MySQL.user set password=PASSWORD('新密码') where User='root';
then
flush privileges;
去掉之前在my.cnf中添加的配置。重启 mysql。
可参考后面的文章
主从库配置
主库配置 master
针对机器 1 上的 mysql
1 修改 mysql 配置文件
在 [mysqld] 下面添加一下字段的配置;
server-id
log_bin
binlog_do_db
例如
server-id = 1
log_bin = /data/mysql/mysql-bin.log
binlog_do_db = data
其中,
server-id :必须是唯一的,如果有多个从库,每个从库之间这个值不一样,并且还有主库的不一样。
log_bin: 记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中;作用:可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)、数据库增量备份和恢复(增量备份和基于时间点的恢复)、MySQL的复制(主主数据库的复制、主从数据库的复制)(copied)。
binlog_do_db: 要复制数据的数据库名,如果有多个库,可以写多行。
2 创建与从库关联的帐号
重启msysql
sudo service mysqld restart
登录shell
mysql -uroot -p
创建用户
create user "slave"@"%" identified by "code";
授权:
数据库data中的所有表
grant all privileges on data.* to "slave"@"code";
flush privileges;
授权主库权限
grant replication slave on data.* to "salve"@"%";
查看主库状态
show master status;
output like
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | newdatabase | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
后面配置从库中会用到此数据。
flush privileges;
如果需要将主库中的数据导出
mysqldump -u root -p --opt data > /path/to/data.sql
从库配置 slave
1 创建库以及导入数据
登录mysql shell, 创建要同步的的数据库,库名与主库master同步库名相同
create database data;
如果需要导入主库导出的数据
mysql -uroot -p data < /path/to/data.sql
2 配置从库
添加一下配置
server-id=29
relay-log = /data/mysql/mysql-relay-bin.log
log_bin = /data/mysql/mysql-bin.log
binlog_do_db = data
重启 从库 mysql
service mysql restart
进入msyql shell 进行主库复制设置
CHANGE MASTER TO MASTER_HOST='12.34.56.789',MASTER_USER='slave', MASTER_PASSWORD='code', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
MASTER_HOST 为主库所在机器的 ip
MASTER_LOG_FILE, MASTER_LOG_POS 的值来自前面 show master status
的输出
激活 从库slave
start slave;
如果之前已经启动了slave,先关闭,然后启动。
stop slave
3 查看是否正常同步
在从库中执行
show slave status \G;
如果出现
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上两项都是Yes,表示正常同步。
错误
从库中执行
show slave status \G;
出现的结果是
Slave_IO_Running: Yes
Slave_SQL_Running: NO
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry '5619166' for key 'PRIMARY'' on query.
问题的很明显;
解决步骤
1 从库中执行
stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
然后从新查看状态
show slave status;
或者添加跳过此类错误
在my.cnf 的 [mysqld]中添加
slave-skip-errors = 1062
然后
service mysqld restart
登录 mysql shell
stop slave;
start slave;
show slave status \G;
可见参考文章
参考文章
Installing MySQL on Linux Using the MySQL Yum Repository
https://dev.mysql.com/doc/mysql-repo-excerpt/5.6/en/linux-installation-yum-repo.html
How To Reset Your MySQL or MariaDB Root Password
https://www.digitalocean.com/community/tutorials/how-to-reset-your-mysql-or-mariadb-root-password
How To Set Up Master Slave Replication in MySQL
https://www.digitalocean.com/community/tutorials/how-to-set-up-master-slave-replication-in-mysql
MySQL replication stop at Last Errno 1062
https://www.techiecorner.com/2572/mysql-replication-stop-at-error-no-1062/