
##関連する無料学習の推奨事項: mysql ビデオ チュートリアル
データベース レプリケーションは、システムの高可用性とハイ パフォーマンスを向上させる上で非常に重要な役割を果たします。この記事では、mysql マスター/スレーブ レプリケーションに関連する関連知識をまとめています。この分野に携わっている方は、ぜひ参考にしていただければと思います。もっと詳しく知ることができます。役に立ちました。
1 メイン ライブラリ構成
1.1 my.cnf 構成:
メイン ライブラリ構成ファイル my.cnf で次の基本構成を構成します:
1 2 3 4 5 | log-bin = mysql-bin
log-bin-index = mysql-bin.index
server-id = 1
binlog-format = mixed
#sync_binlog=1
|
ログイン後にコピー
デフォルト すべてのデータベースをコピーします。データベースを指定する必要がある場合は、セクション 7 (コピー フィルタリング) を参照してください。
1 2 3 | 比如说要指定db1和db2两个数据库进行主从复制:
binlog- do -db = db1
binlog- do -db = db2
|
ログイン後にコピー
1.2 コピー アカウントを追加します:
コピー アカウントを追加して権限を設定します:
1 2 | mysql> grant replication slave, replicatin client on \*.\* to repl@ '172.16.226.192' identified by 'repl123456' ;
mysql> flush privileges;
|
ログイン後にコピー
2 スタンバイ データベース構成
スタンバイ データベース構成ファイル内my.cnf 次の基本設定を行います。
1 2 3 4 5 6 7 8 9 10 | relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
server-id = 2
#read_only = 1
log_slave_updates = 1
skip_slave_start
即使开启了建议的选项,备库仍然可能在崩溃后被中断,因为master.info和中级日志文件都不是崩溃安全的,所以建议开启一下选项:
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
|
ログイン後にコピー
同期するデータベースまたはテーブルをフィルタリングすることもできます。レプリケーションのフィルタリングに関するセクションを参照してください。
3 データベース リモート バックアップ
データベース リモート バックアップでは、ホット バックアップに mysqldump (論理バックアップ) を選択できますが、データ量が多い場合は遅くなります。Xtrabackup (物理バックアップ) も選択できます。 mysql でホット バックアップを実行する データベースはホット バックアップを実行します (ここでは innobackupex-1.5.1 を使用します) Xtrabackup は、innoDB などのデータベースのオンライン バックアップを実現し、高速で通常の読み書きに影響を与えません。ここでデータベース全体をバックアップします。
3.1 バックアップ アカウントの作成
データベース バックアップ用にメイン サーバーにユーザー バックアップを作成します (最小限の権限を使用します)。
1 2 | mysql> grant reload, lock tables, replication client on \*.\* to backup@ '%' identified by 'backup123' ;
mysql> flush privileges;
|
ログイン後にコピー
3.2 データベースの完全バックアップ
完全バックアップとリカバリの準備の両方の手順は、メイン データベース サーバー上で完了します。
1 2 3 4 | innobackupex-1.5.1 --defaults-file=/etc/mysql/my.cnf --user=backup --password=backup123 /mysqlbackup
--defaults-file:选择默认的配置文件
--user和--password:分别为进行备份的用户名和密码
/mysqlbackup:目标目录
|
ログイン後にコピー
3.3 リカバリの準備
通常、バックアップの完了後、バックアップされたデータにはまだコミットされていないトランザクションまたはコミットされたトランザクションが含まれている可能性があるため、そのデータをリカバリ操作に使用することはできません。ただし、データ ファイル内のトランザクションにはまだ同期されていません。したがって、現時点ではデータ ファイルは依然として不整合な状態に対処しています。 「準備」の主な機能は、コミットされていないトランザクションをロールバックし、コミットされたトランザクションをデータ ファイルに同期することによって、データ ファイルを一貫した状態にすることです。
innobakupex コマンドの --apply-log オプションを使用して、上記の機能を実装できます。たとえば、次のコマンド:
1 2 3 4 5 6 | innobackupex-1.5.1 --apply-log --user=backup --password=backup123 /mysqlbackup/2017-01-11_21-20-57
如果执行正确,其最后输出的几行信息通常如下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407 9:01:36 InnoDB: Starting shutdown...
120407 9:01:40 InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40 innobackupex: completed OK!
|
ログイン後にコピー
「準備」を実装するプロセスで、innobackupex は通常、 --use-memory オプションを使用して、使用できるメモリのサイズを指定することもできます。通常、デフォルトは次のとおりです。 100M。十分なメモリが利用可能な場合は、準備プロセスにより多くのメモリを割り当てて、完了速度を向上させることができます。
3.4 データコピー
マスターサーバーに用意したデータベースをスレーブサーバーにコピーします。 (もちろん、パッケージ化してからコピーすることもできます)
1 | scp -r /mysqlbackup/ copyer@192.168.1.192:/data/
|
ログイン後にコピー
3.5 データ回復
データ回復の前に、まずスレーブ サーバーの mysql サービスを閉じ、次の xtrabackup_binlog_info ファイルからデータを取得します。バックアップ フォルダー 現在使用されているバイナリ ログ ファイル、およびこの時点までのバイナリ ログ イベントがバックアップされる場所。 datadir ディレクトリが空でない場合は、datadir ディレクトリもクリアする必要があります。 innobackupex コマンドの --copy-back オプションは、リカバリ操作を実行するために使用され、すべてのデータ関連ファイルを mysql サーバーの datadir ディレクトリにコピーすることによってリカバリ プロセスを実行します。 innobackupex は、backup-my.cnf を通じて datadir ディレクトリに関する関連情報を取得します (--defaults-file を通じて my.cnf ディレクトリを指定し、datadir パスが空であることを確認することもできます)
1 2 3 4 5 6 7 | innobackupex-1.5.1 -- copy -back /mysqlbackup
如果执行正确,其输出信息的最后几行通常如下:
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2012-04-07_08-17-03'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Finished copying back files.
120407 09:36:10 innobackupex: completed OK!
|
ログイン後にコピー
確認してください上記情報の最後の部分に「innobackupex: completed OK!」という行が表示されます。
データを datadir ディレクトリに復元した後、すべてのデータ ファイルの所有者とグループが mysql などの正しいユーザーであることを確認する必要があります。そうでない場合は、データ ファイルの所有者を変更する必要があります。 mysqld. とグループを開始する前に。例:
1 | chown -R mysql:mysql / var /lib/mysql/
|
ログイン後にコピー
4 マスター/スレーブ接続
4.1 スレーブ データベースを開きます
mysql を開くのに失敗した場合は、エラーを確認することで失敗の理由を見つけることができます。ログ。
4.2 マスター/スレーブ接続を確立する
スレーブ ライブラリは、レプリケーション アカウントを介してマスター ライブラリに接続します: (次の接続を有効にするには、スレーブが停止状態である必要があります)
1 2 | mysql> change master to master_host= '192.168.1.208' ,master_user= 'repl' ,
master_password= 'repl123456' ,master_log_file= 'mysql-bin.000001' (备份时得到的活动日志),master_log_pos=0(备份时得到的活动日志中事件的位置);
|
ログイン後にコピー
注 : マスター/スレーブ接続中にマスターをここに接続できない場合、考えられる理由の 1 つは、ローカル マシンが my.cnf 構成ファイル (つまり、bind-address) でバインドされていることです。 = 127.0.0.1. やるべきこと コメントアウトするだけで、そうしないと外部マシンがアクセスできなくなります。
オープン スレーブ:
スレーブのステータスを確認すると、IO スレッドと SQL スレッドがすでにオープン状態にあり、スレーブの接続ステータスを表す変数が多数あることがわかります。スレーブ ライブラリ (これらの変数はマスター/スレーブ監視の設定にも使用できます) については、ここでは 1 つずつ紹介しません。
1 2 3 4 5 | mysql> show slave status;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
|
ログイン後にコピー
4.3 共通監視コマンド
1 2 3 4 5 6 7 8 | mysql> show processlist\G;
mysql> show master/slave status\G;
mysql> flush logs;
mysql> show binlog events in '指定二进制日志文件名称' from (从指定位置开始显示) limit (需要显示的事件数量)\G;
mysql> show binary logs;
mysql> reset master;
mysql> reset slave;
mysql> show slave hosts;
|
ログイン後にコピー

