需求如下:由于业务需要,要求将A库中的member表,每分钟同步到B库。以实现B库中的数据更新速度略慢于访问A库。
假设这2个数据库配置如下:
数据库名称|主机/IP|用户名|密码|端口
:--:|:--:|--|:--:|:
A|100.00.0.001|root|mima01|3306
B|xx.sql.tencentcdb.com|lucas|mima02|64388
一、mysqldump + sh脚本完成
# 1、创建 member.sql 文件,并赋上可写权限
touch member.sql
chmod 775 member.sql
# 2、创建 syn.sh 文件
touch syn.sh
# 3、将A库中的test_a表备份出来,导出到member.sql文件中
mysqldump -uroot --host=100.00.0.001 --port=3306 A member --password=mima01 --set-gtid-purged=off -f > /member.sql
# 4、将导出的member.sql文件导入到B库中
mysql -ulucas --host=xx.sql.tencentcdb.com --port=64388 B --password=mima02 -f < /member.sql
# 5、执行sh脚本
sh syn.sh
# 6、写一个每分钟执行一次的定时任务
提示:mysqldump 简单用法如下,详细用法点此查看
# 导出全部数据库。 --all-databases , -A
mysqldump -uroot -p --all-databases
# 显示帮助信息并退出。 --help
mysqldump --help
# 在导出过程中忽略出现的SQL错误。 --force
mysqldump -uroot -p --all-databases --force
# 需要导出的主机信息。 --host, -h
mysqldump -uroot -p --host=localhost --all-databases
# 连接数据库密码。 --password, -p
mysqldump -uroot -p --host=localhost --all-databases --password=demopassword
# 指定连接的用户名。 --user, -u
mysqldump --user=demouser
二、可能的错误及解决方案
1、报错:command not found
syn.sh: line 2: $'\r': command not found
解决方法:修改syn.sh的文件格式 set ff=unix
配置。
2、报错如下:only be set when @@GLOBAL.GTID_MODE = ON.
ERROR 1839 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON.
解决方法:在使用mysqldump备份sql的时候,加上 --set-gtid-purged=off
配置,在导入表的时候加上 -f
强制执行。
3、报错如下:using password: YES
ERROR 1045 (28000): Access denied for user 'lucas'@'115.159.36.155' (using password: YES)
解决方法:账号密码错误。
4、报错如下:you need (at least one of) the SUPER privilege
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
解决方法:切换成root账户。
三、关于mysql写操作不断生成bin日志造成磁盘爆满的解决方案
1、配置my.conf禁止生成bin日志
# 编辑/etc/my.conf文件
vim /etc/my.conf
# 将log-bin=mysql-bin注释掉
#log-bin=mysql-bin
# 重启mysql
service mysqld restart
提示:磁盘爆满可以通过以下命令删除mysql-bin日志
# 进入到目录
cd /www/server/data
# 查看
ls
# 找到相关日志,并删除
find . -maxdepth 1 -regex ".*mysql-bin.000.*" | xargs rm -rf