TransactdãDockerã§è©¦ãï¼Rubyï¼2/17 PHP追è¨ï¼
ï¼2/17 追è¨ï¼PHPç¨ã¤ã¡ã¼ã¸ã¨ãRuby/PHPã®ãã¼ã¸ã§ã³ã«ã¤ãã¦è¿½è¨ãã¾ããã
å æ¥ãTwitterã§ä»¥ä¸ã®ãã¤ã¼ããè¦ããã¾ããã
transactd ã®å ¥ã£ã docker image ãã§ããããã ãMySQL ã®ãã©ã°ã¤ã³ã¯ããã¥ã¢ã«ãè¦ãéããmy.cnf ã® plugin-load ã§ã®æå®ã¨ãsql ã§ã® install plugin ã§ã®æå®ã§æåãæå³çã«éãã®ãæ°ã«ãªãã
— mapk0y (@mapk0y) 2017å¹´2æ2æ¥
確ãã«ãDockerã¤ã¡ã¼ã¸ãããã°ããã«è©¦ããã¨ãã§ãã¾ããã
ã¨ãããã¨ã§ãDockerã®å
¬å¼Rubyã¤ã¡ã¼ã¸ã«Transactdã¯ã©ã¤ã¢ã³ãã追å ããã¤ã¡ã¼ã¸ã使ãã¾ããã
ï¼2/17 追è¨ï¼
ãã®ã¤ã¡ã¼ã¸ã¯ææ°çã®Rubyï¼2/17ç¾å¨ã¯2.4ï¼ã使ç¨ãã¦ãã¾ãããDockerfileãæ¸ãæããã°Ruby 2.1, 2.2, 2.3ã«ããã®ã¾ã¾ä½¿ç¨ã§ãã¾ãã
ï¼ï¼è¿½è¨ï¼
ã¾ããMySQLã¨Transactdã«ã¤ãã¦ã¯ããã§ã«ã¤ã¡ã¼ã¸ã使ãã¦ãã ãã£ãæ¹ãããã£ãããããã§ãã
yokogawa/mysql-transactd - Docker Hub
ãããã®ã¤ã¡ã¼ã¸ã使ç¨ãã¦ãå®éã«Transactdã®ãã¹ããå®è¡ãã¦ã¿ã¾ãã
ãµã¼ãå´
MySQLSvr
ã¨ããååãä»ãã¦ãTransactdå
¥ãã®MySQLãµã¼ãã®ã³ã³ãããå®è¡ãã¾ãã
docker run -it --name MySQLSvr yokogawa/mysql-transactd /bin/bash
対話å®è¡ãããã-it
ãªãã·ã§ã³ãä»ãã¦ããã®ã§ãmysqldãèµ·åå¾ãå®éã«Transactdãåãã¦ããã確èªãã¾ãã
root@2c44d5533fca:/# /etc/init.d/mysql start ï¼ç¥ï¼ [info] MySQL Community Server 5.7.17 is started. root@2c44d5533fca:/# mysql -uroot -p mysql> show status like 'tr%'; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | Transactd_cur_open_databases | 0 | | Transactd_ha | 0 | | Transactd_tcp_connections | 1 | | Transactd_tpool_connections | 0 | | Transactd_tpool_threads | 0 | +------------------------------+-------+ 5 rows in set (0.01 sec)
ç¡äºã«Transactdã®ã¹ãã¼ã¿ã¹ã表示ããã¾ããã
ãã¹ããããããã«ã¯ãã¯ã©ã¤ã¢ã³ãå´ããã®æ¥ç¶ã許å¯ããããã«ã¢ã¯ã»ã¹æ¨©ã®è¨å®ãããªããã°ãªãã¾ããã
Dockerã®ã³ã³ããã«ã¯172.17.0.0/255.255.255.0
ã®ç¯å²ã®IPã¢ãã¬ã¹ãå²ãæ¯ãããã®ã§ãããã許å¯ãã¦ããã¾ãã
mysql> CREATE USER root@'172.17.0.0/255.255.255.0';
ã¯ã©ã¤ã¢ã³ãå´
æ°ããã¿ã¼ããã«ãéããã¯ã©ã¤ã¢ã³ãå´ã®ã³ã³ãããå®è¡ãã¾ãã
docker run -it --link MySQLSvr:svr bizstation/transactd-ruby /bin/bash
Transactdã®gemãã¤ã³ã¹ãã¼ã«ããã¦ãããã¨ã確èªãã¾ãã
root@1535b3aef141:/# gem which transactd /usr/local/bundle/gems/transactd-3.7.2/lib/transactd.rb
ãã¹ãå®è¡ã®ããã«rspecãã¤ã³ã¹ãã¼ã«ãã¾ãã
root@1535b3aef141:/# gem install rspec
ãµã¼ãã®ãã¹ãåMySQLSvr
ãæå®ãã¦ããã¹ããå®è¡ãã¾ãã
root@1535b3aef141:/# TRANSACTD_RSPEC_HOST=MySQLSvr \ > rspec -c /usr/local/bundle/gems/transactd-3.7.2/test/transactd_spec.rb
ã¨ã¦ãç°¡åã«ç°å¢ãç¨æã§ããã¨æãã¾ãã
ç¾å¨ãPHPã¯ã©ã¤ã¢ã³ãç¨ã®Dockerã¤ã¡ã¼ã¸ã使ä¸ã§ãã
ãã²Transactdã試ãã¦ã¿ã¦ãã ããï¼
2/17 追è¨
Dockerã®å ¬å¼PHPã¤ã¡ã¼ã¸ã«Transactdã¯ã©ã¤ã¢ã³ãã追å ããã¤ã¡ã¼ã¸ã使ãã¾ããã
ãã®ã¤ã¡ã¼ã¸ã¯ææ°çã®PHPï¼2/17ç¾å¨ã¯7.1ï¼ã使ç¨ãã¦ãã¾ãããDockerfileãæ¸ãæããã°PHP 7.0, 5.6ã«ããã®ã¾ã¾ä½¿ç¨ã§ãã¾ãã
ãµã¼ãå´ãRubyã®ã¨ãã¨åãããã«æºåãã¦ãããã¯ã©ã¤ã¢ã³ãå´ã¨ãã¦ã³ã³ãããå®è¡ãã¾ãã
docker run -it --link MySQLSvr:svr bizstation/transactd-php /bin/bash
ãã¹ãã®ãã£ã¬ã¯ããªã«PHPUnitãã¤ã³ã¹ãã¼ã«ãã¦ããã®ã§ãããã«ç§»åãã¦ãã¹ããå®è¡ãã¾ãã
root@955e089e8c67:/# cd /transactd_client_3.7.2_php/tests/ root@955e089e8c67:/transactd_client_3.7.2_php/tests# TRANSACTD_PHPUNIT_HOST=MySQLSvr \ > ./phpunit.phar transactd_Test.php
PDOããé«éãªORMã©ã¤ãã©ãª! Transactd PHP ORM ãªãªã¼ã¹
2016å¹´12æ22æ¥ã«Transactd PHP ORMããªãªã¼ã¹ãã¾ããã
ããã¯Transactdã使ç¨ããMySQL/MariaDBç¨ã®ORMã©ã¤ãã©ãªã§ãã
ä»åã¯ãã®Transactd PHP ORMãç´¹ä»ãã¾ãã
Contents
主ãªç¹å¾´
é«éãªDBã¢ã¯ã»ã¹
Transactd PHP ORMã¯ãORMã§ãããªããPDOãç´æ¥ä½¿ç¨ããã¢ã¯ã»ã¹ãããé«éãªãã¼ã¿ã¢ã¯ã»ã¹ãã§ãã¾ãã
ä¸å³ã¯ãTransactdã¨PDOãLaravel EloquentORMã§ãfind
ã¡ã½ããã«ãã1ã¬ã³ã¼ãã¢ã¯ã»ã¹ãï¼ç°ãªãidã§ï¼100åè¡ã£ãã¨ãã®æéãè¨æ¸¬ããçµæã§ããPDOã¯SELECT * FROM table WHERE id=x
ã§è¨æ¸¬ãã¦ãã¾ãã
Transactdã¯PDOã®ç´2åãLaravelã®5.3åé«éã«å¦çãã¦ãã¾ãã
ï¼100åã«ã¼ããããã¨ã§ãã¯ã©ã¹ã®ãã¼ãæéãªã©ã®å½±é¿ãå°ããããç´ç²ãªãã¼ã¿ã¢ã¯ã»ã¹ã«ãããæéãæ±ãã¾ãããï¼
é常ãPHPã®ORMã¯PDOã使ã£ã¦å®è£ ããã¾ãããããã¯å¿ ãPDOãã¤ãã£ãããé ããªãã¾ããMySQLã«å¯¾ãã¦ãPDOããé«éã«åä½ããã®ã¯ããããTransactd PHP ORMã ãã§ãããã
çã¡ã¢ãª
Transactd PHP ORMã¯ãä»ã®ORMã«æ¯ã¹ã¦é常ã«å°ãªãã¡ã¢ãªã§åä½ãã¾ããèªã¿åã£ãã¢ãã«ã®æ°ã«ãããã¾ããã1ã¤ã®ã¢ãã«ã§Laravel 5.3ã®1/5ç¨åº¦ãå¤ãã®ã¢ãã«ã§ã1/2以ä¸ã®ã¡ã¢ãªä½¿ç¨éã§ãã
ä¸ã®è¡¨ã¯ãä¸è¨ã®ãã¹ãã®åå¾ã«ããã¦memory_get_usage
颿°ã§ä½¿ç¨ã¡ã¢ãªã®å¢åãè¨æ¸¬ãããã®ã§ãã
Transactd | PDO | Laravel | |
---|---|---|---|
ã¡ã¢ãªå¢å é (KB) | 81 | 459 | 442 |
é«ã¹ã«ã¼ããã
é«éãªDBã¢ã¯ã»ã¹ã¨çã¡ã¢ãªã«ãã£ã¦ãé«ãã¹ã«ã¼ããããå®ç¾ã§ãã¾ããWebãªã¯ã¨ã¹ãã«å¯¾ããã¹ã«ã¼ãããã¯ãå¦çå ¨ä½ã«å¯¾ãããã¼ã¿å¦çã®æ¯çã«ãã£ã¦å¤ããã¾ãããæ¯è¼çãã¼ã¿å¦çãéãã±ã¼ã¹ã§ã¯ãLaravel 5.3ã«æ¯ã¹ã¦2å以ä¸ã®ã¹ã«ã¼ããããå®ç¾ãã¦ãã¾ãã
ä¸å³ã¯ãApache JMeterã使ã£ã¦Laravelãã¬ã¼ã ã¯ã¼ã¯ä¸ã«EloquentORMã¨Transactd PHP ORMã§åãå
容ã®ã¢ãã«ãåä½ãããå¦çæéãè¨æ¸¬ããçµæã§ãã
è¨æ¸¬ãã¼ã¸ã¯2ã¤ã®ãªã¬ã¼ã·ã§ã³ãæã£ã200åã®ã¢ãã«ããã¼ãã«å½¢å¼ã«ããHTMLãè¿ãã¦ãã¾ãã
ç¾å®çãªã¬ã¹ãã³ã¹æéãç´300msec以ä¸ã¨ããã¨ãã¹ã«ã¼ãããã¯Laravelã§ç§é20ã¯ã©ã¤ã¢ã³ããTransactdã§ã¯40ã¯ã©ã¤ã³ãã§ãç´2åã«ãªã£ã¦ãã¾ãã
åãLaravelã®ãã¬ã¼ã ã¯ã¼ã¯ä¸ãªã®ã§ãç°ãªãã®ã¯ORMã®ã¿ã§ããORMãå¤ãããã¨ã§Webå
¨ä½ã®ã¹ã«ã¼ããããåä¸ã§ãããã¨ããããã¾ãã
é«å¯ç¨æ§
ããã©ã«ãã§ããã¹ã¿ã¼ã»ã¹ã¬ã¼ãæ§æã§ãèªã¿åããã¹ã¬ã¼ããæ¸ãè¾¼ã¿ããã¹ã¿ã¼ã«æ¯ãåããæ©è½ãããã¾ããã¾ããTHAã«ããé«å¯ç¨éç¨ãå¯è½ã§ãã
èªå¨ãªãã©ã³ã¶ã¯ã·ã§ã³ã¨ããã¯ãã¹ãããã·ã§ãã
Transactdã«ã¯ã1ã¬ã³ã¼ããã¤ã¤ã³ããã¯ã¹é ã«èªå¨ã«ã¢ã¯ã»ã¹ã§ããサーバーカーソルãããã¾ãããµã¼ãã¼ã«ã¼ã½ã«ã使ãã¨ç´°ããªè¡ããã¯ã¨ãã©ã³ã¶ã¯ã·ã§ã³ã®å¶å¾¡ãå¯è½ã§ãã
ã¾ããä¸è²«æ§èªåã®ããã®ã¹ãããã·ã§ãããç°¡åã«è¡ãã¾ãã
ããã·ã§ã³ã¯ãªãã£ã«ã«ãªã¢ããªã±ã¼ã·ã§ã³ã«ãæé©ã§ããããã¯ã¨ãã©ã³ã¶ã¯ã·ã§ã³ã«ã¤ãã¦ã¯ãMySQL/MariaDBとTransactdのInnoDBロック制御詳細 その1 - BizStationブログãåç
§ãã¦ãã ããã
詳細ãªããã¥ã¡ã³ã
ドキュメントãã©ã¤ãã©ãªã®ä¸é¨ã§ããã¨ã«ããåããããããªãããåªåãã¾ããã
ç¹ã«販売管理のサンプルアプリケーションã§ã¯ãå®éã«åä½ããã¢ããªã±ã¼ã·ã§ã³ã使ããªãããããã·ã§ã³ã¯ãªãã£ã«ã«ãªãã¤ã³ãã«éç¹ãç½®ãã¦èª¬æãã¦ãã¾ããORMã使ããªãã¦ããMySQLã使ç¨ãã¦ããæ¹ã«ã¯åèã«ãªãç¹ããããã¨æãã¾ãã
æ¬ ç¹
æ¬ ç¹ã¯ãç¾å¨ã®ã¨ãããã¤ã°ã¬ã¼ã·ã§ã³ããµãã¼ãããã¦ããªããã¨ã§ãããã ããã¼ã¿ãã¼ã¹ãMySQLãªã®ã§ããã¬ã¼ã ã¯ã¼ã¯ã«ãã¤ã°ã¬ã¼ã·ã§ã³ãããã°ããããã®ã¾ã¾ä½¿ç¨å¯è½ã§ãã
詳細
ãã§ã«ORMã使ç¨ããã¦ããæ¹åãã«ãORMã®ä¸è¬çãªåé¡ã«ã¤ãã¦ã®Transactdã§ã®å¯¾å¿å 容ã説æãã¾ãã
ORMã¤ã³ã¿ã¼ãã§ã¼ã¹
ORMのAPIインタフェースã¯ãRuby on Railsã®æµããæ±²ãã Laravel 5ã«é常ã«è¿ããã®ã§ããTransactdã®ãã¤ãã£ãAPIã¨ORMã¯é常ã«ç¸æ§ãè¯ããå°ãªãã³ã¼ãã§ORMãæ§æãã¦ãã¾ããã¢ãã«ã®çæã¯C++ã§å®è£ ãããã¨ã¯ã¹ãã³ã·ã§ã³å ã§è¡ãããé常ã«é«éã«å¦çããã¾ãã
ãªã¬ã¼ã·ã§ã³ã®ãã¼ãã¿ã¤ãã³ã°
Transactd PHP ORMã®ãªã¬ã¼ã·ã§ã³ã¯ããã©ã«ãã§ãã¢ã¯ã»ã¹æã«ãã¼ãããé
å»¶ãã¼ãã§ããã¾ããã¢ãã«ã®ã³ã¬ã¯ã·ã§ã³ã®ãªã¬ã¼ã·ã§ã³ã䏿¬ãã¦åå¾ããEager loading
ããµãã¼ããã¦ãã¾ãã
åèï¼モデル - パフォーマンス
ã¤ã³ãã¼ãã³ã¹ãã¹ããã
ãã¼ãã«ã¨ã¢ãã«ã§æ±ãé åãç°ãªããã¨ããã¤ã³ãã¼ãã³ã¹ãã¹ãããã¨å¼ã³ã¾ããTransactdã§ã¯ããã¼ãã«ã®ãã£ã¼ã«ããã¨ã«ãå¥ã®ã¯ã©ã¹ã®ããããã£ã¸ã®ãããã³ã°ãæå®ãããã¨ã§ãORMã«å¤ã®èªã¿æ¸ããããããã¨ãå¯è½ã§ãã
åèï¼モデル - インピーダンスミスマッチ
ã¢ãã«ã®ãã£ãã·ã¥
find
ã¡ã½ããã使ç¨ããã¦ãã¼ã¯ãªãã¼å¤æ¤ç´¢ã¯é »ç¹ã«çºçãã¾ããã¾ãããã®å¤ã¯ãã¾ãå¤åããªãå ´åãå¤ãããã®é½åº¦ãã¼ã¿ãã¼ã¹ã«ã¢ã¯ã»ã¹ããã®ã¯ç¡é§ãå¤ããªãã¾ããããã§Transactd PHP ORMã§ã¯ããã®ãããªã¢ãã«ããã£ãã·ã¥ããæ¤ç´¢æã«ã¯ãã£ãã·ã¥ãããã°ãããè¿ãã¾ãã
ãã£ãã·ã¥ã®å¹æã¯é常ã«å¤§ãããæ°ååã®é度ã¢ããã«ãªããã¨ãããã¾ãã
åèï¼モデル-キャッシュ
IDEã®ã³ã¼ãè£å®æ¯æ´
ã¢ãã«ã®ããããã£ã¯ãã¢ãã«å
ã«æç¤ºçã«å®£è¨ããå¿
è¦ãããã¾ãããè¨è¿°ãç°¡åãªåé¢ãéçºç¨ã®IDEããã¯ã©ã®ãããªå±æ§ãããã®ãããããªããªãã¾ãã
Transactd PHP ORMã§ã¯ãã¢ãã«ã®ã½ã¼ã¹ã³ã¼ãã¸ã§ãã¬ã¼ã¿ãPHPDocã«å¯¾å¿ãã@property
ã³ã¡ã³ããåºåãã¾ããããã«ããIDEã§ã®ã³ã¼ãè£å®ãå¯è½ã«ãªãã¾ãã
åèï¼モデル-自動生成
ããããã£ã¢ã¯ã»ã¹é度
PHPã§ã¯ãããããã£ã®å®è£ ã§ãã¸ãã¯ã¡ã½ããã使ããã¨ãã§ãã¾ãããããããã®æ¹æ³ã¯é常ã«ä½éã§ããTransactd PHP ORMã¯é常ã®ããããã£ã®å®è£ ã«ãã¸ãã¯ã¡ã½ããã使ç¨ãã¾ããããã¼ã¿ãã¼ã¹ã¢ã¯ã»ã¹ã®é«éåã ãã§ãªããããããã£ã¢ã¯ã»ã¹é度ã«ããã©ã¼ã«ã¹ããå ¨ä½ã§ã®å¦çé度ã®åä¸ãå³ã£ã¦ãã¾ãã
ä¸ã®è¡¨ã¯ãå徿¸ã¿ã®ã¢ãã«200åã«ã¤ãã¦ãããããã£ã®èªåã¨è¨å®ãåã¢ãã«10åãã¤è¡ã£ãã¨ãã®æéãè¨æ¸¬ãããã®ã§ãã
Transactd | Laravel 5.3 | åç |
---|---|---|
0.0002528 | 0.018078 | 71.5 |
Transactdã¯Laravel 5.3ã®70åãé«éã«ããããã£ã¸ã®èªã¿æ¸ããã§ãã¾ãã
è¤éãªãã¼ã¿ãã¼ã¹å¦ç
ORMã使ãï¼ä½¿ããªãã®å¤æãããéã«ãè¤éãªå¦çã«ãªãã¨ORMã ãã§ãã¼ã¿ãã¼ã¹ã¢ã¯ã»ã¹ãå®çµãã«ããã¨ããåé¡ãããã¾ããTransactdã¯ORMã¨ãã¤ãã£ãAPIã®å¢ç®ãããã¾ãããORMãçãããªããèªç¶ã«ãã¤ãã£ãAPIãå©ç¨ããè¤éãªå¦çã«ã対å¿ã§ãã¾ãã
ã¾ã¨ã
Transactd PHP ORMã¯ãé«éã¬ã¹ãã³ã¹ãçã¡ã¢ãªãé«ã¹ã«ã¼ãããã§ããã·ã§ã³ã¯ãªãã£ã«ã«ãªéçºã«é©ããORMã§ãã
以ä¸ã®ãããªORMãæ¢ãã¦ããæ¹ã«æé©ã§ãã
- MySQLã¸ã®ã¢ã¯ã»ã¹ã®ããWebãã¼ã¸ã®ã¬ã¹ãã³ã¹ãè¯ãããã
- MySQLã¸ã®ã¢ã¯ã»ã¹ã®ããWebãµã¤ãã®ã¹ã«ã¼ããããè¯ããããï¼åç´ã¹ã±ã¼ã«ã¢ãããããï¼
- MySQLã¢ã¯ã»ã¹ããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã«ç°¡åã«åæ£ããã
- ç¾å¨ä½¿ç¨ãã¦ããORMã§ã¬ã³ã¼ãã®ããã¯ãæä»å¶å¾¡ã«ä¸å®ããã
- ã¢ãã«ã®ããããã£ã¸ã®ã¢ã¯ã»ã¹ãé ãã¨æãã¦ãã
Transactdã¯ãããã·ã§ã³ã¯ãªãã£ã«ã«ã§é«éãªã¬ã¹ãã³ã¹ã¨é«ãã¹ã«ã¼ããããæ±ããã¢ããªã±ã¼ã·ã§ã³ã«æé©ã§ããå°ããªè¦æ¨¡ãã大ããªãã®ã¾ã§å¯¾å¿ã§ãã¾ãã
ORMã®ã¤ã³ã¿ãã§ã¼ã¹ã¯Laravel 5ã«è¿ãã®ã§ãåãããããå¦ç¿ã³ã¹ããå°ãªãã¦ãã¿ã¾ãã
ã¤ã³ã¹ãã¼ã«ã¯Composerã§ç°¡åã«è¡ãã¾ããPackagist transactd/ormãã覧ãã ããã
æ¯éããµã¯ãµã¯ã§å ç¢ãªTransactd PHP ORMã使ãã¦ã¿ã¦ãã ããã
MySQL/MariaDB Transactd è¶ é«å¯ç¨éç¨ ï¼THAï¼
MySQL/MariaDBç¨ NoSQLãã©ã°ã¤ã³ Transactdã§ã®é«å¯ç¨éç¨ï¼Transactd High Availabilityï¼ãã¼ã«ãTHAãã¨ã対å¿ãããã©ã°ã¤ã³ï¼Version 3.5ï¼ã®æä¾ãéå§ãã¾ããã
MySQL/MariaDBã®HAãã¼ã«ã¯æ¢ã«ããã¤ãããã¾ãããTHAã¯Transactdã«åããã¦æé©åãããã¨åæã«ãä»ã«ã¯ãªã工夫ãããã¦ãã¾ãã
å ã Transactdã¯ãããã·ã§ã³ã¯ãªãã£ã«ã«ã§ã¬ã¹ãã³ã¹ã追åããã¨ã³ã¿ã¼ãã©ã¤ãºã¢ããªã±ã¼ã·ã§ã³ã®ããã«éçºããã¾ãããé«å¯ç¨éç¨ã¯ã¨ã¦ã大äºãªèª²é¡ã§ãããä»åãããããã®èª²é¡ãéæã§ãã¾ããã
ãã¼ã¿ã¢ã¯ã»ã¹ã«Transactd APIã¯ä½¿ç¨ããªãã¦ããHAã®ããã ãã«Transactdãã©ã°ã¤ã³ã使ç¨ãããã¨ãå¯è½ã§ãã
THAã«ã¤ãã¦ã¯ãTransactdããã¥ã¡ã³ãã®高可用運用ã«è©³ããæ¸ããã¦ãã¾ãã®ã§è©³ç´°ã¯ãã¡ããã覧ãã ããã
ããã§ã¯ä¸»ãªå 容ãç´¹ä»ãã¾ãã
- THAã®ä¸»ãªæ©è½
- THAã®ç¹å¾´
- THAã«å¿ è¦ãªãã®
- æå°éã®ã¢ããªã±ã¼ã·ã§ã³ã¨ã©ã¼ã¨æç¶æ§
- ãã¼ã ãªã¾ã«ãã¼ï¼THNRï¼
- ãã§ã¤ã«ãªã¼ãã¼
- THAã®ç¶æ æ¤æ»
- ã¾ã¨ã
THAã®ä¸»ãªæ©è½
- ãã¹ã¿ã¼æ»æ´»ç£è¦
- èªåãã§ã¤ã«ãªã¼ãã¼ï¼åæ¿æé æ°ç§ä»¥å ï¼
- ä»®æ³ãã¹ãåã¢ã¯ã»ã¹ã¨å®ãã¹ãå解決
- ã¹ã¤ãããªã¼ãã¼
- THAã®ç¶æ æ¤æ»
THAã®ç¹å¾´
- é害æ¤ç¥ãããã¹ã¿ã¼åæ¿ã»åå解決ã¾ã§ããã§ã¤ã«ãªã¼ãã¼ã«å¿ è¦ãªå¦çããã¹ã¦ç¶²ç¾
- é害æã®æå°éã®ã¢ããªã±ã¼ã·ã§ã³ã¨ã©ã¼
- OSãå¤é¨æ©å¨ãDNSãªã©ã«ããæ¯æ´ãä¸è¦
- æ°è¡ã®ã¢ããªã±ã¼ã·ã§ã³ããã°ã©ã 夿´ã§å©ç¨å¯è½
- MySQL/MariaDBãLinux/Windows/Mac OS XãC++/PHP/Ruby/COMãªã©å¹ åºãåä½ç°å¢
- Transactd Pluginã¨Transactd client以å¤ã®ã©ã¤ãã©ãªã¯ä¸è¦
THAã«å¿ è¦ãªãã®
- Transactd Pluginï¼MySQL 5.6ä»¥ä¸ MariaDB 10.0.13以ä¸ï¼
- Transactd ã¯ã©ã¤ã¢ã³ãï¼C++/PHP/Ruby/COMã®ãããã対å¿ãã¦ãã¾ãï¼
- THA管çããã¼ã¸ã£ï¼haMgrï¼ï¼Client utilities ã«å«ã¾ããã³ãã³ãã©ã¤ã³ããã°ã©ã ï¼
ããã ãã§THAãéå§ã§ãã¾ãã
æå°éã®ã¢ããªã±ã¼ã·ã§ã³ã¨ã©ã¼ã¨æç¶æ§
ä¸è¬çã«ãã§ã¤ã«ãªã¼ãã¼ã®ããªã¬ã¼ã¯ãå°ç¨ã®ç£è¦ãã¼ã¢ã³ãheartbeatãªã©ã使ç¨ãã¾ãããTHAã§ã¯ãã®ãããªãã®ã¯ããã¾ããã代ããã«ãã¢ããªã±ã¼ã·ã§ã³å
ã®Transactd ã¯ã©ã¤ã¢ã³ãããåãåã£ãã¨ã©ã¼ã®å
容ãããµã¼ãã¼ã®åé¡ã§ãããã夿ãããã§ã¤ã«ãªã¼ãã¼ãéå§ãã¾ãã
ã¾ããã¯ã©ã¤ã¢ã³ãã«ã¯ããããã¯ã¼ã¯ã¨ã©ã¼ãçºçããéã«ãµã¼ãã¼åæ¥ç¶ããæ©è½ãçµã¿è¾¼ã¾ãã¦ãã¾ãã 忥ç¶ã§ããå ´åãã«ã¬ã³ãã¬ã³ã¼ããããã¯ç¶æ
ãªã©ã復å
ããã¾ãã
ããã«ãã£ã¦ãã¢ããªã±ã¼ã·ã§ã³ã«ã¨ã©ã¼ãè¿ãåã«ãã¹ã¿ã¼ãåæ¿ãããã忥ç¶ãããã¨ã§ä½äºããªãã£ãããã«å¦çãç¶ç¶ã§ãã¾ããï¼ãã ãããã©ã³ã¶ã¯ã·ã§ã³ä¸ã®ã¨ã©ã¼ã¯ãããã®å¦çãè¡ãã¾ããããã©ã³ã¶ã¯ã·ã§ã³ãã¢ãã¼ãããã¦ããè¡ããã¾ããï¼
å°ç¨ã®ç£è¦ãã¼ã¢ã³ãªã©ã®å ´åã¯ç£è¦ãµã¤ã¯ã«ï¼30ç§ãªã©ï¼ãããã®ã§ãé害çºçããæ¤åºã¾ã§ã®éã®ã¢ã¯ã»ã¹ã¯ãã¹ã¦ã¨ã©ã¼ã«ãªãã¾ããTHAã®å ´åã¯ãã©ã³ã¶ã¯ã·ã§ã³ä¸ã«éãï¼ã¯ã©ã¤ã¢ã³ãã¨ã®æ¥ç¶ãã¨ã«ï¼ãã®1ã¤ã ããã¨ã©ã¼ã«ãªãã¾ãã
ãã©ã³ã¶ã¯ã·ã§ã³ä¸ã®ã¢ã¯ã»ã¹ã¨ã©ã¼ãæ£ããï¼ã¢ãã¼ãï¼å¦çããã°ã¢ããªã±ã¼ã·ã§ã³ã¯ãã®ã¾ã¾æç¶ãã¦å®è¡ãç¶ãããã¨ãã§ãã¾ãã
ã¢ããªã±ã¼ã·ã§ã³ã®æç¶æ§ã§è¨ãã°ããã¹ã¿ã¼ãã¦ã³ã«ãããã¦ã³ã¿ã¤ã ã¯ã¼ãã§ãã
ããããè¶
é«å¯ç¨ãã¨é¡ããçç±ã§ãã
ãã¼ã ãªã¾ã«ãã¼ï¼THNRï¼
ã¯ã©ã¤ã¢ã³ãã«ã¯HAã®ããã®ãã¼ã ãªã¾ã«ãã¼ï¼THNRï¼ãå
èµããã¾ãããã¢ããªã±ã¼ã·ã§ã³ã¯æ¥ç¶å
ã®ãã¹ãåããå®ãã¹ãåã§ãªãä»®æ³åã§æå®ãã¾ããTHNRã¯æå®ãããä»®æ³ãã¹ãåããå®ãã¹ãåã«åå解決ãã¦ã¢ã¯ã»ã¹ãè¡ãã¾ããããã«ãã£ã¦ããã¹ã¿ã¼ãåæ¿ãã«ä»éããVIPã®å¤æ´ãARPãã£ãã·ã¥ã®ã¯ãªã¢ã¨ãã£ãOSããããã¯ã¼ã¯æ©å¨ãªã©ã«å¯¾ãã追å å¦çã¯ä¸åä¸è¦ã§ãã
解決ãããååã¯ãã£ãã·ã¥ããã¾ãã®ã§ãåå解決ã®ããã®ãªã¼ãã¼ãããã¯ã»ã¨ãã©ããã¾ããã
ãªã³ãã¬ãã¹ããã¯ã©ã¦ããLinux/Windows/Macãªã©ãã¾ãã¾ãªç°å¢ã§å ¨ãåãããã«ä½¿ç¨ã§ãã¾ãã
ãã§ã¤ã«ãªã¼ãã¼
ãã§ã¤ã«ãªã¼ãã¼ã¯MySQL/MariaDBã®GTIDã¬ããªã±ã¼ã·ã§ã³ã使ç¨ãã¦ã¹ã¬ã¼ã群ã®ä¸ãã1å°ããã¹ã¿ã¼ã«ææ ¼ããã¾ããããã¦æ®ãã®ã¹ã¬ã¼ãã®ã¬ããªã±ã¼ã·ã§ã³å
ãæ°ãã¹ã¿ã¼ã«åãæ¿ãã¾ãã
ãã§ã¤ã«ãªã¼ãã¼ã¯ã¯ã©ã¤ã¢ã³ãã«ã¤ã³ã¹ãã¼ã«ãããhaMgrãTHNRããæä»¤ãåãã¦éå§ãã¾ãããã§ã¤ã«ãªã¼ãã¼ã«ãããæéã¯ã¹ã¬ã¼ãã®å°æ°ã«ãããã¾ããæ¦ã1ç§ä»¥å
ã«ãã¹ã¦å®äºãã¾ãã
THAã®ç¶æ æ¤æ»
ãã§ã¤ã«ãªã¼ãã¼ã¯é »ç¹ã«èµ·ãããã®ã§ã¯ããã¾ãããããã¨ããã¨ãã«å©ãã«ãªãä»çµã¿ã§ããã¨ããããããã¨ããã¨ãã«æ£ããåä½ãããã®ã¯ä»¥å¤ã¨é£ããã£ãããã¾ãã
ããã§ãhaMgrã«ã¯ãã§ã¼ã«ãªã¼ãã¼ãæ£ããã§ããç¶æ
ã«ãããã©ããããã§ãã¯ããæ©è½ãããã¾ãã宿çãªã¿ã¹ã¯ã§ãã§ãã¯ãè¡ããã¨ã§å顿ã«ç¢ºå®ã«ãã§ã¤ã«ãªã¼ãã¼ã§ããããã«ã¾ãã
MySQL/MariaDB ã¬ããªã±ã¼ã·ã§ã³å¾©æ§ããã¼ãã«ããã¯ãããç¹å®ãã¼ãã«ã®ã¿ã³ãã¼ããããã®2
ååã¯ãã¬ããªã±ã¼ã·ã§ã³å¾©æ§ã«ããã¦MySQLã®ã³ãã³ãã使ã£ã¦æãããã¯æéãçãã³ãã¼ãç´ãæ¹æ³ãç´¹ä»ãã¾ããã
ä»åã¯ãå
¨ããã¼ãã«ãããã¯ããã«ç¹å®ã®ãã¼ãã«ããã¼ã¿ãã¼ã¹ãã³ãã¼ãç´ãæ¹æ³ãç´¹ä»ãã¾ãã
Nonlocking Replcopy
Nonlocking Replcopyã¯ååã®è¨äºã®å
容ãå®è£
ããPHPã¹ã¯ãªããã§ããããã°ã®ã¿ã¤ãã«éãããã¼ãã«ããã¯ãããç¹å®ãã¼ãã«ã®ã¿ã³ãã¼ã§ãã¾ãã
ã¹ã¯ãªããã¯GitHubからダウンロードã§ãã¾ããå®è¡ç°å¢ãä½¿ãæ¹ã®æ¦è¦ã¯readmeãã覧ãã ããã
ã¾ãããã¹ãç¨ã®Transactdãµã¼ãã¼ç°å¢ãæå ã®Windowsãã·ã³ã«3åã§ã»ããã¢ããã§ããTransactdTestSrvSetupãããã¾ããæ¯éæ´»ç¨ãã¦ã¿ã¦ãã ããã
Nonlocking Replcopyã¯ä»¥ä¸ã®ãã¨ãã§ãã¾ãã
- ã¬ããªã±ã¼ã·ã§ã³ã®æ°è¦ã»ããã¢ããï¼ãã¼ã¿ã®ã³ãã¼ãå«ãï¼
- ã¬ããªã±ã¼ã·ã§ã³ã®ä¿®å¾©ã³ãã¼ï¼é¨åã³ãã¼ï¼
- SQLã¹ã¬ããã¨ã©ã¼ã®ã¹ãããï¼ã¨ã©ã¼å 容ãè¦ãªãã対話çã«ï¼
- ã¬ããªã±ã¼ã·ã§ã³ã®åã»ããã¢ãã
- MySQLã¨MariaDBã®GTIDã使ã£ãã¬ããªã±ã¼ã·ã§ã³
ããã§ã¯ããã®ã¹ã¯ãªããã使ã£ãå ·ä½çãªæ°è¦ã»ããã¢ããã¨ãã¨ã©ã¼å¥ã®ä¿®å¾©æ¹æ³ã説æãã¾ããã©ã®ä¾ããµã¼ãã¼ã¯ç¨¼åä¸ã®ã¾ã¾ã§OKã§ãã
æ°è¦ã«ã¬ããªã±ã¼ã·ã§ã³ãã»ããã¢ãããã
è¨å®ã¯ãã¹ã¦è¨å®ãã¡ã¤ã«ã«è¨è¿°ãã¾ããã¹ã¯ãªããã®ã³ãã³ãã©ã¤ã³ãã©ã¡ã¼ã¿ã«ã¯è¨å®ãã¡ã¤ã«åãæ¸¡ãã¾ãã
$php replcopy.php repl_config.ini
å ·ä½çãªæ°è¦ã»ããã¢ããæ¡ä»¶ã¯ä»¥ä¸ã®å 容ã¨ãã¾ãã
ãµã¼ãã¼ã®ç¨®é¡ | MySQL 5.6 |
---|---|
対象ãã¼ã¿ | ãµã¼ãã¼å ¨ä½ |
ãã¹ã¿ã¼ãã¹ãå | server1 |
ã¹ã¬ã¼ããã¹ãå | server2 |
[replcopy]# php dreplcpy.php ./repl_config_centOS.ini Nonlocking replcopy version 1.0.0 --- Start replication setup --- Open slave database ... done! Stop slave ... done! Open master database ... done! Open master tables ... done! Begin snapshot on master ... done! Wait for stop slave until binlog pos ... done! Copying tables ... [database : test_v3] table : fieldtest ... done! table : groups ... done! table : nullkey ... done! table : nullvalue ... done! table : packrecord_test ... done! table : scores ... done! table : setenumbit ... done! table : test ... done! table : timetest ... done! table : users ... done! Reset slave ... done! Change master ... set global gtid_purged='d30d02d6-3fe4-11e5-97db-00ffa4dbde57:1-8'; change master to master_host='server1', master_port=3306, master_user='replication_user', master_password='123', master_auto_position = 1; done! Start slave ... done! Slave_IO_Running = Yes Slave_SQL_Running = Yes --- Replication setup has been completed --- [replcopy]#
ãããªæãã§å®è¡ããã¾ããã©ã®ãããªå¦çããã¦ãããã¯ããã®å®è¡çµæã®éãã§ããæå/失æã¯æå¾ã®Slave_IO_Running = Yes
Slave_SQL_Running = Yes
ã§å¤æãã¦ãã¾ãã
è¨å®ã®ãã¤ã³ã
è¨å®ãã¡ã¤ã«ã¯ä»¥ä¸ã®ãããªå 容ã§ãã
[master] host=server1 repl_port=3306 repl_user=replication_user repl_passwd=123 databases= tables= ignore_tables= [slave] host=server2 master_resettable=1 log_bin=0 [gtid] using_mysql_gtid=1 type=2
databases
ã¨tables
ã«ä½ãæå®ããªãã¨ãã¹ãå ¨ä½ãã³ãã¼ãã¾ãã- GTIDã使ã£ãæ°è¦ã»ããã¢ããã¯
RESET MASTER
ã®å®è¡ã¯å¿ é ã§ããmaster_resettable=1
ãã»ãããã¦æå¹ã«ãã¾ãã - æ°è¦ã»ããã¢ãããªã®ã§ã³ãã¼å¦çã®ãã°ã¯ä¸è¦ã§ãã
log-bin=0
ãæå®ãã¦OFFã«ãã¾ãã - MySQL 5.6ã®GTIDã使ç¨ããã®ã§ã
using_mysql_gtid=1
ãã»ãããã¾ãã - MySQL 5.6ã®GTIDã«ãããã¸ã·ã§ã³æå®ã§ã¬ããªã±ã¼ã·ã§ã³ãã»ããã¢ããããã®ã§ã
type=2
ãæå®ãã¾ããï¼0ã¯éGTIDã1ã¯MariaDBã®GTIDï¼
mysql ã·ã¹ãã ãã¼ã¿ãã¼ã¹
mysqlã¨ããååã®ããã©ã«ãã®ãã¼ã¿ãã¼ã¹ãããã¾ãããã®ãã¼ã¿ãã¼ã¹ã®ãã¼ãã«ã¯ã»ã¨ãã©ãMyISAMã®ãã¼ãã«ã§ããMyISAMã¯MVCCããµãã¼ããã¦ããããã¹ãããã·ã§ãããåãã¾ããããã®ããã³ãã¼ä¸ã«ãã¹ã¿ã¼ã§å¤æ´ãå ããã¨ä¸æ´åãèµ·ããå ´åãããã¾ãã
Nonlocking Replcopyã§ã¯ããã¹ãå
¨ä½ãæå®ãã¦ããã®mysqlãã¼ã¿ãã¼ã¹ã¯å«ã¾ãã¾ããããã¹ãå
¨ä½ã³ãã¼ã®åã«databases=mysql
ã¨ãã¦å®è¡ãããã®å¾ãã¹ãå
¨ä½ãæå®ãã¦ã³ãã¼ããå岿¹å¼ã§ãå®å
¨ãªå
¨ä½ã³ãã¼ãè¡ããã¨ãã§ãã¾ãããã ããmysqlãã¼ã¿ãã¼ã¹ã®ã³ãã¼ä¸ã¯ãã¹ã¿ã¼ã§ãã®ãã¼ã¿ãã¼ã¹ã夿´ããªããã¨ãæ¡ä»¶ã§ãã
ã¬ããªã±ã¼ã·ã§ã³ã¨ã©ã¼ã修復ãã
ã¬ããªã±ã¼ã·ã§ã³ã®ä¿®å¾©ãè¡ãçç±ã¨ãã¦
- SQLã¹ã¬ããã¨ã©ã¼
- I/Oã¹ã¬ããã¨ã©ã¼
- ãã¼ã¿ã®ä¸ä¸è´
ãªã©ãããã¾ãã
ããããã®ãã¿ã¼ã³ãã¨ã«ä¿®å¾©ã®ä»æ¹ã説æãã¾ãã
ãã¼ã¿ã®ä¸ä¸è´ã修復
ããã¯æãã·ã³ãã«ã§ãããã¼ã¿ã®ã³ã³ãã¢ãã¼ã«ãã¦ã¼ã¶ã¼ããã®ç³åãªã©ã§ãã¼ã¿ã®ä¸æ´åã«æ°ä»ããå ´åã§ããSQLã¹ã¬ããã¯éè¯ãã¾ã ã¨ã©ã¼ã«ã¯ãªã£ã¦ããªãå ´åã§ãã
ãã®å ´åã¯ä¸æ´åã®ãããã¼ãã«ã®ã¿åæãã¦ã³ãã¼ãã¾ãã
ä¸ä¸è´ã®ãããã¼ã¿ãã¼ã¹å | test |
---|---|
ä¸ä¸è´ã®ãããã¼ãã«å | tabel_a table_b |
è¨å®ãã¡ã¤ã«ä¸ã§ãæ°è¦ã»ããã¢ããã¨ç°ãªãç¹ã¯ä»¥ä¸ã®é¨åã§ãã
[master] ... databases=test tables=tabel_a,table_b ...
ãã®è¨å®ã§å®è¡ããã°ãã¹ã ã¼ãºã«ã³ãã¼ãã¦çµããã¾ãã
SQLã¹ã¬ããã®ã¨ã©ã¼ã修復
è¨å®å 容ã¯ãä¸è¨ã®ããã¼ã¿ã®ä¸ä¸è´ã修復ãã¨åãã§ãããã ããSQLã¹ã¬ããã¨ã©ã¼ãèµ·ããã¦ãããã¼ãã«ãäºåã«ããç¨åº¦èª¿ã¹ãå¿ è¦ãããã¾ããããã¦ãã®ãã¼ãã«ãã³ãã¼å¯¾è±¡ã«è¨å®ãã¾ãããããã¨ã©ã¼ã®ä¸ã«æ³å®å¤ã®ãã¼ãã«ãåºç¾ããå ´åã¯ããã£ã³ã»ã«ãã¦è¨å®ãã¡ã¤ã«ã«ãã®ãã¼ãã«ãå ãã¦åå®è¡ãã¾ãã
ãã®ã¹ã¯ãªããã¯ãSTART SLAVE UNTIL
ã使ã£ã¦æå®ãããã¸ã·ã§ã³ã¾ã§SQLã¹ã¬ãããé²ãã®ãå¾
æ©ãã¾ããã¨ãããSQLã¹ã¬ããã¨ã©ã¼ãçºçãã¦ãã¾ã£ã¦ã¯ããã¾ã§é²ããã¨ãã§ãã¾ãããããã§ãå¾
æ©æã«SQLã¹ã¬ããã¨ã©ã¼ãããå ´åããã®å
容ã表示ãã¹ããããããã©ãããåãåãããã¾ãã
------------------------- SQL thread has error(s). ------------------------- Could not execute Update_rows_v1 event on table test_v3.fieldtest; Can't find record in 'fieldtest', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysqld-bin.000016, end_log_pos 2424 Do you want skip only this error ? Y: Skip this error | A: Skip all error | C: Cancel replication
鏿è¢ã¯ä»¥ä¸ã®3ã¤ã§ãã
- Y : ãã®ã¨ã©ã¼ã®ã¿ã¹ããããã
- A :
RESET SLAVE
ãã¦ãã¹ã¦ã®ã¨ã©ã¼ãã¹ããããã - C : ã¬ããªã±ã¼ã·ã§ã³ä¿®å¾©ããã£ã³ã»ã«ãã
ããããæ¡ä»¶ã§çç¾ãªãé²ããããã®ã¯ãYã®ããã®ã¨ã©ã¼ã®ã¿ã¹ããããããã鏿ãããã¤ãã®ã¨ã©ã¼ã®èµ·ãã¦ãããã¼ã¿ãã¼ã¹ã¾ãã¯ãã¼ãã«ãä»åã®ã³ãã¼å¯¾è±¡ã«å«ã¾ãã¦ããå ´åã§ãã
ã¨ã©ã¼ã®ã¹ãããã¯ãã¹ã¦ã®ã¨ã©ã¼ããªããªãã¾ã§ç¹°ãè¿ãè¡ãå¿
è¦ãããã¾ãã
ã¨ã©ã¼ã¡ãã»ã¼ã¸ã«ã¯ã対象ã®ãã¼ã¿ãã¼ã¹åããã¼ãã«åãå«ã¾ãã¦ããã®ã§ãå¿ ã確èªããããã«ãã¾ãã
Aã®ãRESET SLAVE
ãã¦ãã¹ã¦ã®ã¨ã©ã¼ãã¹ããããããã§ã¯å®¹æã«ã³ãã¼ãéå§ãããã¨ãã§ãã¾ããããªã¬ã¼ãã°ã«ã³ãã¼å¯¾è±¡ã«å«ã¾ããªããã©ã³ã¶ã¯ã·ã§ã³ãããã¨ãããã¹ã¬ã¼ãã«é©ç¨ãããçç¾ãçãã¾ãããã¹ãå
¨ä½ã対象ã§ãã£ãããã³ãã¼å¯¾è±¡å¤ã®ãã¼ã¿ããã£ã¦ãåé¡ãªãå ´åãã³ãã¼å¯¾è±¡å¤ã®ãã¼ã¿ã¯ç¡ãã¨ããã£ã¦ããå ´åã¯ããã鏿ã§ãã¾ãã
ãããã³ãã¼å¯¾è±¡å¤ã§åé¡ã®ããSQLã¹ã¬ããã¨ã©ã¼ãåºç¾ãããCã®ããã£ã³ã»ã«ãããã¦ããã®ãã¼ãã«ããã¼ã¿ãã¼ã¹ãè¨å®ã«å ãã¦å度å®è¡ãã¦ãã ãããããã§ã®ãã£ã³ã»ã«ã¯è¿½å ã®åé¡ãçºçããããã¯ãã¾ããã
ãã®ã¹ããããééããã°ããã¨ã¯æ°è¦ã»ããã¢ããã¨åãããã«ãã¼ãã«ãã³ãã¼ããã¬ããªã±ã¼ã·ã§ã³ãåéããã¾ãã
I/Oã¹ã¬ããã®ã¨ã©ã¼ã修復
I/Oã¹ã¬ããã¨ã©ã¼ã®åå ã¯
- ã¬ããªã±ã¼ã·ã§ã³ç¨ã®ã¢ã«ã¦ã³ããç¡å¹ã«ãªã£ã
- ãã¡ã¤ã¢ã¦ã©ã¼ã«è¨å®ã夿´ãããããã¯ããã
- ãã¹ã¿ã¼ã忢ãã¦ãã
- ãã¹ã¿ã¼ã§
RESET MASTER
ãªã©ãå®è¡ãããã¹ã¬ã¼ãã®è¦æ±ãããã°ããªã
ãªã©å¤å²ã«æ¸¡ãã¾ããã¾ãä¿®å¾©æ¹æ³ãåå ãã¨ã«ç°ãªãã¾ããNonlocking Replcopyã¯ããããå復ããããã®ãã®ã§ã¯ããã¾ããããåã»ããã¢ãããã¦ãã¾ãããå ´åã«ã¯æç¨ã§ãã
ã¬ããªã±ã¼ã·ã§ã³ã®åã»ããã¢ãã
ãã®è¨å®ã¯æ°è¦ã»ããã¢ããã¨ä½ãå¤ããããã¾ããã
ãã ãæ¢ã«ã¹ã¬ã¼ããè¨å®æ¸ã¿ã®ãããç¾ç¶ã®ç¶æ
ã«I/Oã¹ã¬ããã¨ã©ã¼ããã¤ããªãã°ã®çç¾ãã£ãããã¾ãããã®å ´åããããã表示ãã¦ç¶ç¶ãããã©ããåãåãããã¾ãã
------------------------- IO thread has error(s). ------------------------- Got fatal error 1236 from master when reading data from binary log: 'Error: connecting slave requested to start from GTID 0-1-234, which is not in the master's binlog' Do you want stop and reset slave ? (Y/N) ?
Y
ã鏿ããã¨ãI/Oã¨ã©ã¼èªä½ãç¡è¦ãã¦åã»ããã¢ãããè¡ãã¾ããéçºããã¹ããªã©ã§ã¬ããªã±ã¼ã·ã§ã³ãè¡ãå ´åããã®åã»ããã¢ããã¯ã¨ã¦ãé »ç¹ã«ä½¿ç¨ããã¾ãã
GTIDã¸ã®å¯¾å¿
Nonlocking Replcopyã¯MySQLã¨MariaDBã®ä¸¡æ¹ã®GTIDã«å¯¾å¿ãã¦ãã¾ããGTIDã使ç¨ãã¦ããå ´åã§ãã修復ã³ãã¼ã®èãæ¹ã¯ååã®è¨äºã¨åæ§ã§ãã
ã¾ããGTIDã使ã£ãã¬ããªã±ã¼ã·ã§ã³ã«ã¤ãã¦ã¯ä»¥ä¸ã®è¨äºãæ¯éã覧ãã ããã
bizstation.hatenablog.com
ã¨ã©ã¼ã®ã¹ããã
ã¨ã©ã¼ã®ã¹ãããã«ã¤ãã¦ã¯ãMySQL 5.6以éã§gtid_mode=on
ã®å ´åã空ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ä»£æ¿ããæ¹æ³ã§ã¹ããããã¾ãããã以å¤ã®ãµã¼ãã¼ã¯sql_slave_skip_counter=1
ã使ã£ã¦ã¹ããããã¾ãã
ãã¸ã·ã§ã³æå®
type=0
ã¨ããå ´åã徿¥ã®ãã¤ããªãã°åã¨ãã¸ã·ã§ã³ã使ã£ã¦ãã°ãã¸ã·ã§ã³ã®æå®ããã¾ããMySQLã§gtid_mode=on
ã®å ´åã§ããã®æå®ã¯å¯è½ã§ãã
type=1
ã¨ããå ´åãMariaDBã®master_use_gtid = slave_pos
ã使ã£ã¦ãã°ãã¸ã·ã§ã³ã®æå®ããã¾ãã
type=2
ã¨ããå ´åãMySQLã®master_auto_position = 1
ã使ã£ã¦ãã°ãã¸ã·ã§ã³ã®æå®ããã¾ãã
ãã§ã¤ã«ãªã¼ãã¼ã§ã®æ³¨æç¹
GTIDã使ã£ããã¹ã¿ã¼ã¨è¤æ°ã®ã¹ã¬ã¼ãã«ãããã§ã¤ã«ãªã¼ãã¼æ§æããã¦ããã¨ãã®æ³¨æç¹ã説æãã¾ãã
ã¹ã¬ã¼ãã¯ãã§ã¤ã«ãªã¼ãã¼ã«ãã£ã¦ãã¹ã¿ã¼ã«ãªãå¯è½æ§ãããã¾ããï¼ããã§ã¯ä»¥éãã¹ã¬ã¼ãããææ ¼ãããã¹ã¿ã¼ãæ°ãã¹ã¿ã¼ã¨å¼ã³ã¾ããï¼
æ°ãã¹ã¿ã¼ã¯ãé
ãã®ããã¹ã¬ã¼ãã«èªèº«ã®ãã¤ããªãã°ãããã©ã³ã¶ã¯ã·ã§ã³ã転éããªããã°ãªãã¾ããã転éããå¯è½æ§ã®ããã®ã¯ãé
ãã¹ã¬ã¼ãã¨ã®å·®åã§ãã
æå³çã«é
ãããã¹ã¬ã¼ãããªããã°ãé
ãã¯ããããããªæéï¼ä¾ãã°1ç§ï¼ã§ãã
ä¾ãã°ãããã¹ã¬ã¼ãã修復ã³ãã¼ããã¤ããªãã°ãæ¶å»ãã¦ãããããã1ç§ä»¥ä¸çµã¦ã°ãæ°ãã¹ã¿ã¼ã«ãªã£ã¦åé¡ããã¾ããã修復ãã¦ãã1ç§ã§ãããç¾å®çã«ã¯ã»ã¨ãã©åé¡ãªãã§ãããã
ããããæå³çã«12æéé
ãããçã®è¨å®ãããã¹ã¬ã¼ããããå ´åããã¤ããªãã°ãæ¶å»ããã¹ã¬ã¼ãã¯ããããã12æé以ä¸çµããªãã¨æ°ãã¹ã¿ã¼ã«ãªãè³æ ¼ãããã¾ããããã§ã¤ã«ãªã¼ãã¼ã¹ã¯ãªãããªã©ãç¨æããããæéã¾ã§ã¯ææ ¼ã§ããªãã¨å¶å¾¡ããå¿
è¦ãããã¾ãã
Nonlocking Replcopyã§ãã¤ããªãã°ã«é¢é£ãããã©ã¡ã¼ã¿ã¯ä»¥ä¸ã®2ã¤ã§ãã
log_bin
master_resettable
MySQLã®GTIDã¨ãã以å¤ã®å ´åã§ã¯ãããã«å¯¾ãã対å¦ãç°ãªãã®ã§ãåãã¦èª¬æãã¾ãã
MySQL GTID
MySQLã®GTIDã¯ãã¹ã¿ã¼ã¨GTIDã»ããã§æ¯è¼ããã®ã§ãã¹ã¬ã¼ãä¸ã§ä½è¨ãªãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããã¨ãæ°ãã¹ã¿ã¼ã«ãªã£ãæã«ããã転éããã¦ãã¾ãã¾ããã§ãã®ã§master_resettable=1
ãæå®ãã¦ããã®ã¹ã¬ã¼ãã®ãã¤ããªãã°ããªã»ããããæ¹ããã¾ãããã¾ãããã ããªã»ããããã¨ãã¹ã¿ã¼ã«ãªã£ãã¨ãã«é
å»¶ã¹ã¬ã¼ãããã®ãã°è»¢éè¦æ±ã«çãããã¨ãã§ãã¾ãããé
å»¶ãããã¹ã¬ã¼ããããå ´åã¯ããã®é
å»¶æéãçµéããã¾ã§ã修復ããã¹ã¬ã¼ãã¯ãã¹ã¿ã¼ã«ãªããªãã¨ãã¼ã¯ãããã¨ãå¿
è¦ã§ãã
MariaDB GTID
MariaDBã®GTIDã®å ´åãlog_bin=0
ã¨ãã¦ã³ãã¼ã®å
容ããã¤ããªãã°ã«è¨é²ããªãããã«ãã¾ããããé
ãã¹ã¬ã¼ãã«å¯¾ãã¦ãåé¡ããã¾ããã
ããããã®ä¿®å¾©ããã¹ã¬ã¼ãã夿®µæ§æã§ãã¹ã¿ã¼ã§ãããå ´åã¯ãlog_bin=1
ã®å¿
è¦ãåºã¦ãã¾ãããã®å ´åãMySQLã®å ´åã¨åãããã«ãé
å»¶ãããã¹ã¬ã¼ããããå ´åã¯ããã®é
å»¶æéãçµéããã¾ã§ã修復ããã¹ã¬ã¼ãã¯ãã¹ã¿ã¼ã«ãªããªãã¨ãã¼ã¯ãããã¨ãå¿
è¦ã§ããããã«ã修復ç´å¾ã«ãã¹ã¿ã¼ä¸ã§ä½ããã®ãã©ã³ã¶ã¯ã·ã§ã³ãçºçãã¦ããããé
å»¶ã¹ã¬ã¼ãã«åæ ãããããã«ãã¾ããããããã§ãªãã¨ãé
å»¶ã¹ã¬ã¼ããã³ãã¼ã®å
容以éã®ãã¸ã·ã§ã³ãè¦æ±ãã¦ããã¾ããã
ã¾ã¨ã
2åã«æ¸¡ã£ã¦ã¬ããªã±ã¼ã·ã§ã³ã®å¾©æ§ã³ãã¼ã«ã¤ãã¦èª¬æãã¾ãããã¾ããéã«GTIDの詳細の記事ãæ¸ãã¾ããããã®3ã¤ã®è¨äºã§ãã¬ããªã±ã¼ã·ã§ã³ã®å¾©æ§ã«ã¤ãã¦ã¯ã ãããç¶²ç¾ ã§ãããã¨æãã¾ãã
ä»åããã¿ã¼ã³å¥ä¿®å¾©æ¹æ³ã®è¨äºãæ¸ãããã¨ã§ãèªåã®ä¸ã§ã修復æã®åé¡ã¨å¯¾å¦ããã¾ãæ´çã§ãã¾ããã
Nonlocking Replcopyã¯éçºç°å¢ãªã©ã§ã¯ã¨ã¦ã便å©ã§ããï¼éçºæã¯ããããããã§ããã«SQLã¹ã¬ãããæ¢ã¾ã£ã¦ãããã¾ãã®ã§ï¼è¨å®ãã¡ã¤ã«ããä½ã£ã¦ããã°ãã³ãã³ãä¸çºã§ã¬ããªã±ã¼ã·ã§ã³ã®ä¿®å¾©ãã§ãã¾ãã
ãããTransactdã使ããã£ããã«ãªã£ã¦ãããã°å¬ããã§ããã³ã¡ã³ãã大æè¿ï¼ãã§ãã
MySQL/MariaDB GTID ã¬ããªã±ã¼ã·ã§ã³è©³ç´°
ä»åã¯ãMySQL/MariaDB GTID ã¬ããªã±ã¼ã·ã§ã³ã®è©³ç´°ã説æãã¾ããããã¯ãTransactdã«ããã¬ããªã±ã¼ã·ã§ã³ã»ããã¢ããï¼ä¿®å¾©ï¼ãã¼ã«ãæ§ç¯ããéã«èª¿ã¹ããã®ã§ãã
主ã«å¾æ¥ã®ãã¤ããªãã°ã¨ãã¸ã·ã§ã³ã使ã£ãã¬ããªã±ã¼ã·ã§ã³ã¨GTIDã«ããã¬ããªã±ã¼ã·ã§ã³ã®éãã«ã¤ãã¦èª¬æãã¾ããããç¨åº¦å¾æ¥ã®ã¬ããªã±ã¼ã·ã§ã³ã®ã»ããã¢ãããªã©ãçè§£ãã¦ãããã¨ãåæã«ãã¦ãã¾ãã
Index
- ãªãGTIDãå¿ è¦ãªã®ã
- GTIDãæ´»ããã·ããªãª
- GTIDã«ãããã¸ã·ã§ã³ã®è§£æ±º
- å ·ä½çãªGTID
- GTIDã使ãããã®è¨å®
- MariaDBã§GTIDã使ã
- MySQLã§GTIDã使ã
- GTIDã»ãã
- GTIDã»ããã®è¡¨ç¾æ¹æ³
- GTIDã»ããã®æ¯è¼
- GTIDã¨å¾æ¥ã®æ¹æ³ã®æ··å¨
- æ°è¦ã»ããã¢ãã
- ã¹ã¬ã¼ãã§ããã¹ã¿ã¼ãæ°ãã¹ã¿ã¼ã«åãæ¿ãã
- ãã¦ã³ãããã¹ã¿ã¼ãã¹ã¬ã¼ã群ã«å ãã
- SQLã¹ã¬ããã®ã¨ã©ã¼ã修復ãã
- MySQLã«ãããããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ä¸è²«æ§ã®å¤æã容æãã«ã¤ãã¦
- ã¾ã¨ã
- ãã¾ã ã©ã£ã¡ããããï¼
ãªãGTIDãå¿ è¦ãªã®ã
ã¾ããæåã«ãªãGTIDãå¿ è¦ãªã®ã§ããããï¼ããè¨ããã¦ããã®ã¯ã
CHANGE MASTER TO
ã§ãã¤ããªãã°ãã¸ã·ã§ã³ããã¡ãã¡æå®ããªãã¦ãè¯ã
ã¨ãã£ããã®ã§ããããã»ã©å¤§ããåé¡ã§ã¯ç¡ãããã«æãã¾ããæ¬å½ã®ã¨ããä½ã®ããã§ããããï¼
ããã¯ãMariaDBã®ããã¥ã¡ã³ãã«æç¢ºã«æ¸ããã¦ãã¾ãã
- ãã¹ã¿ã¼ã¨è¤æ°ã¹ã¬ã¼ãã®æ§æã§ããã¹ã¿ã¼ããã¦ã³ãã¦ã¹ã¬ã¼ãã®ããããããã¹ã¿ã¼ã«ææ ¼ããã¨ãã«ãä»ã®ã¹ã¬ã¼ãããã¹ã¿ã¼ãåæ¿ãããã
CHANGE MASTER
ãçºè¡ãããããã®æã®ãã¸ã·ã§ã³æå®ã®åé¡ã解決ãã
ãã¹ã¿ã¼ããã¦ã³ããããã¹ã¬ã¼ã群ã®ä¸ãããã¬ããªã±ã¼ã·ã§ã³ã®é
ããæãå°ãªãã¹ã¬ã¼ãããã¹ã¿ã¼ã«ææ ¼*1ããã¾ãã
ä»ã®ã¹ã¬ã¼ãã¯æ°ãã¹ã¿ã¼ã«å¯¾ãã¦CHANGE MASTER
ãçºè¡ãã¦ãã¹ã¿ã¼ãåãæ¿ãã¾ããåé¡ãªã®ã¯ãã®ã¨ãã§ããåã¹ã¬ã¼ããã¨ã«æ§ãã¹ã¿ã¼ã®ãã¤ããªãã°åã¨ãã¸ã·ã§ã³ã§ã©ãã¾ã§ã¬ããªã±ã¼ããããã¯ããã£ã¦ãã¾ããããããæ°ãã¹ã¿ã¼ã§ããã¨ããã®ã©ã®ãã¡ã¤ã«åã§ãã¸ã·ã§ã³ãããã¤ãªã®ãã¯ããããªãã®ã§ãã*2
GTIDã¯ãã®åé¡ã解決ããããã«çã¾ãã¾ããã
MariaDBã®GTIDã®ç®çã¯ããã ãã§ãã
ï¼MySQLã®GTIDã«ã¯ããã«ããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ä¸è²«æ§ã®å¤æã容æã«ãããã¨ããç®çãå ãããã¦ãã¾ããããã«ã¤ãã¦ã¯ MySQLã§GTIDã使ã ã®é
ç®ã§èª¬æãã¾ããï¼
GTIDãæ´»ããã·ããªãª
ãã¹ã¿ã¼ã¨è¤æ°ã¹ã¬ã¼ãã®æ§æã§ãã¹ã¿ã¼ãåãæ¿ãããã§ã¤ã«ãªã¼ãã¼ãè¡ãã®ã§ããã°ãGTIDã®æ©æµã大ãã«åãããã¨ãã§ãã¾ãã
æ£ç¢ºã«ã¯ããå°ãéå®çã§ããã§ã¤ã«ãªã¼ãã¼ãè¡ãéã«ã¹ã¬ã¼ã群ã®ä¸ã§é
ãã¦ããã¹ã¬ã¼ãããã£ã¦ããããææ¸ãããã§ã¤ã«ãªã¼ãã¼ã§ãã
ãããé
ãã¦ããã¹ã¬ã¼ããåãæ¨ã¦ããªãã°ããã§ã¤ã«ãªã¼ãã¼ããæ°ãã¹ã¿ã¼ã¨ä»ã®ã¹ã¬ã¼ãã¯åããã¼ã¿ãæã£ã¦ããã®ã§ãæ°ãã¹ã¿ã¼ã®ãã¤ããªãã°ããªã»ããreset master
ãã¹ã¬ã¼ããreset slave
ãã¦ãã¸ã·ã§ã³æå®ãªãã§CHANGE MASTER
ããã°ã徿¥ã®æ¹æ³ã§ãæ£ããåæ¿ãã§ããããã§ãã
ããä¸ã¤ãæåã§ãã¹ã¿ã¼ãåæ¿ãã(ã¹ã¤ãããªã¼ãã¼)éã«ããã¹ã¦ã®ã¹ã¬ã¼ããåæããã®ãå¾ ããªãã¦è¯ããªãã¾ããåæã§ãã¦ããã¹ã¬ã¼ããï¼å°ããã°ãããæ°ãã¹ã¿ã¼ã«ãããã¨ã§é ãã¦ããã¹ã¬ã¼ãã¯ãã®æ°ãã¹ã¿ã¼ãããã¼ã¿ãåãåããã¨ãã§ããããã«ãªãã¾ããè¿ éãªã¹ã¤ãããªã¼ãã¼ãã§ãã¾ãã
ä¸è¨ã®å¿ è¦ããªããã°GTIDã®æ©æµã¯ãªãã徿¥ã®ãã¤ããªãã°ã¨ãã¸ã·ã§ã³ã使ã£ãã¬ããªã±ã¼ã·ã§ã³ã¨ã»ã¼åçã®æ©è½ã§ããï¼è¿½è¨ããã«ããã¹ã¿ã¼ã«ãªãã¨è©±ãããããããªãã¾ãã®ã§ããã§ã¯ããã¯é¤ãã¦èãã¾ãï¼
GTIDã«ãããã¸ã·ã§ã³ã®è§£æ±º
ã¾ãæåã«ããã¹ã¿ã¼åãæ¿ãæã®ãã¸ã·ã§ã³åé¡ã®è§£æ±ºæ¹æ³ã«ã¤ãã¦èª¬æãã¾ãã解決ã®èãæ¹èªä½ã¯MariaDBãMySQLãã»ã¨ãã©åãã§ããï¼å®è£ ã¨æ±ãããã®ã³ãã³ãã¯ç°ãªãã¾ãï¼
徿¥ã¯ããã¹ã¿ã¼ãåãæ¿ãã£ãã¨ãã«ãã¹ã¬ã¼ããæ°ãã¹ã¿ã¼ã«å¯¾ãã¦ãæ§ãã¹ã¿ã¼ã®ãã®ãã¸ã·ã§ã³ãã¨è¦æ±ãã¦ããæ°ãã¹ã¿ã¼ã®ãã¤ããªãã°ã¯ãµã¼ãã¼ãç°ãªãã®ã§æå³ããªããã©ãã®ãã¨ãããããªãç¶æ ã§ããããã®ãããæ°ãã¹ã¿ã¼ã®ãã¤ããªãã°ãã¹ãã£ã³ããã¹ã¬ã¼ããé©ç¨æ¸ã¿ã®ä½ç½®ãèªåã§æ¢ãããããã¾ããã§ãããä½ç½®ãæ¢ãã®ãæç¢ºãªç®å°ãããããã§ããªããããç¨åº¦ã®é·ããä¸è´ããé¨åãæ¢ããããªãã£ãããã§ãã
ããã§ããã¤ããªãã°ã«ç®å°ã¨ãã¦ãã©ã³ã¶ã¯ã·ã§ã³ãã¨ã«çªå·ãæ¯ã£ã¦ããããä¸ç·ã«è¨é²ããããã«ãã¾ããããã®çªå·ãGTIDã§ãããµã¼ãã¼ãç°ãªã£ã¦ãIDãéè¤ããªãããã«ã°ãã¼ãã«ã«ã¦ãã¼ã¯ãªçªå·ã§ããï¼Global Transaction IDï¼
ã¾ããã¹ã¬ã¼ãã¯ãã¤ããªãã°ã®æ¸ãè¾¼ã¿ã®éã«ããã¹ã¿ã¼ãã転éããããã©ã³ã¶ã¯ã·ã§ã³ã®GTIDãå¿ ã転è¨ããããã«ãã¾ãããããããã¨ã§å¾ã§ãã¹ã¿ã¼ã«ãªã£ãã¨ãã¦ããã¹ã¬ã¼ãããGTIDããæãã¦ããããã°ãã¤ããªãã°ã®ãã®å ´æãæ£ããæ¢ãåºãã¦è¿ããã¨ãã§ãã¾ãã
GTIDã使ã£ãã¬ããªã±ã¼ã·ã§ã³ã®å¦çãã¾ã¨ããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
- ãã¹ã¿ã¼ã¯ãã©ã³ã¶ã¯ã·ã§ã³ãã¨ã«éè¤ããªãIDãæ¯ããããããã¤ããªãã°ã«è¨é²ãã
- ãã¹ã¿ã¼ã¯ã¹ã¬ã¼ãããã®ãã¤ããªãã°è¦æ±ã«GTIDã®æ å ±ãå ãã¦è»¢éãã
- ã¹ã¬ã¼ãã¯ãã¹ã¿ã¼ããåãåã£ããã©ã³ã¶ã¯ã·ã§ã³ãèªèº«ã®ãã¤ããªãã°ãè¨é²ããéã«ãã®IDï¼GTIDï¼ã転è¨ãã
ãããã®æºåããã£ãããã§ã以ä¸ã®ããã«ãããã¨ã§ãæ§ãã¹ã¿ã¼ã§ã®ãã¸ã·ã§ã³ãæ°ãã¹ã¿ã¼ã§ã¯ã©ããã解決ã§ããããã«ãªãã¾ãã
- ã¹ã¬ã¼ãã¯ãã¤ããªãã°ãã°ãã¸ã·ã§ã³ã«ä»£ãã¦æå¾ã«åãåã£ãGTIDã§è¦æ±ãã
- ãã¹ã¿ã¼ã¯ãã¤ããªãã°ä¸ã®GTIDãæ¢ãæ¬¡ã®ãã©ã³ã¶ã¯ã·ã§ã³ãè¿ã
å ·ä½çãªGTID
GTIDã¯ãµã¼ãã¼ãç°ãªã£ã¦ãéè¤ããªãã¦ãã¼ã¯ãªçªå·ã§ãããMySQLã¨MariaDBã§ã¯çææ¹æ³ãç°ãªãã¾ãã
MariaDB | domain-id + server-id + ãµã¼ãã¼ãã¨ã®ãã©ã³ã¶ã¯ã·ã§ã³çªå· |
MySQL | UUID + ãµã¼ãã¼ãã¨ã®ãã©ã³ã¶ã¯ã·ã§ã³çªå· |
322e3d16-355f-11e3-9ee3-00155d031304
ã¨ãã£ãçªå·ã§ããMariaDBã¯å¾æ¥ã®server-idã®åã«domain-idãä»å ãããã¨ã§ã¦ãã¼ã¯ãªãã®ã¨ãã¦ãã¾ããdomain-idã¯my.cnfã§æå®ãã¾ããä½ãæå®ããªããã°0ã§ãã
å®éã®çªå·ã¯ãããã以ä¸ã®ããã«æåå表ç¾ããã¾ãã
MariaDB | 0-1-1234 |
MySQL | 322e3d16-355f-11e3-9ee3-00155d031304:1234 |
GTIDã使ãããã®è¨å®
GTIDã使ãããã®my.cnfã®è¨å®ã説æãã¾ãã
MariaDB/MySQLå ±é | server-id = 1 log-bin=mysqld-bin binlog-format = ROW log-slave-updates |
MariaDB | gtid_domain_id = 1 (æ¸ããªããã° gtid_domain_id = 0) |
MySQL | gtid_mode=ON enforce-gtid-consistency |
MariaDBã¯GTIDã®åºæ¬é¨åãèªåã§æ±ºãããã¨ãã§ãã¾ãããMySQLã¯èªåã§UUIDãçæãã¾ããçæããUUIDã¯auto.cnfã«è¨é²ããã¦ãã¾ããã¹ã¬ã¼ãã®ãã¼ã¿ããã¹ã¿ã¼ããã³ãã¼ããéã«ãããã³ãã¼ãã¦ãã¾ãã¨ãUUIDãéè¤ãã¦ãã¾ãã®ã§ãã³ãã¼ããªãããã«ãã¾ãã
ã§ã¯å®éã®ä½¿ãæ¹ã説æãã¾ããMariaDBã¨MySQLã§ã¯ç°ãªã£ã¦ããã®ã§ããããåãã¦èª¬æãã¾ãã
MariaDBã§GTIDã使ã
MariaDBã§ã¯ãã¤ããªãã°ãã¸ã·ã§ã³ãGTIDã«ä»£ãã£ãã ãã¨èãã¦ã»ã¼å·®æ¯ãããã¾ãããå¤å°ãã©ã¡ã¼ã¿ã®æå®æ¹æ³ãéãã¾ããã徿¥ã®æ¹æ³ã¨ã®äºææ§ãé«ããé常ã«ä½¿ãæããªã£ã¦ãã¾ãã
ã¾ããMariaDB 10.0以éã§ã¯ãserver-idãæå®ããã¦ããã°èªåã§GTIDãæ¯ããã¦ãããããç¹å¥ãªè¨å®ã¯ã»ã¨ãã©ããã¾ãããGTIDã§ãã¸ã·ã§ã³ãæå®ãã¦ããããã徿¥éãæå®ãã¦ãä½ãåé¡ããã¾ããã
æ§æãè¡ãåæºåã¨ãã¦ããã¹ã¿ã¼/ã¹ã¬ã¼ãã¨ãã«RESET SLAVE ALL
ã¨RESET MASTER
ãäºåã«è¡ããç¾å¨ã®ãã°ãã¯ãªã¢ãã¦ããããã«ãå§ããã¾ãããã§ã¤ã«ãªã¼ãã¼ããéã«ãç¡å¹ãªãã°ã«ãã誤åä½ã鲿¢ã§ãã¾ããã¾ãããã¹ã¿ã¼ã® mysql.gtid_slave_posãã¼ãã«ã®ã¬ã³ã¼ããå¿
ãåé¤ãã¦ããã¦ãã ãããMariaDBã®ãã°ã§RESET SLAVE ALL
ãè¡ã£ã¦ããã®å¤ãã¯ãªã¢ãã¦ããã¾ãããããã«éå»ã®æå³ã®ãªãæ
å ±ãæ®ã£ã¦ããã¨ããã¦ã³ãããã¹ã¿ã¼ãã¹ã¬ã¼ã群ã«å ããé誤åä½ãã¾ãã
2ã¤ã®GTIDãã¸ã·ã§ã³ã¢ã¼ã
ã¹ã¬ã¼ããã¹ã¿ã¼ãæã«ãã¹ã¿ã¼ã«ãã¤ããªãã°å 容ã®éä¿¡ãè¦æ±ããéã«ã¯ã2種é¡ã®GTIDãã¸ã·ã§ã³ãããã¾ãã
gtid_slave_pos
ï¼ã¹ã¬ã¼ãSQLã¹ã¬ãã*3ãæå¾ã«å®è¡ãããã©ã³ã¶ã¯ã·ã§ã³ã®GTIDgtid_current_pos
ï¼æå¾ã«å¦çãããã©ã³ã¶ã¯ã·ã§ã³ã®GTID
2ã¤ã®éãã説æãã¾ããgtid_slave_pos
ã¯ããã¹ã¿ã¼ãã転éããããã©ã³ã¶ã¯ã·ã§ã³ã®ãã¡ãæå¾ã«å®è¡ããããã®ã®GTIDã§ãã䏿¹ãgtid_current_pos
ã¯ããã¹ã¿ã¼ãã転éããããã©ã³ã¶ã¯ã·ã§ã³ã ãã§ãªããã¹ã¬ã¼ãã§ç´æ¥å®è¡ããããã©ã³ã¶ã¯ã·ã§ã³ãå«ãã¦æå¾ã«å¦çãããã®ã®GTIDã§ãã
ã¹ã¬ã¼ãã§ç´æ¥å®è¡ããããã©ã³ã¶ã¯ã·ã§ã³ããªããã°ãgtid_slave_pos
ã¨gtid_current_pos
ã¯åãå¤ã«ãªãã¾ãã
SQLã¹ã¬ããã¨ã©ã¼ã®ä¿®å¾©ãªã©ã§ãã¹ã¬ã¼ãã§ç´æ¥å®è¡ããããã©ã³ã¶ã¯ã·ã§ã³ãããå ´åã¯ãç°ãªã£ãå¤ã«ãªãå¾ã¾ãã
ã¹ã¬ã¼ãã§ç´æ¥å®è¡ããããã©ã³ã¶ã¯ã·ã§ã³ã¯ãå½ç¶ãã¹ã¿ã¼ã«ã¯åå¨ãã¾ããããã®ãããgtid_current_pos
ã¯ãã¹ã¿ã¼ã®ãã¤ããªãã°ã«åå¨ããªãGTIDã®å¯è½æ§ãããã¾ãããã®å ´åã¯ãã°è»¢éãã§ããªããããã¹ã¬ã¼ãã¯I/Oã¨ã©ã¼ã§éå§ã§ãã¾ããã
ã¹ã¬ã¼ãã®éå§æã«gtid_current_pos
ã使ç¨ããå¿
è¦ã¯ãªãããã«æãã¾ãããå¾è¿°ããããã¦ã³ãããã¹ã¿ã¼ãã¹ã¬ã¼ã群ã«å ãããã®éã«ã¯ä¾¿å©ã§ãã
æ°è¦ã»ããã¢ãã
ã¾ãããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ãã¼ã¿ãäºåã«(ãã¼ã¿ã³ãã¼ãmysqldumpã使ã£ã¦)åãå
容ã«ãã¦ããã®ã¯å¾æ¥ã¨åãã§ãã
ã¬ããªã±ã¼ã·ã§ã³ãéå§ãããã¤ããªãã°åã¨ãã¸ã·ã§ã³ã¯CHANGE MASTER TO
ã§æå®ãã¦ãã¾ããããgtid_slave_pos
ã°ãã¼ãã«å¤æ°ã«GTIDãè¨å®ãã¦ããCHANGE MASTER TO
ã§ master_use_gtid=slave_pos
ã¨ãã¾ãã
è¨å®ãã¹ãGTIDã¯ãã¹ã¿ã¼ã®select @@gtid_binlog_pos;
ã§åå¾ãã¾ããã¾ããTransactdã§ã¯database::beginSnapshot(binlogPos)
ã®binlogPos->gtid
ã§ã¹ãããã·ã§ããã®éå§ã¨åæã«åå¾ã§ãã¾ãã
SET GLOBAL gtid_slave_pos = "0-1-1234"; CHANGE MASTER TO master_host="master-host", master_port=3306, master_user="rep_useer", master_password="6789", master_use_gtid=slave_pos; START SLAVE;
ã¹ã¬ã¼ãã§ããã¹ã¿ã¼ãæ°ãã¹ã¿ã¼ã«åãæ¿ãã
ã¹ã¬ã¼ãã®SQLã¹ã¬ããã§æå¾ã«å¦çããGTIDï¼ãã®ãã¸ã·ã§ã³ãslave_posã¨å¼ã³ã¾ãï¼ããããã°ããã以éãæ°ãã¹ã¿ã¼ã«è¦æ±ããã°æ¸ã¿ã¾ãããããå®éã«ã¯ãã¹ããæå®ãç´ãã ãã§ãé
ãã¦ããã¹ã¬ã¼ããç°¡åã«åæ¿ã§ãã¾ãããªããªããgtid_slave_pos
ã°ãã¼ãã«å¤æ°ã«ã¯æå¾ã«SQLã¹ã¬ãããå¦çããGTIDãå
¥ã£ã¦ããããã§ãã
CHANGE MASTER TO master_host="master-host", master_port=3306
ã§OKã§ãããã¸ã·ã§ã³ã®æå®ã¯ä¸è¦ã§ãã
ã¹ã¬ã¼ãããã¹ã¿ã¼ã«ææ ¼ãããã¨ãã¯ãæå¾ã®GTIDãè¨é²ãã¾ããããæ§ãã¹ã¿ã¼ã«æªã¬ããªã±ã¼ãã®ãã¼ã¿ãæ®ã£ã¦ããã¨ãã®ããã§ãã
ããããã®ãããªãã¼ã¿ãããå ´åã¯ãæ§ãã¹ã¿ã¼ã使ããããã«ãªã£ãã䏿çã«æ°ãã¹ã¿ã¼ãæ§ãã¹ã¿ã¼ã®ã¹ã¬ã¼ãã¨ãã¦ãã®GTIDã§éå§ãã¾ããããããã°ãæ§ãã¹ã¿ã¼ã«ãããªæ®ã£ã¦ããªããã¼ã¿ãæ°ãã¹ã¿ã¼ã«è£ã¦ããããã¨ãã§ãã¾ããï¼ãããã§ããããã®æ§ãã¹ã¿ã¼ãã¹ã¬ã¼ã群ã«è¿½å ãããã¨ãã§ãã¾ããï¼
ä½è«ã§ãããä»®ã«ã¹ã¬ã¼ãã徿¥ã®ãã¤ããªãã°åã¨ãã¸ã·ã§ã³ãæå®ãã¦ããã¨ãã¾ããããã§ããCHANGE MASTER TO master_host="master-host", master_port=3306, master_use_gtid=current_pos
ã ãã§GTIDã使ã£ããã¹ã¿ã¼åæ¿ãè¡ãã¾ãã
ãã¦ã³ãããã¹ã¿ã¼ãã¹ã¬ã¼ã群ã«å ãã
ãã¦ã³ãããµã¼ãã¼ã®å復ãå®äºããã¹ã¬ã¼ã群ã«å ããéããã®ãµã¼ãã¼ã¯ã¹ã¬ã¼ãã«ãªã£ããã¨ããªãã®ã§ãSQLã¹ã¬ããã§æå¾ã«å¦çããGTIDï¼slave_pos
ï¼ãããã¾ãããæå¾ã«å¦çããGTIDã¯èªèº«ãæå¾ã«å¦çãããã¸ã·ã§ã³ï¼current_pos
ï¼ã§ãããã®å ´åã¯ãCHANGE MASTER TO master_use_gtid = current_pos
ãæå®ãã¾ãããã¸ã·ã§ã³ã®æå®ã¯ä¸è¦ã§ããã¾ãã¯ãæå¾ã«å¦çããGTIDã
select @@gtid_binlog_pos;
ã§èª¿ã¹ã¦ãæ°è¦ã»ããã¢ããã¨åæ§ã«æå®ãã¦ãOKã§ãã
SQLã¹ã¬ããã®ã¨ã©ã¼ã修復ãã
MariaDBã¯å¾æ¥éãã®æ¹æ³ã使ç¨ã§ãã¾ããsql_slave_skip_counterã§ã¤ãã³ããã¹ãããããããã¨ã©ã¼ã®åå ã¨ãªã£ã¦ããåé¡ãåãé¤ãã¦å度ã¹ã¿ã¼ãããæ¹æ³ã§ãããã ããMariaDB 10.0.12以前はsql_skip_counterが使用できなくなっていましたã®ã§ããã以éã®ãã¼ã¸ã§ã³ã«ãã¾ãããã
ã¾ããã¨ã©ã¼ã®åå ã¨ãªã£ã¦ããåé¡ãåãé¤ãéããã®å¦çããã¤ããªãã°ã«è¨é²ãããªãæ¹ãããå ´åã¯ãäºåã«SET sql_log_bin=OFF
ã¨ãè¨é²ãããªãããã«ãã¾ãã
ãã¼ãã«ããã¼ã¿ãã¼ã¹ãã¨ã³ãã¼ãç´ãããå ´åã¯ã以ä¸ã®è¨äºãåèã«ãã¦ãã ããã
bizstation.hatenablog.com
MySQLã§GTIDã使ã
MySQLã§ã®ä½¿ãæ¹ã説æããåã«ãMariaDBã«ã¯ãªãGTIDã®ããä¸ã¤ã®ç®çããã¹ã¿ã¼ã¨ã¹ã¬ã¼ããä¸è²«ãã¦ãããã©ããã夿ãããã«ã¤ãã¦èª¬æãã¾ãã
GTIDã»ãã
MySQLã®GTIDã«ãããã°ã®è»¢éã¯ã徿¥ã®ãã°ãã¡ã¤ã«åã¨ãã¸ã·ã§ã³ã§è¡ã£ã¦ãããã¤ã³ãæå®ï¼ä½ç½®æå®ï¼ã§ãªãããã¹ã¿ã¼ã»ã¹ã¬ã¼ãã®ããããã§å¦çãããã¹ã¦ã®ãã©ã³ã¶ã¯ã·ã§ã³çªå·ãä¿æããããããåããã©ãããæ¯è¼ããä¸è¶³åãè¦æ±ããã¨ããæ¹æ³ã§ãã
ããªãã¡ããã¤ã³ãã管çããã®ã§ã¯ãªããGTIDã®ã»ããã管çãã¾ãã
ãã®ä¸è¶³åãè£ãæ¹æ³ã§ããã¹ã¿ã¼ã¨ã¹ã¬ã¼ããä¸è²«ãã¦ãããã©ããã夿ããããå®ç¾ãããã¨ãã¦ãã¾ããããããã¨ãã¦ãã¾ããã¨ããã®ã¯ãæãéããããããã£ã¦ããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ãã¼ã¿ãåä¸ã§ãããã¨ã¯ä¿è¨¼ã§ããªãããã§ãã
GTIDã»ããã®è¡¨ç¾æ¹æ³
å¦çããGTIDããã¹ã¦åæããã¨å¤§å¤ãªéã«ãªã£ã¦ãã¾ããããé£ç¶ããIDã®å ´åã1-100ãã¨ãã£ãããã«æåã¨æå¾ã®çªå·ã®ã¿ãä¿æãã¾ãã
å
·ä½çã«ã¯ãID1ï½100ã§ããã°322e3d16-355f-11e3-9ee3-00155d031304:1-100
ã®ããã«è¡¨ç¾ãã¾ãããã¹ã¿ã¼ãåæ¿ããå ´åãªã©ã§ã¯ãã¹ã¬ã¼ãã®å¦çæ¸ã¿ã®GTIDã»ããã«ã¯ãæåã®ãã¹ã¿ã¼ã®åã¨æ°ãã¹ã¿ã¼ã®åã®ä¸¡æ¹ãå«ã¾ãã¾ããGTIDã»ããã¯322e3d16-355f-11e3-9ee3-00155d031304:1-100,b17243ca-11c2-11e6-95ee-00ffcc08618a:1-1200
ã®ããã«ã«ã³ãã§åºåãåæããã¾ãã
GTIDã»ããã®æ¯è¼
ãã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã§é©ç¨ããã¦ãããã©ã³ã¶ã¯ã·ã§ã³ãæ¯è¼ãã¾ãããé©ç¨ãããGTIDã»ãããã©ãã§ç¢ºèªããã説æãã¾ãã
ãµã¼ãã¼ | ã³ãã³ã | åå | ä¾ |
---|---|---|---|
ãã¹ã¿ã¼ | SHOW MASTER STATUS | Executed_Gtid_Set | 322e3d16-355f-11e3-9ee3-00155d031304:1-100 |
ã¹ã¬ã¼ã | SHOW SLAVE STATUS | Executed_Gtid_Set | 322e3d16-355f-11e3-9ee3-00155d031304:1-100 |
Executed_Gtid_Set
ã¯ãç¾å¨åå¨ãããã¤ããªãã°ã«è¨é²ããã¦ãããã¹ã¦ã®GTIDï¼ã°ãã¼ãã«å¤æ°gtid_executed
ï¼ã¨ãæ¢ã«æ£ãããã¼ã¸ï¼åé¤ï¼ï¼gtid_purged
ï¼ããããã¹ã¦ã®GTIDã®ä¸¡æ¹ãå«ãããã®ã§ããExecuted_Gtid_Set
ãã¯ãªã¢ããã«ã¯ããã¹ã¿ã¼/ã¹ã¬ã¼ãã«é¢ããã RESET MASTER
ãè¡ãã¾ããRESET MASTER
ã¯åæã«ãã¤ããªãã°ãæ¶å»ãã¾ããgtid_purged
ã¯ãgtid_executed
ã空ã®å ´åã«éã£ã¦å¤æ´å¯è½ã§ããå¾ã£ã¦ããã¹ã¿ã¼ãã¼ã¿ãã¹ã¬ã¼ãã«ã³ãã¼ãã¬ããªã±ã¼ã·ã§ã³ãéå§ããå ´åã¯ãã¹ã¬ã¼ãã«ã¦
RESET MASTER
ãè¡ã£ããã¨ãgtid_purged
ã«ãã¹ã¿ã¼ã®Executed_Gtid_Set
ã®å
容ãä¸ãããã¨ã§ãåæ¹ã®é©ç¨æ¸ã¿GTIDã»ããã¯åãã§ããã¨å¤æããã¾ãã
GTIDã¨å¾æ¥ã®æ¹æ³ã®æ··å¨
MySQL 5.6ã§ã¯ãGTIDã使ãå ´åã¯ãã¹ã¦ã®ãµã¼ãã¼ã§GTIDã使ç¨ããªããã°ãªãã¾ãããä¸åº¦ãã¹ã¦ã®ãµã¼ãã¼ãã·ã£ãããã¦ã³ãã¦æå¹åããå¿ è¦ãããã¾ãã5.7ããã¯ãã¼ãªã³ã°ã¢ãããã¼ãã¨å¼ã°ããæ¹æ³ã§é 次æå¹åã§ããããã§ããï¼ããã«ã¤ãã¦ã¯æªèª¿æ»ã§ããï¼
æ°è¦ã»ããã¢ãã
ã¾ãããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ãã¼ã¿ãäºåã«(ãã¼ã¿ã³ãã¼ãmysqldumpã使ã£ã¦)åãå
容ã«ãã¦ããã®ã¯å¾æ¥ã¨åãã§ãã
MySQLã®GTIDã¬ããªã±ã¼ã·ã§ã³ã§ã¯åæ¹ã®GTIDã»ãããæ¯è¼ããã®ã§ãgtid_purged
ã«ãã¹ã¿ã¼ã®Executed_Gtid_Set
ãã»ãããã¦ãå®è¡æ¸ã¿GTIDã»ããåãã§ããããã«ãã¦ããéå§ãã¾ãã
è¨å®ãã¹ãGTIDã¯å¾æ¥ã¨åæ§ãã¹ã¿ã¼ã®SHOW MASTER STATUS
ã§åå¾ãã¾ããã¾ããTransactdã§ã¯database::beginSnapshot(binlogPos)
ã®binlogPos->gtid
ã§ãã¹ãããã·ã§ããã®éå§ã¨åæã«GTIDã»ãããåå¾ã§ãã¾ãã
RESET MASTER; SET GLOBAL gtid_purged="322e3d16-355f-11e3-9ee3-00155d031304:1-100"; CHANGE MASTER TO master_host="master-host", master_port=3306, master_user="rep_useer", master_password="6789", auto_position=1; START SLAVE;
Executed_Gtid_Set
ã¯é常ã«é·ãæååã«ãªãå ´åãããã徿¥ã®ãã¤ããªãã°åã¨ãã¸ã·ã§ã³ããè¨å®ãæãã¨ã¯è¨ãããããã®ã§ãã
ãªããmysqldumpã使ç¨ããã¨ãã³ããã¡ã¤ã«ã®æå¾ã®æ¹ã«SET @@GLOBAL.GTID_PURGED='322e3d16-355f-11e3-9ee3-00155d031304:1-100';
ã®ä¸æãèªåã§å«ãã¦ããã¾ãã
ã¹ã¬ã¼ãã§ããã¹ã¿ã¼ãæ°ãã¹ã¿ã¼ã«åãæ¿ãã
ããã¯ã¨ã¦ãç°¡åã§ãCHANGE MASTER TO master_host="master-host", master_port=3306, master_user="rep_user", master_password="password", auto_position=1;
ã¨ããã ãã§ããæ°ãã¹ã¿ã¼ã®GTIDã»ããã¨ã¹ã¬ã¼ãã®GTIDã»ãããæ¯è¼ãã¦ãä¸è¶³ãããã°è£ã£ã¦ããã¾ãããã¸ã·ã§ã³ã®æå®ã¯ä¸è¦ã§ãã
ã¹ã¬ã¼ãããã¹ã¿ã¼ã«ææ ¼ãããã¨ãã¯ãæå¾ã®ãã¤ããªãã°åã¨ãã¸ã·ã§ã³ãè¨é²ãã¾ãããã
ãããæ§ãã¹ã¿ã¼ã«ãããªãæªã¬ããªã±ã¼ããã¼ã¿ãæ®ã£ã¦ããåããã£ãå ´åã¯ããã¨ã§ãã®åãæ°ãã¹ã¿ã¼ã«è£ãã¾ãããã®ã¨ããæ°ãã¹ã¿ã¼ãããä¸åº¦æ§ãã¹ã¿ã¼ã®ã¹ã¬ã¼ãã«ããã ãã§ã¬ããªã±ã¼ããã¦ãããã§ããããï¼ãããã¯ã ãã§ããGTIDã使ãã¨ã»ãã管çãªã®ã§ããã®ããããªããã¨ã«ãªã£ã¦ãã¾ãã¾ããããã¯ã徿¥ã®ãã¤ããªãã°åã¨ãã¸ã·ã§ã³ã使ã£ã¦ä¸è¶³åã ããã¬ããªã±ã¼ããã¦ãã ããã
ãã¦ã³ãããã¹ã¿ã¼ãã¹ã¬ã¼ã群ã«å ãã
ãããã¨ã¦ãç°¡åã§ãCHANGE MASTER TO master_host="master-host", master_port=3306, master_user="rep_user", master_password="password", auto_position=1;
ã¨ããã ãã§ããæ°ãã¹ã¿ã¼ã®GTIDã»ããã¨ãã¦ã³ããæ§ãã¹ã¿ã¼ã®GTIDã»ãããæ¯è¼ãã¦ä¸è¶³ãããã°èªåã§è£ã£ã¦ããã¾ãããã¸ã·ã§ã³ã®æå®ã¯ä¸è¦ã§ãã
SQLã¹ã¬ããã®ã¨ã©ã¼ã修復ãã
çµè«ããè¨ãã¨ãããã¯ã¨ã¦ãåä»ã§ãããã¹ã¿ã¼/ã¹ã¬ã¼ãã®å¦çæ¸ã¿GTIDã»ããã¯åãã§ãªããã°ãªãããä¸ç¨æã«ã¹ã¬ã¼ãã«å¤æ´ãå ããã¨ããã®æã¯ããã¦ããããããã¹ã¿ã¼ã«ãªã£ãéã«ã¯ãã®å¤æ´ãä»ã®ã¹ã¬ã¼ãã«ã転éããã¦ãã¾ãã¾ããå
容ã«ãã£ã¦ã¯ãã¹ã¦ã®ã¹ã¬ã¼ãã忢ãã¦ãã¾ãåå ã«ãªã£ãããã¾ãã
ã¾ããéããã»ããã§æ¯è¼ããæ§è³ªä¸sql_slave_skip_counter
ã¯ä½¿ç¨ã§ãã¾ãããä»®ã«ä½¿ç¨ã§ããã¨ãã¦ããGTIDã»ããã«é£ãéããã§ãã®ã§ãã®åã転éãããã¨ãã¦ãã¾ãã¾ãã
ããã§ãã¨ã©ã¼ãèµ·ããGTIDçªå·ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®å
容ãä»ã®å
容ã«å¤ãã¦ãã¾ãï¼ä»£æ¿ï¼ã¨ããæ¹æ³ã§ãSQLã¨ã©ã¼ãåé¿ãã¾ãã
ããã¯MySQLã®2ã¤ã®ç¹æ§ãå©ç¨ãã¦è¡ããã®ã§ãã
gtid_next
夿°ã§ããããè¡ããã©ã³ã¶ã¯ã·ã§ã³ã®GTIDãæå®ã§ãã- æ¢ã«é©ç¨æ¸ã¿ã®GTIDã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãã¨ã©ã¼ã«ãªããåã«ã¹ãããããã
ããããå©ç¨ãã¦ä»¥ä¸ã®ããã«ããã¨ãsql_slave_skip_counter
ã¨åãããã«åé¡ã®ã¤ãã³ããã¹ãããã¾ãã¯ä¿®å¾©ã§ãã¾ãã
SET gtid_next="322e3d16-355f-11e3-9ee3-00155d031304:101"; START TRANSACTION ... //ããã«å復å¦çãåã«ã¹ãããããããã°ä½ãããcommit COMMIT START SLAVE;
ããã§ãgtid_next
ã«æå®ããGTIDãããã¤ãªã®ã調ã¹ãæ¹æ³ã説æãã¾ãã
SQLã¨ã©ã¼ãèµ·ãããå ´åSHOW SLAVE STATUS
ã®Last_SQL_Error
ã«ãã®å
å®¹ãæ¸ããã¾ãããããããã¤ããªãã°åã¨ãã¸ã·ã§ã³ã¯è¨è¼ããã¾ãããGTIDã¯ããã¾ãããExecuted_Gtid_Set
ã®æ«å°¾ã«ã¯æå¾ã«é©ç¨ãããGTIDãæ¸ããã¦ãã¾ããä¾ãã°322e3d16-355f-11e3-9ee3-00155d031304:1-101
ã§ããã°322e3d16-355f-11e3-9ee3-00155d031304:101
ãæå¾ã®IDã§ããé常ã¨ã©ã¼ãèµ·ãããGTIDã¯ãã®æ¬¡ã®IDï¼102ï¼ã§ãã
è©±ã¯æ»ãã¾ãããä»®ã«å ã»ã©ã®ã¨ã©ã¼ãä¿®æ£ããã¹ã¬ã¼ãããã¹ã¿ã¼ã«ãªã£ã¦ãä»ã®ã¹ã¬ã¼ãã«ãã®ä¿®æ£å 容ãé©ç¨ããã¨ã¾ããå ´åã¯ãããã«ã
FLUSH LOGS; PURGE BINARY LOGS TO 'mysql-bin.xxxx';
ã®ããã«ãã¦ããã°ãããã©ã³ã¶ã¯ã·ã§ã³ã®å
容ããã¼ã¸ãã¾ãã¾ããããé
ããã¹ã¬ã¼ãããã®GTIDãè¦æ±ããã¨ãæ¢ã«ãã¼ã¸æ¸ã¿ã§é©ç¨ã§ããªããã¨ãã£ãã¨ã©ã¼ã«ãªã£ã¦ãã®ã¹ã¬ã¼ãã¯åæ¢ãã¦ãã¾ãã¾ãããç¡ç¨ãªãã©ã³ã¶ã¯ã·ã§ã³ãé©ç¨ãã¦é²ãã§ãã¾ãããã¯ãã·ãªã¯ãã§ãã*4
ããä¸ã¤ã®æ¹æ³ã¯ãç¹å®ã®ãã¼ãã«ããã¼ã¿ãã¼ã¹ã«éå®ã§ããå ´åã«ãããã®ã¿åã³ãã¼ããæ°è¦ã»ããã¢ããåæ§ã«
RESET MASTER;
SET GLOBAL gtid_purged="322e3d16-355f-11e3-9ee3-00155d031304:1-100";
START SLAVE;
ã¨ãããã¨ã§ããããã以ä¸ã®è¨äºãåèã«ãã¦ãã ããã
bizstation.hatenablog.com
MySQLã«ãããããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ä¸è²«æ§ã®å¤æã容æãã«ã¤ãã¦
GTIDã»ããã®ä¸è´ãè¦æ±ããMySQLã®å®è£ ã¯ãä¸è¦ããã¨ä¸è²«æ§ãä¿è¨¼ãããããã«è¦ãã¾ããããããåæã»ããã¢ããæã®ãã¼ã¿éãããSQLã¹ã¬ããã®ã¨ã©ã¼ä¿®å¾©ãªã©ãéç¨ç®¡çã®ä»æ¹ã«ãã£ã¦ç°¡åã«çç¾ããç¶æ ãçãã¾ãããã®çç¾ã¯å¾æ¥ã®æ¹æ³ãMariaDBã§ãå ¨ãåæ§ã§ãGTIDã»ããã«ããç¹å¥ãªå¹æã¯ããã¾ããã
ããã§ããã¹ã¬ã¼ãããã¤ããªãã°ãæ¸ãããã¨ã«ï¼OSã¯successãè¿ãããï¼ãã£ã¹ã¯ã³ã³ããã¼ã©ã¨ã©ã¼ãªã©ã§å®éã«ã¯è¨é²ããã¦ããªãã£ãå ´åã«ã¯ãã¹ã¬ã¼ããåèµ·åããã¨ããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ãã°ã®ä¸ä¸è´ãæ¤åºã§ããã¨ãããã¨ã¯ãããã¨æãã¾ãããã¹ã¦ã®ç¶æ³ãèå¯ããããã§ã¯ããã¾ããããGTIDã»ãããæ¯ã¹ããã¨ã§å¾ãããã®ã¯ãã¹ã¬ã¼ãã§æ¸ããã¯ãã®ãã°ã«æ¬ è½ããã£ãã¨ãããã°ã§è»¢éããã¦ããªãå¦çããã£ãããªã©ã®æ¤åºã§ããããã
çã®ãã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ãã¼ã¿ã®ä¸è²«æ§ã®ä¿è¨¼ã¯ã徿¥éãåæ¹ã®ãã¹ã¦ã®ã¬ã³ã¼ããã³ã³ãã¢ãããããªãã¨ãããã¨ã«ã¯å¤ãããªããã¨æãã¾ãã
ã¾ã¨ã
- GTIDã®ã¡ãªããã¨ãã¦ããè¨ãããã
CHANGE MASTER TO
ã§ãã¤ããªãã°ãã¸ã·ã§ã³ããã¡ãã¡æå®ããªãã¦ããããã¯ã¹ã¬ã¼ãããã§ã¤ã«ãªã¼ãã¼ã§ææ ¼ããæ°ãã¹ã¿ã¼ã«åãæ¿ããéã®è©±ã§ãã£ã¦ãæ°è¦ã»ããã¢ãããªã©ã§ã¯ããã¤ããªãã°ãã¸ã·ã§ã³ã«æ¿ãã£ã¦GTID(ã»ãã)ãæå®ããå¿ è¦ãããã(追è¨ãæ°è¦ã¬ããªã±ã¼ã·ã§ã³ã»ããã¢ããæã«ãã¹ã¿ã¼ã®ãã¤ããªãã°ãä¸ç·ã«ã³ãã¼ããã°ãèªåã§ãã®ãã°ãã¹ãã£ã³ãã¦ç¡æå®ã§éå§ãããã¨ãã§ãã¾ãããã ãããã§ããã°ãããããã¹ã¦åããªã®ã§GTIDã«ããæ©æµã¨ã¯è¨ãé£ããã®ã§ãã) - GTIDã¯ããã¹ã¿ã¼ã¨è¤æ°ã¹ã¬ã¼ãã«ããããã¹ã¿ã¼ãã¦ã³æã«ãã§ã¤ã«ãªã¼ãã¼ããæ§æã§ã¡ãªãããããã
- MariaDBã®GTIDã¯ã徿¥ã®ãã¤ããªãã°åã¨ãã¸ã·ã§ã³ã«çªå·ãæ¯ã£ãã ãã«è¿ãã徿¥ã¨ã»ã¼åæ§ã®éç¨ãè¡ãããï¼
sql_slave_skip_counter
ã使ããï¼ - MySQLã®GTIDã¯ãåä¸ã®ä½ç½®æ å ±ã§ãã°ãè¦æ±ããã®ã§ã¯ãªãããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã§é©ç¨ããããã¹ã¦ã®ãã©ã³ã¶ã¯ã·ã§ã³ï¼GTIDã»ããï¼ã®æ¯è¼ã§è¡ãããã
- MySQLã§é©ç¨æ¸ã¿ã®GTIDã»ãããå¿ããããã«ã¯ã
RESET MASTER
ãè¡ãï¼ãããªãï¼ã - MySQLã®GTIDã«ããããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ä¸è²«æ§ã®å¤æã容æãã¯éå®çã§ãã£ã¦ãçã®ãã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã®ãã¼ã¿ã®ä¸è²«æ§ã®ä¿è¨¼ã¯ãããªãã
ãã¾ã ã©ã£ã¡ããããï¼
ã¬ããªã±ã¼ã·ã§ã³ããã¼ã¸ã£ã使ããããã«ãæ°ç¾åãã¬ããªã±ã¼ã·ã§ã³ãæ§ç¯ããã¨ã©ã¼ãçºçãã修復ããã¨ãã£ã使¥ãè¡ã£ã¦ãã¦ã®ææ³ã§ãã
ãã¤ã³ãã¯ãä½ããã£ãã¨ãã®ä¿®å¾©ãæããã§ãã
MySQLã§GTIDã使ãå ´åã¯ããã¹ã¿ã¼ãã¼ã¿ã¨ã¹ã¬ã¼ãããã£ã¡ãåãã«ãã¦SQLã¨ã©ã¼ã絶対ã«èµ·ãããªãããã«éç¨ç®¡çããã£ããããªãã¨ããã§ã¤ã«ãªã¼ãã¼ãããã¨ã§äºæããªãå
¨ã¹ã¬ã¼ãã®SQLã¹ã¬ãã忢ãªãã¦ãã¨ã«ãªãããã¾ãããã¾ãããããªãã¨ãã®ä¿®å¾©ã§ãåé¡ãèµ·ããåéãã¤ããªããªãã¾ãã
対ãã¦MariaDBã¯ãããå°ãã©ãã«å¤å°ãªã«ããã£ã¦ã徿¥ã¨åæ§ã«ä¿®å¾©ã§ãã¾ããsql-log-bin=off
ã«ãã¦ä¿®å¾©ãããããããã¯gtid_slave_pos
ã¢ã¼ãã§ããã°ãã®ä¿®å¾©ã®ãã¨ã¯å¿ãã¦ããã¾ãã
ã¾ããGTIDã®ä½¿ãå§ããGTIDã¨å¾æ¥ã®æ¹æ³ãæ··å¨å¯è½ãªMariaDBã¯ã¨ã¦ã使ãæãã¨æãã¾ãã
MariaDBã¯ãã¼ã¿ã®ä¸è²«æ§ã®ä¿è¨¼ã¯ããã¾ãããMySQLã«ã¯éå®çãªä¸è²«æ§ã®ä¿è¨¼ã®ä»çµã¿ãããã¾ããå®å ¨ã§ã¯ããã¾ãããããã·ã§ã¯ãªãã«ã«ãªç¨éã§ã®ä¸è²«æ§ã®ä¿è¨¼ã¯ãã¼ã¿ã®ã³ã³ãã¢ãªã©ãããã®ããã¹ããã¨æãã¾ãããã§ã¤ã«ãªã¼ãã¼ãä¸å¿ã«é¸æãããªããå人çã«ã¯ä½¿ããããMariaDBãããã§ãã
*1:ææ ¼ã¨ããã¨ä½ãæ§æãå¤ããããã«è¦ãã¾ãããã¹ã¬ã¼ãæ©è½ããªã»ãããæ´æ°å¦çããã®ãµã¼ãã¼ã«åããã ãã®ãã¨ã§ããä»ã®ã¹ã¬ã¼ããchange masterã§ãã®ãµã¼ãã¼ãæå®ãã¦åãã¦æ§æä¸ã®ãã¹ã¿ã¼ã«ãªãã¾ãã
*2:å ¨ãé ãããªãã¹ã¬ã¼ãå士ã§ããã°ãæ°ãã¹ã¿ã¼ã® show master statusã§å¾ããããã¸ã·ã§ã³ã§OKã§ããããããé ããããã¹ã¬ã¼ãã ã¨ããã§ã¯ã ãã§ãã
*3:ãã¹ã¬ã¼ãSQLã¹ã¬ãããã«ã¤ãã¦ã¯MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.2.1 レプリケーション実装の詳細ãåç §ãã¦ãã ããã
*4:徿¥ã®æ¹æ³ãMariaDBã®ä½ç½®ã«ãã管çã®å ´åã¯ã修復ã®ããã®å¤æ´ã®ãã¨ããã¹ã¦ã®ã¹ã¬ã¼ããããæ°ãããã¸ã·ã§ã³ã«ãªãã°ããã®ã©ãããã¹ã¿ã¼ææ ¼ããéã«ã修復ã®ããã®å¤æ´ã®ãã°ã転éããããã¨ã¯ãªãããããã¾ãåé¡ã«ã¯ãªãã¾ããã
MySQLã¬ããªã±ã¼ã·ã§ã³å¾©æ§ããã¼ãã«ããã¯ãããç¹å®ãã¼ãã«ã®ã¿ã³ãã¼ããããã®1
ä»åã¯ãã¬ããªã±ã¼ã·ã§ã³ã®åé¡çºçæã®å¾©æ§ã§ããã¼ãã«ããã¯ãããã«ç¹å®ãã¼ãã«ã®ã¿åã³ãã¼(dumpã¨ã¤ã³ãã¼ã)ããæ¹æ³ã«ã¤ãã¦æ¸ãããã¨æãã¾ãããã¼ãã«ããã¯ããã¨ãã®éãã¹ã¿ã¼ãµã¼ãã¼ã®æ©è½ãå¶éãã¦ãã¾ãã®éç¨æã«ã¯ãªãã¹ãé¿ããããã®ã§ãã(ãã®è¨äºã¯ãinnoDBã®ãã¼ã¿ãã¼ã¹ããã¼ãã«ã対象ã§ãã)
ååã®ã¬ããªã±ã¼ã·ã§ã³ã»ããã¢ãã
ããããã¬ããªã±ã¼ã·ã§ã³ã®ã»ããã¢ããæé ã¯
- ãã¹ã¿ã¼ã§ãµã¼ãã¼IDã¨ãã¤ããªãã°ãæå¹ã«ãã
- ã¹ã¬ã¼ããã¢ã¯ã»ã¹ããããã®ã¬ããªã±ã¼ã·ã§ã³ã¦ã¼ã¶ã¼ããã¹ã¿ã¼ã«ä½æãã
- ãã¹ã¿ã¼ã§
FLUSH TABLES WITH READ LOCK
ãéå§ãã - ãã¹ã¿ã¼ã§
SHOW MASTER STATUS
ãå®è¡ããbinlogãã¡ã¤ã«åã¨ãã¸ã·ã§ã³ãã¡ã¢ãã - mysqldumpã§ãã¹ã¿ã¼ãã¼ã¿ããã³ããã
- ãã¹ã¿ã¼ã§
UNLOCK TABLES
ãå®è¡ãã¦ããã¯ãè§£æ¾ãã - ã¹ã¬ã¼ãã§ãã³ããããã¼ã¿ãã¤ã³ãã¼ããã
- ã¹ã¬ã¼ãã§
CHANGE MASTER TO
ãå®è¡ãã¦ãã¹ã¿ã¼ãã¹ãã¨ã¡ã¢ãããã¤ããªãã°ãã¸ã·ã§ã³ãç»é²ãã - ã¹ã¬ã¼ãã§
START SLAVE
ãå®è¡ãã¦ã¬ããªã±ã¼ã·ã§ã³ãéå§ãã
ã¨ãã£ãå 容ã§ãå ·ä½çã«ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
//my.cnfã®è¨å® server-id = 1 log-bin = mysqld-bin binlog-format = ROW //ã¦ã¼ã¶ã¼ä½æãããã¯ããã¤ããªãã°ãã¸ã·ã§ã³åå¾ master> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'password_here'; master> FLUSH TABLES WITH READ LOCK; master> SHOW MASTER STATUS; //--> File: mysqld-bin.000001 Position: 1101983 //ãã¹ã¿ã¼ãã¼ã¿ãã³ã $> mysqldump -uroot -p --databases databaseA databaseB databaseC > ./master_dump.sql //ããã¯éæ¾ master> UNLOCK TABLES; // ----- ããããã¹ã¬ã¼ãã§ ---------------- //ã¹ã¬ã¼ãã§ã®ãã¼ã¿ã¤ã³ãã¼ã $> mysql -uroot -p --default-character-set=utf8 < ./master_dump.sql //ã¹ã¬ã¼ãã«ãã¹ã¿ã¼ç»é²ã¨ã¬ããªã±ã¼ã·ã§ã³ã®éå§ slave> STOP SLAVE; slave> RESET SLAVE; slave> CHANGE MASTER TO MASTER_HOST = '192.168.0.2',MASTER_USER='replication_user',MASTER_PASSWORD='password_here',MASTER_LOG_FILE='mysqld-bin.000001',MASTER_LOG_POS=1101983; slave> START SLAVE;
ã¬ããªã±ã¼ã·ã§ã³ã®ä¸å ·å
éç¨ä¸ã«ä½ããã®åé¡ã§ã¹ã¬ã¼ãã®SQLã¹ã¬ãããæ¸ãè¾¼ã¿ã¨ã©ã¼ãèµ·ããã¨ããã¹ã¿ã¼ã¨ã¹ã¬ã¼ãã«ãã¼ã¿ã®éããåºã¦ãã¾ãã¾ããæåã«è©¦ã¿ã修復ã¯ãã¨ã©ã¼ã®å
容ãè¦ã¦ã¹ã¬ã¼ãã®ã¬ã³ã¼ããåé¤ããããSQL_SLAVE_SKIP_COUNTER
夿°ã使ã£ã¦ã¤ãã³ããã¹ããããããã¨ã§è¡ãã¾ããããã§è§£æ¶ã§ããã°ããã§ããããã¼ã¿ã«çç¾ãç¡ããã©ãã確èªãã«ããã£ãããè¤éã§æã«è² ããªããã¨ãããã¾ãããã®ãããªå ´åããã¹ã¿ã¼ããã³ãã¼ãç´ãã°ç¢ºå®ã§ãã
ããããååã¨åãæé ã§å度ã»ããã¢ããããã¨ãæ©è½å¶éã®æéãåé¡ã«ãªãã¾ãã
- ãã¹ã¿ã¼ã®æ¸ãè¾¼ã¿æ©è½ãã
FLUSH TABLES WITH READ LOCK
ã®é忢ããªããã°ãªããªãã - 1ã¤ã®ãã¹ã¿ã¼ã«è¤æ°ã®ãã¼ã¿ãã¼ã¹ãããå ´åãå¿ è¦ãªãã¹ã¦ã®ãã¼ã¿ãã¼ã¹ããã³ãã¨ã¤ã³ãã¼ãããªããã°ãªããªããç¹ã«ãã¼ã¿ãµã¤ãºã大ããå ´åã¯å¤ãã®æéããããã
ãã¼ãã«ããã¯ããªã¼ãªé¨åã³ãã¼ã«ãã復æ§
ãã¹ã¿ã¼ã®æ©è½å¶éã®æéãæå°éã«ãªãããããã¼ãã«ããã¯ããªã¼ã§ã®é¨åã³ãã¼ã«ããä¿®å¾©æ¹æ³ãèãã¦ã¿ããã¨æãã¾ããã¹ã¬ã¼ãã¯å£ããç¶æ ãªã®ã§ãå¾©æ§æ å½ä»¥å¤ã¢ã¯ã»ã¹ã§ããªãããã«ãªã£ã¦ãããã¨ãåæã§ãã
ãã°ãã¸ã·ã§ã³ã®åé¡
大æµã®å ´åãåé¡ã¯ç¹å®ã®ãã¼ã¿ãã¼ã¹ããã¼ãã«ã«éå®ã§ãããã¨ãå¤ãã¨æãã¾ããããã§ãå
¨é¨ã®ãã¼ã¿ãã¼ã¹ã§ã¯ãªãä¸é¨ã®ã¿ã®ãã³ãã¨ã¤ã³ãã¼ããè¡ãã¨ã©ãã§ããããã
ååã»ããã¢ããæã¨åãæé ã§ããã¼ãã«ããã¯ãªãã«é¨åçã«ã³ãã¼ãããã¨ããã¨ãä¸è¨ã®åé¡ãçãã¾ãã
- ã¹ã¬ã¼ãã忢ããã«è¡ãã¨ã
SHOW MASTER STATUS
以éã®å¤æ´ãéè¤ãã¦ã¹ã¬ã¼ãã«é©ç¨ããã¦ãã¾ããï¼ãã°ãã¸ã·ã§ã³ãSHOW MASTER STATUS
æç¹ã«æ»ãããï¼ - äºåã«ã¹ã¬ã¼ãã忢ããã¨ã忢æã®ãã°ãã¸ã·ã§ã³ãã
SHOW MASTER STATUS
ããã¾ã§ã®å¤æ´ãã°ãç¡ããªããï¼ãã°ãã¸ã·ã§ã³ãSHOW MASTER STATUS
æç¹ã«é²ãã¦ãã¾ãããï¼
é¨åã³ãã¼ãè¡ãã«ã¯ããã¼ã¿ã«çç¾ãçºçãããªãããã«ãã¹ã¬ã¼ã忢æã¨ãã³ãæã®ãã°ãã¸ã·ã§ã³ãä¸è´ãããããªãã¡ãSHOW MASTER STATUS
ã§ç¢ºèªãããã°ãã¸ã·ã§ã³ã¾ã§ã¹ã¬ã¼ãã«é©ç¨ãããç¶æ
ã§ã¹ã¬ã¼ãã忢ããå¿
è¦ããããã¨ããããã¾ãã
START SLAVE UNTIL
START SLAVE
ã«ã¯UNTIL
ã¨ãããªãã·ã§ã³ãããã¾ããUNTIL master_log_file='xxxx', master_log_pos=xxx
ã®ããã«ä½¿ç¨ãã¾ããUNTILã¯SQLã¹ã¬ãããæå®ãããã°ãã¸ã·ã§ã³ã¾ã§éããã忢ãã¦ããã¾ãããããå©ç¨ãã¦ä»¥ä¸ã®æé ãå ãã¾ãã
STOP SLAVE
ãå®è¡ãã¾ãã- ãã¹ã¿ã¼ã§
SHOW MASTER STATUS
ãå®è¡ããã¹ã¬ã¼ãã§ãã®ãã¸ã·ã§ã³ãUNTIL
ã«å ãã¦START SLAVE
ãã¾ãã - åé¡ãçºçããå ´åã¯ã
SQL_SLAVE_SKIP_COUNTER
ã«1ãæå®ãã¦ãããå度START SLAVE UNTIL
ãå®è¡ããåé¡ã®ããã¤ãã³ããã¹ããããã¾ãããããç¹°ãè¿ãã¦åé¡ããã¹ã¦ã¹ããããã¾ãã SHOW SLAVE STATUS
ãä½åº¦ãå®è¡ãã¦ãæå®ãããã¸ã·ã§ã³ã¾ã§ãã°ãé©ç¨ããSQLã¹ã¬ããã忢ããã®ãå¾ ã¡ã¾ãã- ã¹ã¬ã¼ãã§ã¤ã³ãã¼ããã¾ãã
- ã¹ã¬ã¼ãã§
RESET SLAVE
ããã¹ã¿ã¼åç»é²ã¨ã¬ããªã±ã¼ã·ã§ã³ã®éå§ãè¡ãã¾ãã
ããã§ããµã¼ãã¼ã®ä¸é¨ã®ãã¼ã¿ãã¼ã¹ã®ã¿çç¾ãªãã³ãã¼ãç´ããã¨ãã§ãã¾ãããã ããSHOW MASTER STATUS
æç¹ã®ã³ãã¼å
ãã¼ã¿ãå¿
è¦ã§ãããããç¾å¨ã®MySQLã§å®ç¾ããã«ã¯ï¼ã¤ã®æ¹æ³ãããã¾ãã
- äºåã«
FLUSH TABLES WITH READ LOCK
ãã¦ãã³ãããã - äºåã«
FLUSH TABLES WITH READ LOCK
ãã¦ãã®éã«ã¹ãããã·ã§ãããéå§ããã³ãããã
ã¡ãªã¿ã«ãSTART SLAVE UNTIL
㯠MySQL 5.5ï½5.7ãMariaDB 5.5ï½10.1 ã§ä½¿ç¨ã§ãã¾ãã
ãã¼ãã«ããã¯æéãæå°éã§ãã³ããã
mysqldumpã«ã¯ããã¤ããªãã°ãã¸ã·ã§ã³ãåæã«åå¾ãã--master-data
ãªãã·ã§ã³ãããã¾ããããã使ãã¨ãèªåã§FLUSH TABLES WITH READ LOCK
ãçºè¡ããå¿
è¦ã¯ããã¾ãããããããªããã--master-data
ãªãã·ã§ã³ã¯å
é¨ã§ãã®ã³ãã³ãã使ã£ã¦ãã¾ãã®ã§ãå®å
¨ã«ãã¼ãã«ããã¯ãªãã«ãã³ããããã¨ã¯ã§ãã¾ããã以ä¸ã¯ãã®é¨åã示ãmysqldumpã®ã½ã¼ã¹ã³ã¼ãã®æç²ã§ãã
// mysql-5.6.20 mysqldump.c : 5797 if ((opt_lock_all_tables || opt_master_data || (opt_single_transaction && flush_logs)) && do_flush_tables_read_lock(mysql)) goto err;
--single-transaction
ãªãã·ã§ã³ã使ãã¨ãããã¯éå§å¾ã«ã¹ãããã·ã§ãããåãï¼start_transaction
ï¼ãSHOW MASTER STATUS
ãã¦ããã«ããã¯ãéæ¾ãã¾ããããã«ããããã¯æéãã»ãã®ããããªæéã«ãããã¨ãã§ãã¾ãã
// mysql-5.6.20 mysqldump.c : 5827 if (opt_single_transaction && start_transaction(mysql)) goto err; /* Add 'STOP SLAVE to beginning of dump */ if (opt_slave_apply && add_stop_slave()) goto err; /* Process opt_set_gtid_purged and add SET @@GLOBAL.GTID_PURGED if required. */ if (process_set_gtid_purged(mysql)) goto err; if (opt_master_data && do_show_master_status(mysql)) goto err; if (opt_slave_data && do_show_slave_status(mysql)) goto err; if (opt_single_transaction && do_unlock_tables(mysql)) /* unlock but no commit! */ goto err; ã// ...ãã®ãã¨ãã³ãéå§
ååã®æ¹æ³ããã¯ãã¼ãã«ããã¯ãååçãæéã«ã§ããã®ã§ã
$>mysqldump -uroot -p --master-data --single-transaction databaseA tableA tableB > ./master_dump.sql
ã®ããã«ãã³ããã¾ãããã
ããããSTART SLAVE UNTIL
ãå®è¡ããããã«ã¯ããã³ããã¡ã¤ã«ãéãã¦ãã°åã¨ãã¸ã·ã§ã³ãèªåã§èªã¿åããªããã°ãªãã¾ãããå°ã
é¢åã§ããã
ããã¾ã§ã®æ¹æ³ã¯ãmysqlã¯ã©ã¤ã¢ã³ãã¨mysqldumpã使ã£ã¦è¡ããã¨ãã§ãã¾ããå¾è¿°ã®ã¾ã¨ãã«æé ä¸å¼ãæ¸ãã¦ããã¾ãã
ãã¼ãã«ããã¯ãããã³ãã¼ãã
ããã¾ã§è¦ã¦ããéããmysqldumpã§ã¯ãå®å
¨ã«ãã¼ãã«ããã¯ãããã¹ãããã·ã§ããã¨ãã®æç¹ã®ãã°ãã¸ã·ã§ã³ãåå¾ãããã¨ã¯ã§ãã¾ããã
ããããTransactdã®nsdatabase::beginSnapshotã¡ã½ããã使ãã°ããã¼ãã«ããã¯ãããã«ã¹ãããã·ã§ãããéå§ãããã®æç¹ã§ã®ãã°ãã¸ã·ã§ã³ãåå¾ã§ãã¾ãã
ãªããã¼ãã«ããã¯ããªã¼ã§åå¾å¯è½ãªã®ã§ããããã
MySQLã¯XAãã©ã³ã¶ã¯ã·ã§ã³ã使ã£ã¦ãã¤ããªãã°ã¨innoDBã®å¦ççµæã«çç¾ãç¡ãããã«ãã¦ãã¾ããXAã®ã³ãããã¯ãæåã«commitããã¯ãåå¾ãã¦ã·ãªã¢ã©ã¤ãºããã¾ããTransactdã®nsdatabase::beginSnapshotã¯ããã®commitããã¯ã使ã£ã¦ä»¥ä¸ã®ããã«å¦çãã¾ãã
- commitããã¯ãåå¾ï¼ä»ã®æ¸ãè¾¼ã¿ãããã¯ï¼
- ãã°ãã¸ã·ã§ã³ãåå¾
- ã¹ãããã·ã§ãããéå§
- commitããã¯ãéæ¾
commitããã¯ã¯éå¸¸ã®æ¸ãè¾¼ã¿å¦çã¨åæ§ã®ããã¯ãªã®ã§ããã¼ãã«ãããã¯ãããã¨ã¯ããã¾ãããä»ã®å¦çãæ¢ãããã¨ãªãã¹ã ã¼ãºã«å¦çããã¾ãã
ãã¨ã¯ããã®ã¹ãããã·ã§ããä¸ã«ãã¹ã¿ã¼ãã¼ã¿ãèªã¿åã£ã¦ã¹ã¬ã¼ãã«ã³ãã¼ãã¾ãã
ããã§å®å
¨ã«ãã¼ãã«ããã¯ããªã¼ã§ã³ãã¼ã§ãã¾ãããã¹ã¿ã¼ã¯ã»ãã®ããããªæ©è½åæ¢ãããã¾ããã
å
·ä½çãªã³ã¼ãã¯æ¬¡åæ¹ãã¦è©³ããæ¸ãããã¨æãã¾ãã
ã¾ã¨ã
mysqlã¯ã©ã¤ã¢ã³ãã¨mysqldumpã使ã£ã¦ãå¯è½ãªéãããã¯ãçãããã¬ããªã±ã¼ã·ã§ã³ã®é¨åã³ãã¼ãè¡ãæ¹æ³ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
ä¾ã¨ãã¦databaseA
ã®tableA
ã¨tableB
ã®ã¿ã³ãã¼ãã¾ãããé害ã¯tableA
ã¨tableB
ã§ã®ã¿çºçãã¦ãããã¨ç¹å®ã§ãã¦ãããã¨ãæ¡ä»¶ã§ãã
/* databaseA ã® tableA 㨠tableB ã®ã¿åã³ãã¼ãããµã³ãã« master> ã¯ãã¹ã¿ã¼ã®mysqlã¯ã©ã¤ã¢ã³ãã§ã®å¦ç slave> ã¯ã¹ã¬ã¼ãã®mysqlã¯ã©ã¤ã¢ã³ãã§ã®å¦ç */ //ã¹ã¬ã¼ã忢 slave> STOP SLAVE; //ãã¹ã¿ã¼ãã¼ã¿ãã³ã (ããã¯ãã¹ãããã·ã§ãããbinlog posã®åå¾) $> mysqldump -uroot -p --master-data --single-transaction --add-drop-table databaseA tableA tableB > ./master_dump.sql // ./master_dump.sqlããbinlogãã¡ã¤ã«åã¨ãã¸ã·ã§ã³ãèªã¿åã£ã¦ã¡ã¢ãã¦ãã slave> START SLAVE UNTIL master_log_file='xxxx', master_log_pos=xxx; //ãã¡ã¤ã«åã¨ãã¸ã·ã§ã³ã¯å ã»ã©ã¡ã¢ããå¤ // -- ãããã ã¨ã©ã¼ãçºçããå ´åã®å¦ç -- slave> STOP SLAVE; slave> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; slave> START SLAVE UNTIL master_log_file='xxxx', master_log_pos=xxx; //ãã¡ã¤ã«åã¨ãã¸ã·ã§ã³ã¯å ã»ã©ã¡ã¢ããå¤ // -- ã¨ã©ã¼ãçºçããå ´åã®å¦ç ããã¾ã§ -- // 以ä¸ãã¨ã©ã¼ãçºçãããã³ã«ç¹°ãè¿ããã¨ã©ã¼ããã¹ã¦ã¹ããããã slave> SHOW SLAVE STAUS;ãã// Exec_Master_Log_Posãæå®ãããã¸ã·ã§ã³ã«ãªã£ã¦SQLã¹ã¬ããã忢ããã¾ã§å¾ 㤠//ã¹ã¬ã¼ã忢ããã³ããããã¼ã¿ã¨åããã°ãã¸ã·ã§ã³ã¾ã§é©ç¨ããã¦ããç¶æ slave> STOP SLAVE; //ã¹ã¬ã¼ãã§ã®ãã¼ã¿ã¤ã³ãã¼ã $> mysql -uroot -p --default-character-set=utf8 < ./master_dump.sql //ã¹ã¬ã¼ãã¸ã®ãã¹ã¿ã¼ç»é²ã¨ã¬ããªã±ã¼ã·ã§ã³ã®éå§ slave> RESET SLAVE; slave> CHANGE MASTER TO MASTER_HOST = '192.168.0.2',MASTER_USER='replication_user',MASTER_PASSWORD='password_here',MASTER_LOG_FILE='xxxx',MASTER_LOG_POS=xxx; slave> START SLAVE;
ä»åã¯ã¿ã¤ãã«ã«ããããã¼ãã«ããã¯ããããã¾ã§è³ã£ã¦ãã¾ãããæ¬¡åã¯Trasnactdã使ã£ã¦å®å ¨ã«ãã¼ãã«ããã¯ããªãæ¹æ³ã§ã®ã¹ã¯ãªãããç´¹ä»ãã¾ããã¨ã©ã¼ã®ã¹ããããç°¡åã«ã§ãã¦ã¨ã¦ã便å©ãªã¹ã¯ãªããã§ãã
è¿½è¨ (2016/05/27) ãã®ï¼ãå
¬éãã¾ããã
bizstation.hatenablog.com
PHP7 ExtensionãSWIGã§ä½ã (Building a PHP7 Extension with SWIG)
Transactd 3.0ããªãªã¼ã¹ãã¾ãããã¾ããPHPã¯ã©ã¤ã¢ã³ãã¯PHP7ã«å¯¾å¿ãã¾ããã(Transactd 3.0ã«ã¤ãã¦ã¯ã¾ãæ¹ãã¦æ¸ãããã¨æãã¾ã)
Transactdã®PHPã¯ã©ã¤ã¢ã³ãã¯ãSWIGã§çæããã©ããã¼ã³ã¼ãããã¼ã¹ã«æ§ç¯ããã¦ãã¾ãã
PHP7ã§ã¯ãåºæ¬çãªå¤æ°ã®åã颿°ã®å¼æ°åãªã©ã«å¤æ´ããããPHP5ç³»ã§ä½¿ç¨ãã¦ããã³ã¼ãã®ã¾ã¾ã§ã¯Extensionãã³ã³ãã¤ã«ã§ãã¾ãããSWIGã§PHP7ã®Extensionã使ã§ããã°ããã®ã§ãããã¾ã PHP7ã«ã¯å¯¾å¿ãã¦ãã¾ãããã¾ããTransactdã§ã¯ã©ããã¼ããã¼ã¹ã«é¢æ°ã®ãªã¼ãã¼ãã¼ããªã©ã夿´ãã¦ãããããç¾ç¶ã®ã³ã¼ããPHP7ã«å¯¾å¿ãããå¿
è¦ãããã¾ãããä»åã¯ãã®å
容ãåå¿é²çã«æ¸ãã¦ããããã¨æãã¾ãã
以éã¯ãOneã½ã¼ã¹ã§PHP5ã¨PHP7ã®ã©ã¡ãã§ãã³ã³ãã¤ã«ã»æ£å¸¸åä½ãããããã®SWIGã³ã¼ãã®å¤æ´æé ã§ããTransactdã®PHPã¯ã©ã¤ã¢ã³ãã«éãããSWIGã§çæãããPHP Extensionå ±éã§ä½¿ç¨ã§ããã¨æãã¾ãã
ã³ã¼ãã®å¤æ´ã®æè¡çãªå
容ã¯ãä¸è¨ã®PHPã®ããã¥ã¢ã«ãåºã«è¡ã£ã¦ãã¾ããã
Upgrading PHP extensions from PHP5 to NG
夿´ã®æ¦è¦
Oneã½ã¼ã¹ã§PHP5ã¨PHP7ã®ä¸¡æ¹ã§åä½ããããã«ãããããZEND_ENGINE
ãã¯ãã®ãã¼ã¸ã§ã³ã調ã¹ã¦é¢æ°ãåããã¯ãã§åãæ¿ãã¾ããæ¬¡ã«ãã©ããã¼ã³ã¼ãããã®ãã¯ãã使ç¨ããããã«ç½®æãã¾ããæå¾ã«çµã¿è¾¼ã¿ã®5ã¤ã®é¢æ°ãæç´ããã¾ããã¾ã¨ããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
- åæ¿ãã¯ãã®æ¿å ¥
- ã©ããã¼ã³ã¼ãããã¯ãã§ç½®æãã
SWIG_ZTS_SetPointerZval
,SWIG_ZTS_ConvertResourcePtr
,SWIG_ZTS_ConvertPtr
,SWIG_Php_GetModule
,SWIG_Php_SetModule
ãç½®æãã
ããã§PHP5ã¨PHP7ã«å¯¾å¿ããã©ããã¼ã³ã¼ãã宿ãã¾ãã
åæ¿ãã¯ãã®æ¿å ¥
åæ¿ãã¯ãã¯2ãæã«æ¿å
¥ãã¾ãããããããSWIG_LONG_CONSTANT
ã¨static ZEND_RSRC_DTOR_FUNC
ãåºç¾ããä½ç½®ã«ãå
ã®ã³ã¼ããåé¤ãã¦æ¿å
¥ãã¾ãã
ãã¯ã1
#ifdef ZEND_ENGINE_3 #define SIZE_OFFSET 1 #else #define SIZE_OFFSET 0 #endif #define SWIG_LONG_CONSTANT(N, V) zend_register_long_constant((char*)#N, sizeof(#N) - SIZE_OFFSET, V, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) #define SWIG_DOUBLE_CONSTANT(N, V) zend_register_double_constant((char*)#N, sizeof(#N) - SIZE_OFFSET, V, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) #define SWIG_STRING_CONSTANT(N, V) zend_register_stringl_constant((char*)#N, sizeof(#N) - SIZE_OFFSET, (char*)(V), strlen(V), CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) #define SWIG_CHAR_CONSTANT(N, V) do {\ static char swig_char = (V);\ zend_register_stringl_constant((char*)#N, sizeof(#N) - SIZE_OFFSET, &swig_char, 1, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC);\ } while (0)
ãã¯ã2
#ifdef ZEND_ENGINE_3 static ZEND_RSRC_DTOR_FUNC(SWIG_landfill) { zend_resource *rsrc = res; (void)rsrc; } //Replace typedef zval zval_args_type; #define ZVAL_ARGS &args #define ZVAL_ARGS_ARRAY args #define ZVAL_ARGV_ARRAY argv #define CONV_to_double_ex(zv) #define CONV_to_long_ex(zv) #define CONV_to_string_ex(zv) convert_to_string(&zv) #define CONV_to_boolean_ex(zv) ZVAL_LONG(&zv, (Z_TYPE(zv) == IS_TRUE) ? 1 : 0); #define Z_TYPE_AGRS(N) Z_TYPE_P(&args[N]) #define Z_TYPE_ARGV(Z) Z_TYPE_P(&Z) #define ZVAL_ARGS_P(N) (&argv[N]) #define ARGV_IS_BOOL(N) (Z_TYPE_ARGV(argv[N]) == IS_TRUE || Z_TYPE_ARGV(argv[N]) == IS_FALSE) #define RSRC res #define LIST_FIND(ZVAL) value = (swig_object_wrapper *)Z_RES_P(ZVAL)->ptr; #define ARGS_IS_TRUE(N) zval_is_true(&args[N]) //Append compatible type and define typedef zend_resource zend_rsrc_list_entry; #define Z_DVAL_PP(zv) zv.value.dval #define Z_LVAL_PP(zv) zv.value.lval #define Z_STRVAL_PP(zv) Z_STRVAL_P(&zv) #undef ZVAL_STRING #define ZVAL_STRING(z, s, dummy) \ do { \ const char *_s = (s); \ ZVAL_NEW_STR(z, zend_string_init(_s, strlen(_s), 0)); \ } while (0) #undef ZVAL_STRINGL #define ZVAL_STRINGL(z, s, l, dummy) \ do { \ const char *_s = (s); \ ZVAL_NEW_STR(z, zend_string_init(_s, l, 0)); \ } while (0) #else static ZEND_RSRC_DTOR_FUNC(SWIG_landfill) { (void)rsrc; } typedef long zend_long; typedef zval** zval_args_type; #define ZVAL_ARGS *args #define ZVAL_ARGS_ARRAY args #define ZVAL_ARGV_ARRAY argv #define CONV_to_double_ex(zv) convert_to_double_ex(zv) #define CONV_to_long_ex(zv) convert_to_long_ex(zv) #define CONV_to_string_ex(zv) convert_to_string_ex(zv) #define CONV_to_boolean_ex(zv) convert_to_boolean_ex(zv) #define Z_TYPE_AGRS(N) (ZVAL_ARGS[N])->type #define Z_TYPE_ARGV(Z) Z_TYPE_PP((Z)) #define ZVAL_ARGS_P(N) (*(argv[N])) #define ARGV_IS_BOOL(N) (Z_TYPE_ARGV(argv[N]) == IS_BOOL) #define RSRC rsrc #define LIST_FIND(ZVAL) (swig_object_wrapper *)zend_list_find((*ZVAL[0])->value.lval, &type) #define ARGS_IS_TRUE(N) zval_is_true(*args[N]) #endif
ã©ããã¼ã³ã¼ãããã¯ãã§ç½®æãã
次ã«ãã©ããã¼ã³ã¼ãã以ä¸ã®ãã¿ã¼ã³ã§ãã¹ã¦ç½®æãã¾ããå·¦å´ã®ãã¿ã¼ã³ã®ã³ã¼ããã®å³å´ã®ã³ã¼ãã«ãã¾ããnãã©ã¡ã¼ã¿ã®å®éã¯æ´æ°ã®å¤ã§ãã_xxxxã¯ã¯ã©ã¹åã§ãæ®ãã¯å®éã®ã©ããã¼ã³ã¼ãã®è¨è¿°ãã®ãã®ã§ãã
zval **args[n] ã --> zval_args_type args[n] zend_get_parameters_array_ex(n, args) --> zend_get_parameters_array_ex(n, ZVAL_ARGS_ARRAY) zend_get_parameters_array_ex(argc,argv) --> zend_get_parameters_array_ex(argc, ZVAL_ARGV_ARRAY) SWIG_ConvertPtr(*args[n]ãã --> SWIG_ConvertPtr(ZVAL_ARGS[n] (*args[n])->type --> Z_TYPE_AGRS(n) convert_to_string_ex --> CONV_to_string_ex convert_to_long_ex --> CONV_to_long_ex convert_to_double_ex --> CONV_to_double_ex convert_to_boolean_ex --> CONV_to_boolean_ex (Z_TYPE_PP(argv[n]) == IS_BOOL) --> ARGV_IS_BOOL(n) zend_list_find((*args[n])->value.lval, &type) --> LIST_FIND(args) __wrap_delete_xxxx(rsrc, --> __wrap_delete_xxxx(RSRC, efree(rsrc->ptr) --> efree(RSRC->ptr) zval_is_true(*args[n]) --> ARGS_IS_TRUE(n)
ãã®ç½®æä½æ¥ã¯ãä»å¾C++ã®ã¤ã³ã¿ãã§ã¼ã¹ã«å¤æ´ããã£ã¦é¢æ°ã®è¿½å ã夿´ãããéãSWIGã§çæãããã®ã使ç¨ããå ´åã«ãå¿ è¦ã§ãã
çµã¿è¾¼ã¿é¢æ°ã®å¤æ´
æå¾ã«5ã¤ã®SWIGã®çµã¿è¾¼ã¿é¢æ°ãç½®æãã¾ãã
SWIG_ZTS_SetPointerZval
static void SWIG_ZTS_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject TSRMLS_DC) { /* * First test for Null pointers. Return those as PHP native NULL */ if (!ptr) { ZVAL_NULL(z); return; } if (type->clientdata) { swig_object_wrapper *value; if (!(*(int *)(type->clientdata))) zend_error(E_ERROR, "Type: %s failed to register with zend", type->name); value = (swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper)); value->ptr = ptr; value->newobject = (newobject & 1); if ((newobject & 2) == 0) { /* Just register the pointer as a resource. */ #ifdef ZEND_ENGINE_3 ZVAL_RES(z, zend_register_resource(value, *(int *)(type->clientdata))); #else ZEND_REGISTER_RESOURCE(z, value, *(int *)(type->clientdata)); #endif } else { /* * Wrap the resource in an object, the resource will be accessible * via the "_cPtr" member. This is currently only used by * directorin typemaps. */ #ifdef ZEND_ENGINE_3 zval resource; zend_class_entry *ce = NULL; #else zval *resource; zend_class_entry **ce = NULL; int result; #endif const char *type_name = type->name + 3; /* +3 so: _p_Foo -> Foo */ size_t type_name_len; const char * p; /* Namespace__Foo -> Foo */ /* FIXME: ugly and goes wrong for classes with __ in their names. */ while ((p = strstr(type_name, "__")) != NULL) { type_name = p + 2; } type_name_len = strlen(type_name); #ifdef ZEND_ENGINE_3 zend_string* tn = zend_string_init(type_name, type_name_len, 0); ZVAL_RES(&resource, zend_register_resource(value, *(int *)(type->clientdata))); #else MAKE_STD_ZVAL(resource); ZEND_REGISTER_RESOURCE(resource, value, *(int *)(type->clientdata)); #endif if (SWIG_PREFIX_LEN > 0) { char * classname = (char*)emalloc(SWIG_PREFIX_LEN + type_name_len + 1); strcpy(classname, SWIG_PREFIX); strcpy(classname + SWIG_PREFIX_LEN, type_name); #ifdef ZEND_ENGINE_3 zend_string* zp = zend_string_init(classname, SWIG_PREFIX_LEN + type_name_len, 0); ce = zend_lookup_class(zp); zend_string_release(zp); #else result = zend_lookup_class(classname, SWIG_PREFIX_LEN + type_name_len, &ce TSRMLS_CC); #endif efree(classname); } else { #ifdef ZEND_ENGINE_3 ce = zend_lookup_class(tn); #else result = zend_lookup_class((char *)type_name, type_name_len, &ce TSRMLS_CC); #endif } #ifdef ZEND_ENGINE_3 if (!ce) { #else if (result != SUCCESS) { #endif /* class does not exist */ object_init(z); } else { #ifdef ZEND_ENGINE_3 object_init_ex(z, ce); #else object_init_ex(z, *ce); #endif } Z_SET_REFCOUNT_P(z, 1); #ifdef ZEND_ENGINE_3 ZVAL_MAKE_REF(z); zend_hash_str_update(HASH_OF(z), "_cPtr", sizeof("_cPtr") - 1, &resource); zend_string_release(tn); #else Z_SET_ISREF_P(z); zend_hash_update(HASH_OF(z), (char*)"_cPtr", sizeof("_cPtr"), (void*)&resource, sizeof(zval), NULL); #endif } return; } zend_error(E_ERROR, "Type: %s not registered with zend",type->name); }
SWIG_ZTS_ConvertResourcePtr
static void * SWIG_ZTS_ConvertResourcePtr(zval *z, swig_type_info *ty, int flags TSRMLS_DC) { swig_object_wrapper *value; void *p; int type; const char *type_name; #ifdef ZEND_ENGINE_3 type = Z_RES_P(z)->type; value = (swig_object_wrapper *)Z_RES_P(z)->ptr; #else value = (swig_object_wrapper *) zend_list_find(z->value.lval, &type); #endif if (type==-1) return NULL; if (flags & SWIG_POINTER_DISOWN) { value->newobject = 0; } p = value->ptr; #ifdef ZEND_ENGINE_3 type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(z)); #else type_name = zend_rsrc_list_get_rsrc_type(z->value.lval TSRMLS_CC); #endif return SWIG_ZTS_ConvertResourceData(p, type_name, ty TSRMLS_CC); }
SWIG_ZTS_ConvertPtr
static int SWIG_ZTS_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags TSRMLS_DC) { if (z == NULL) { *ptr = 0; return 0; } switch (Z_TYPE_P(z)) { case IS_OBJECT: { //find z->_cPtr #ifdef ZEND_ENGINE_3 zval* _cPtr; if ((_cPtr = zend_hash_str_find(HASH_OF(z), "_cPtr", sizeof("_cPtr")- 1)) != NULL) { if (Z_TYPE_P(_cPtr) == IS_INDIRECT) _cPtr = Z_INDIRECT_P(_cPtr); if (Z_TYPE_P(_cPtr)==IS_RESOURCE) { *ptr = SWIG_ZTS_ConvertResourcePtr(_cPtr, ty, flags TSRMLS_CC); return (*ptr == NULL ? -1 : 0); } } #else zval **_cPtr; if (zend_hash_find(HASH_OF(z), (char*)"_cPtr", sizeof("_cPtr"), (void**)&_cPtr) == SUCCESS) { if ((*_cPtr)->type == IS_RESOURCE) { *ptr = SWIG_ZTS_ConvertResourcePtr(*_cPtr, ty, flags TSRMLS_CC); return (*ptr == NULL ? -1 : 0); } } #endif break; } case IS_RESOURCE: *ptr = SWIG_ZTS_ConvertResourcePtr(z, ty, flags TSRMLS_CC); return (*ptr == NULL ? -1 : 0); case IS_NULL: *ptr = 0; return 0; } return -1; }
SWIG_Php_GetModule
static swig_module_info *SWIG_Php_GetModule() { zval *pointer; swig_module_info *ret = 0; TSRMLS_FETCH(); #ifdef ZEND_ENGINE_3 if (pointer = zend_get_constant_str(const_name, sizeof(const_name) - 1)) { if (Z_TYPE_P(pointer) == IS_LONG) { ret = (swig_module_info *) pointer->value.lval; } } #else MAKE_STD_ZVAL(pointer); if (zend_get_constant(const_name, sizeof(const_name) - 1, pointer TSRMLS_CC)) { if (pointer->type == IS_LONG) { ret = (swig_module_info *)pointer->value.lval; } } FREE_ZVAL(pointer); #endif return ret; }
Windowsã§ã®ãã«ãã¨ã©ã¼
Windowsã®å ´åãPHP7ã¯Visual Studio 2015ã§ã®ãã«ããå¿
è¦ã§ãã
VS2015ã§std::string
ã使ç¨ããã¨ãstring
ãããã¼ã®inline namespace literals
ã§ã³ã³ãã¤ã«ã¨ã©ã¼ãçºçãããã¨ãããã¾ãããã®æã¯ã#include <string>
ãã³ã¼ãã®æåã«ã¤ã³ã¯ã«ã¼ãããã¨è§£æ¶ã§ãã¾ãã
æå¾ã«
Transactdã§ã¯ãã®å¤æ´ã§PHPç¨ã®ãã¹ããã¹ã¦ã«ãã¹ãã¦ãã¾ãã
Transactdç¨ã®ã©ããã¼ã³ã¼ãã¯
transactd/tdclphp_wrap.cpp at master · bizstation/transactd · GitHub
ã§ç¢ºèªã§ãã¾ããZEND_ENGINE_3ã§æ¤ç´¢ããã°PHP7ç¨ã®ä¿®æ£ãåæã§ãã¾ãã(ããã«è¨è¼ããã³ã¼ãã¯Refactoringãã¦ããã®ã§å°ãç°ãªãã¾ããåºæ¬åãã§ã)
ãã¯ãã§ã®åæ¿ã¯ã³ã¼ããèªã¿ã¥ããå¿ ããããã¹ãã§ã¯ããã¾ããããPHP5ã¨PHP7ã¯Extensionæ§é ãåºæ¬çã«åããªã®ã§ã2ã¤ã®ã³ã¼ããå¥ã ã«ãã¦ç®¡çããããã¯é忥½ãã¨æãã¾ãã