5 スレーブライブラリの遅延が大きい
スレーブライブラリの遅延が大きい場合、大幅な遅延の理由を見つける必要があります。パラメータ innodb_flush_log_at_trx_commit は、mysql の書き込み効率に大きな影響を与え、次の 3 つの値があります。
1 2 3 | 0:每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;
1:每个事务提交时候,把事务日志从缓存区写到日志文件中,并且刷新日志文件的数据到磁盘上;
2:每事务提交的时候,把事务日志数据从缓存区写到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盘上,而是取决于操作系统的调度;
|
ログイン後にコピー
取1时的IO耗费最大,虽然一致性和完整性方面效果最好,但是写入效率最低,而这也是导致从库延迟较大的原因(如果服务器配置较高或许会好些)。取0时mysql写入性能很好,但如果 mysqld 进程崩溃,通常会导致最后 1s 的日志丢失 。取2时的写入性能也很好,每次事务提交会写入日志文件,但并不会立即刷写到磁盘,日志文件会每秒刷写一次到磁盘。这时如果 mysqld 进程崩溃,由于日志已经写入到系统缓存,所以并不会丢失数据;在操作系统崩溃的情况下,通常会导致最后 1s 的日志丢失。
6 混合模式复制
正常情况下使用使用基于语句的复制,而对不安全的语句则切换到基于行的复制。主要有以下几种情况:
- 该语句调用了:
- UUID函数
- 用户自定义函数
- CURRENT_USER或USER函数
- LOAD_FILE函数
- 一个语句同时更新了两个或者两个以上含有AUTO_INCREMENT列的表
- 语句使用了服务器变量
- 存储引擎不允许使用基于语句的复制,例如,mysql cluster引擎
7 复制过滤
有时候我们不需要对数据库中所有的库进行复制,或者不想对指定库中的某些表进行复制操作,那么我们就需要对复制进行一定的过滤配置,以达到更合理的复制效果。
1. 基于master
1 2 | **binlog- do -db=mysql**:主库只是将指定库(mysql)发生的变化记录到二进制日志中。
**binlog-ignore-db=mysql**:主库取消将指定库(mysql)发生的变化记录到二进制日志中。
|
ログイン後にコピー
2. 基于slave
针对数据库进行的过滤:
1 2 3 4 5 | **replicate- do -db=mysql**:从库只是将指定库(mysql)发生的变化进行重现。
**replicate-ignore-db=mysql**:从库取消将指定库(mysql)发生的变化进行重现。
针对表进行的过滤:
**replicate-wild_do-table=mysql.learn**:从库只是将指定库(mysql)中指定表(learn)发生的变化进行重现。
**replicate-wild_ignore-table=mysql.learn**:从库取消将指定库(mysql)中指定表(learn)发生的变化进行重现。
|
ログイン後にコピー
以上复制过滤方式乍一看没有问题,其实还是有需要注意的地方。因为这些过滤方式的效果与复制方式有关系。如果是基于语句的复制,binlog-do-db、binlog-ignore-db、replicate-do-db、replicate-ignore-db与跨库(如use库内和use外)有关系,这一点需要注意。
8 日志清理
暴力清理:(没有主从复制的情况下)
1 2 | 1、重启mysql服务器即可关闭bin日志的记录
2、通过reset master命令进行清理
|
ログイン後にコピー
条件清理
如果存在主从复制关系,则应当使用purge的方式来清理bin日志,语法如下:
1 2 | purge {master|binary} logs to 'log_name'
purge {master|binary} logs before 'date'
|
ログイン後にコピー
用户删除列于在指定的日志或日期之前的日志索引中的所有二进制日志,同时这些日志也会从日志索引文件的清单中删除。
1 2 3 4 | eg.
purge master logs to 'mysql-bin.000005' ;
purge master logs before '2014-08-30 00:00:00' ;
purge master logs before date_sub(now(),Interval 3 day);清除三天前的日志
|
ログイン後にコピー
定时清理
参数:expire_logs_days
说明:二进制日志自动删除/过期的天数。默认值为'0',即没有过期的
示例:expire_logs_days = 5,代表日志的有效时间为5天
什么时候会删除过期日志?
1 | 每次进行log flush 的时候会自动删除过期的日志
|
ログイン後にコピー
什么时候会触发log flush?
1 2 3 | 1、重启
2、binlog文件的大小达到了最大限制
3、手动执行 flush logs命令
|
ログイン後にコピー
写在最后
本文只是结合自己的学习以及实践过程进行了相关总结,如有不妥之处望您批评指正。推荐大家学习《高可用MYSQL》、《高性能MYSQL》两本书,最重要的还是实践实践再实践,欢迎交流,共同进步。
想了解更多编程学习,敬请关注php培训栏目!
以上がmysqlマスタースレーブレプリケーションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。