MySQL 是否可以设置特定于数据库的主二进制日志?

Web*_*net 2 mysql mysql-replication

我的 MySQL 服务器上的每个 MySQL 数据库是否可以拥有唯一的二进制日志?我已经进行了一些谷歌搜索,似乎找不到任何解决方案。一定有办法的!!

Rol*_*DBA 5

其实方法是有的,但是如果你真的需要的话,就需要花一些功夫了。

大约 6 个月前,我已经发布了一些内容,描述如何设置星形拓扑

您可以使用相同的概念。这是场景

对于此示例,您有三个数据库:members、dbblogs、reports。

步骤 01) 在主服务器上设置二进制日志记录

如果未启用二进制日志记录,您可以启用它

[mysqld]
log-bin=mysql-bin
Run Code Online (Sandbox Code Playgroud)

log-bin=mysql-bin添加到/etc/my.cnf后重启mysql

步骤02)为每个特定数据库设置MySQL实例datadir

mkdir /database_binlogs
mkdir /database_binlogs/members
mkdir /database_binlogs/dbblogs
mkdir /database_binlogs/reports
mkdir /database_binlogs/members/mysql
mkdir /database_binlogs/dbblogs/mysql
mkdir /database_binlogs/reports/mysql
cp /var/lib/mysql/mysql/* /database_binlogs/members/mysql
cp /var/lib/mysql/mysql/* /database_binlogs/dbblogs/mysql
cp /var/lib/mysql/mysql/* /database_binlogs/reports/mysql
chown -R mysql:mysql /database_binlogs
Run Code Online (Sandbox Code Playgroud)

步骤03)为每个数据库创建一个MySQL服务

确保每个配置文件具有以下内容:

/etc/my3307.cnf

[mysqld]
server-id=9993307
datadir=/database_binlogs/members
replicate-do-db=members
log-bin=mysql-bin
log-slave-updates
Run Code Online (Sandbox Code Playgroud)

/etc/my3308.cnf

[mysqld]
server-id=9993308
datadir=/database_binlogs/dbblogs
replicate-do-db=dbblogs
log-bin=mysql-bin
log-slave-updates
Run Code Online (Sandbox Code Playgroud)

/etc/my3309.cnf

[mysqld]
server-id=9993309
datadir=/database_binlogs/reports
replicate-do-db=reports
log-bin=mysql-bin
log-slave-updates
Run Code Online (Sandbox Code Playgroud)

步骤04)启动三个服务

  • service mysql3307 start
  • service mysql3308 start
  • service mysql3309 start

步骤05)仅从Master执行数据库模式的mysqldump,无数据

不要包含 mysql 模式!

mysqldump -uroot -p --master-data=1 --routines --triggers --no-data --databases members dbblogs reports > /root/MySQLSchema.sql
echo "RESET MASTER; START SLAVE;" >> /root/MySQLSchema.sql
Run Code Online (Sandbox Code Playgroud)

步骤06)编辑/root/MySQLSchema.sql以仅使用BLACKHOLE存储引擎

在 vi 中,在文件 /root/MySQLSchema.sql 中运行这两个替换:

  • 1,$s/ENGINE=MyISAM/ENGINE=BLACKHOLE/g
  • 1,$s/ENGINE=InnoDB/ENGINE=BLACKHOLE/g

步骤07)在Master上创建复制用户

GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'replicant'@'127.0.0.1' IDENTIFIED BY 'replpass';
Run Code Online (Sandbox Code Playgroud)

步骤 08) 使用以下命令将 3 个 MySQL 实例设置为主从

CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3306,
MASTER_USER='replicant',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1;
Run Code Online (Sandbox Code Playgroud)

步骤 09) 将 MySQL 架构加载到三个 MySQL 实例中

mysql -uroot -p -h127.0.0.1 -P3307 < /root/MySQLSchema.sql
mysql -uroot -p -h127.0.0.1 -P3308 < /root/MySQLSchema.sql
mysql -uroot -p -h127.0.0.1 -P3309 < /root/MySQLSchema.sql
Run Code Online (Sandbox Code Playgroud)

三个实例中的二进制日志均被清除并开始复制

从那里开始,每个数据库实例将仅记录其指定数据库的二进制日志条目

试一试 !!!

更新时间 2011-10-20 15:37 美国东部时间

请记住,三个从站将仅包含二进制日志,而不包含数据。