рдкреНрд░рддрд┐рдХреГрддрд┐ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдПрдХ рд╕рдорд╛рди рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо (RDBMS) рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдкреНрд░рддрд┐рдХреГрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рдЙрдкрд▓рдмреНрдзрддрд╛ рдФрд░ рд▓реЛрдб рд╕рдВрддреБрд▓рдиред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рджреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд░рдЪрдирд╛ рдЬреИрд╕реЗ рдХрд┐ MySQL рдФрд░ PostgreSQL рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрднрд╡ рд╣реИ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ pg_chameleon рдкреНрд░рддрд┐рдХреГрддрд┐ рдЙрдкрдХрд░рдг рд╣реИ ред

рдирд┐рд░рдВрддрд░ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рд▓рд┐рдП, pg_chameleon MySQL рдкреНрд░рддрд┐рдХреГрддрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ jsonb рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред Postgres рдореЗрдВ pl / pgsql рдлрд╝рдВрдХреНрд╢рди jsonb рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреАрдХреЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ Postgres рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП binlog_format рдЪрд░ рдХреЛ ROW (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрд┐рдВрджреБ:
- рдЬрд┐рди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
- рдпрд╣ рдЯреВрд▓ 9.5 рд╕реЗ рдКрдкрд░ рдХреЗ PostgreSQL рдФрд░ 5.5 рд╕реЗ рдКрдкрд░ рдХреЗ MySQL рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд░реНрдЬрди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
- рдЗрд╕ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Binlog_format рдЪрд░ рдХреЛ ROW рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг 3.3 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдкреНрд░рддрд┐рдХреГрддрд┐ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, pg_chameleon CSV рдкреНрд░рд╛рд░реВрдк рдореЗрдВ MySQL рд╕реЗ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рдЕрдзрд┐рднрд╛рд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ COPY рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде Postgres рдореЗрдВ рдлреНрд▓рд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ INSERT рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИ, рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдзреАрдорд╛ рдХрд░ рд╕рдХрддреА рд╣реИред рдпрджрд┐ INSERT рдЖрджреЗрд╢ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдкрдВрдХреНрддрд┐ рдЦреЛ рдЬрд╛рддреА рд╣реИред
MySQL рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, pg_chameleon MySQL рдкреНрд░рддрд┐рдХреГрддрд┐ (рджрд╛рд╕) рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣ Postgres рдореЗрдВ рдПрдХ рдпреЛрдЬрдирд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИ, MySQL рдкреНрд░рддрд┐рдХреГрддрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ, рдФрд░ Postgres рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рд╕рдВрдмрдВрдзрд┐рдд Postgres рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреАрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ Postgres рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд▓реЙрдЧ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ Postgres рд╕реНрдХреАрдорд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╡рд┐рд╡рд░рдг рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, pg_chameleon рдЯреВрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╡реНрдпрд╛рдпрд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рддреЛ рджрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рдордиреЗ CentOS Linux рд╕рдВрд╕реНрдХрд░рдг 7.4 рдкрд░ рдпреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдПред
рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рддреИрдпрд╛рд░реА
MySQL рдХреЗ рд▓рд┐рдП Percona Server рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
MySQL рд╕рдВрд╕реНрдХрд░рдг 5.7 рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗрдВред
рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдореИрдВрдиреЗ YUM рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ MySQL рд╕рдВрд╕реНрдХрд░рдг 5.7 рдХреЗ рд▓рд┐рдП рдкреЗрд░рдХреЛрдирд╛ рд╕рд░реНрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm yum install Percona-Server-server-57 echo "mysql ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers usermod -s /bin/bash mysql sudo su - mysql
Pg_chameleon рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ my.cnf рдлрд╝рд╛рдЗрд▓ (MySQL рд╕рд░реНрд╡рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк /etc/my.cnf рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
binlog_format= ROW binlog_row_image=FULL log-bin = mysql-bin server-id = 1
рдЕрдм, my.cnf рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, MySQL рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВред
$ service mysql start
Mysqld.log рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд░реВрдЯ рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ mysqladmin рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реВрдЯ рдкрд╛рд╕рд╡рд░реНрдб рд░реАрд╕реЗрдЯ рдХрд░реЗрдВред
$ grep "temporary" /var/log/mysqld.log $ mysqladmin -u root -p password 'Secret123!'
рдЕрдм MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдирдореВрдирд╛ рд╕реНрдХреАрдорд╛ / рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВред рдореИрдВрдиреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдореНрдкрд╛рдпрд░ рдЯреЗрдмрд▓ рднреА рдмрдирд╛рдпрд╛ред
$ wget http://downloads.mysql.com/docs/sakila-db.tar.gz $ tar -xzf sakila-db.tar.gz $ mysql -uroot -pSecret123! < sakila-db/sakila-schema.sql $ mysql -uroot -pSecret123! < sakila-db/sakila-data.sql $ mysql -uroot -pSecret123! sakila -e "create table emp (id int PRIMARY KEY, first_name varchar(20), last_name varchar(20))"
Pg_chameleon рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рдЙрд╕реЗ рдЙрдЪрд┐рдд рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред
$ mysql -uroot -p create user 'usr_replica'@'%' identified by 'Secret123!'; GRANT ALL ON sakila.* TO 'usr_replica'@'%'; GRANT RELOAD, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'usr_replica'@'%'; FLUSH PRIVILEGES;
MySQL рд╕рд░реНрд╡рд░ ('usr_replica' @ '%') рдкрд░ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддреЗ рд╕рдордп, "IP" рд╡рд░реНрдг рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд IP рдкрддреЗ рдпрд╛ pg_chameleon рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
PostgreSQL рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
PostgreSQL рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдЪрд▓рд╛рдПрдБред
PostgreSQL рд╕рдВрд╕реНрдХрд░рдг 10.x рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
yum install https://yum.postgresql.org/10/redhat/rhel-7.4-x86_64/pgdg-centos10-10-2.noarch.rpm yum install postgresql10* su - postgres $/usr/pgsql-10/bin/initdb $ /usr/pgsql-10/bin/pg_ctl -D /var/lib/pgsql/10/data start
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЙрдЧ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ PostgreSQL рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде pg_chameleon PostgreSQL рдореЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдПрдХ рд▓рдХреНрд╖реНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рднреА рдмрдирд╛рдПрдБред
postgres=# CREATE USER usr_replica WITH ENCRYPTED PASSWORD 'secret'; CREATE ROLE postgres=# CREATE DATABASE db_replica WITH OWNER usr_replica; CREATE DATABASE
Pg_chameleon рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг
рд╕реНрдЯреЗрдЬ 1. рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рдкрд╛рдпрдерди рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг 3.6 рдФрд░ pg_chameleon рд╕рдВрд╕реНрдХрд░рдг 2.0.8 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдУрдПрд╕ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг 3.x рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред
yum install gcc openssl-devel bzip2-devel wget cd /usr/src wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz tar xzf Python-3.6.6.tgz cd Python-3.6.6 ./configure --enable-optimizations make altinstall python3.6 -m venv venv source venv/bin/activate pip install pip --upgrade pip install pg_chameleon
рд╕реНрдЯреЗрдЬ 2. рдЗрд╕ рдЯреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдВ рд╕реНрд░реЛрдд рдФрд░ рд▓рдХреНрд╖реНрдп рд╕рд░реНрд╡рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреА, рдФрд░ рд▓реЙрдЧ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ред Pg_chameleon рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
$ chameleon set_configuration_files
рдЬрдм рдпрд╣ рдЖрджреЗрд╢ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╡реЗ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХрдорд╛рдВрдб рдиреЗ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдХрдИ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдФрд░ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдиреЗ рдЗрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдерд╛ред
creating directory /var/lib/pgsql/.pg_chameleon creating directory /var/lib/pgsql/.pg_chameleon/configuration/ creating directory /var/lib/pgsql/.pg_chameleon/logs/ creating directory /var/lib/pgsql/.pg_chameleon/pid/ copying configuration example in /var/lib/pgsql/.pg_chameleon/configuration//config-example.yml
рдирдореВрдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ, default.yml рдХрд╣реЗрдВ
$ cd .pg_chameleon/configuration/ $ cp config-example.yml default.yml
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореЗрд░реА default.yml рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдж рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рджреМрд░рд╛рди рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдбреЗрдЯрд╛ рд╣реЗрд░рдлреЗрд░ рднрд╛рд╖рд╛ рдХреА рдШрдЯрдирд╛рдПрдВ рдЬрд┐рдиреНрд╣реЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдЪрдпрдирд┐рдд рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
--- #global settings pid_dir: '~/.pg_chameleon/pid/' log_dir: '~/.pg_chameleon/logs/' log_dest: file log_level: info log_days_keep: 10 rollbar_key: '' rollbar_env: '' # type_override allows the user to override the default type conversion into a different one. type_override: "tinyint(1)": override_to: boolean override_tables: - "*" #postgres destination connection pg_conn: host: "localhost" port: "5432" user: "usr_replica" password: "secret" database: "db_replica" charset: "utf8" sources: mysql: db_conn: host: "localhost" port: "3306" user: "usr_replica" password: "Secret123!" charset: 'utf8' connect_timeout: 10 schema_mappings: sakila: sch_sakila limit_tables: # - delphis_mediterranea.foo skip_tables: # - delphis_mediterranea.bar grant_select_to: - usr_readonly lock_timeout: "120s" my_server_id: 100 replica_batch_size: 10000 replay_max_rows: 10000 batch_retention: '1 day' copy_max_memory: "300M" copy_mode: 'file' out_dir: /tmp sleep_loop: 1 on_error_replay: continue on_error_read: continue auto_maintenance: "disabled" gtid_enable: No type: mysql skip_events: insert: # - delphis_mediterranea.foo #skips inserts on the table delphis_mediterranea.foo delete: # - delphis_mediterranea #skips deletes on schema delphis_mediterranea update:
рдЪрд░рдг 3. рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рддрд┐рдХреГрддрд┐ (рд▓рдХреНрд╖реНрдп рдбреЗрдЯрд╛рдмреЗрд╕) рдмрдирд╛рдПрдВ:
$ chameleon create_replica_schema --debug
рдЙрдкрд░реЛрдХреНрдд рдЖрджреЗрд╢ .gpg_chameleon / рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди / default.yml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рд╕реНрдХреАрдорд╛ рдФрд░ рдиреМ рддрд╛рд▓рд┐рдХрд╛рдПрдБ рдмрдирд╛рддрд╛ рд╣реИред рдЗрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд▓рдХреНрд╖реНрдп рддрдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрд╕реА рдХреЛ рдЕрдЧрд▓реА рдкрддреНрд░рд┐рдХрд╛ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
db_replica=# \dn List of schemas Name | Owner
рдЪрд░рдг 4. рдирд┐рдореНрди рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pg_chameleon рдореЗрдВ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрд░реЛрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрд░реЛрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо mysql рд╣реИ, рдФрд░ рд▓рдХреНрд╖реНрдп Postgres рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдЬрд┐рд╕реЗ pg -conn рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
$ chameleon add_source --config default --source mysql --debug
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдореВрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдбреЗрдЯрд╛ t_sources рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
db_replica=# select * from sch_chameleon.t_sources; -[ RECORD 1 ]-------+---------------------------------------------- i_id_source | 1 t_source | mysql jsb_schema_mappings | {: } enm_status | ready t_binlog_name | i_binlog_position | b_consistent | t b_paused | f b_maintenance | f ts_last_maintenance | enm_source_type | mysql v_log_table | {t_log_replica_mysql_1,t_log_replica_mysql_2} $ chameleon show_status --config default Source id Source name Type Status Consistent Read lag Last read Replay lag Last replay ----------- ------------- ------ -------- ------------ ---------- ----------- ------------ ------------- 1 mysql mysql ready Yes N/AN/A
рдЪрд░рдг 5. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреГрддрд┐ (рд▓рдХреНрд╖реНрдп рдбреЗрдЯрд╛рдмреЗрд╕) рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред рд╕реНрд░реЛрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╣реИрдВред
$ chameleon init_replica --config default --source mysql --debug
рдЖрд░рдВрдн рдореЗрдВ MySQL рд╕рд░реНрд╡рд░ (рд╕реНрд░реЛрдд) рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
- рддрд╛рд▓рд┐рдХрд╛ рдХреИрд╢ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ рдФрд░ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ рд╕реЗрдЯ рдХрд░реЗрдВ
- рд╕реНрд░реЛрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░реЗрдВ
- рдЕрдирд▓реЙрдХ
рдЙрдкрд░реЛрдХреНрдд рдХрдорд╛рдВрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рдХреНрд╖реНрдп рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рд╕реНрдХреАрдорд╛ рдмрдирд╛рддрд╛ рд╣реИред
Default.yml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдордиреЗ рдирд┐рдореНрди рд╕реНрдХреАрдорд╛ рдореИрдкрд┐рдВрдЧ (рд╕реНрдХреАрдорд╛_ рдореИрдкрд┐рдВрдЧ) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
schema_mappings: sakila: sch_sakila
рд▓рдХреНрд╖реНрдп db_replica рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЕрдм рдПрдХ рдирдпрд╛ рд╕реНрдХреЙрдЯ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
db_replica=# \dn List of schemas Name | Owner
рдЪрд░рдг 6. рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╢реБрд░реВ рдХрд░реЗрдВред
$ chameleon start_replica --config default --source mysql
рдЪрд░рдг 7. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реНрдерд┐рддрд┐ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред
$ chameleon show_status --config default $ chameleon show_errors
рдпрд╣ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реНрдерд┐рддрд┐ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
$ chameleon show_status --source mysql Source id Source name Type Status Consistent Read lag Last read Replay lag Last replay ----------- ------------- ------ -------- ------------ ---------- ----------- ------------ ------------- 1 mysql mysql running No N/AN/A == Schema mappings == Origin schema Destination schema --------------- -------------------- sakila sch_sakila == Replica status == --------------------- --- Tables not replicated 0 Tables replicated 17 All tables 17 Last maintenance N/A Next maintenance N/A Replayed rows Replayed DDL Skipped rows
рдЕрдм рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЪрд░рдг 8. рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП, рдЖрдк MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдерд╛ред
$ mysql -u root -pSecret123! -e "INSERT INTO sakila.emp VALUES (1,'avinash','vallarapu')" mysql: [Warning] Using a password on the command line interface can be insecure. $ psql -d db_replica -c "select * from sch_sakila.emp" id | first_name | last_name ----+------------+----------- 1 | avinash | vallarapu (1 row)
рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рд▓реЙрдЧ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ MySQL рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд░рд┐рдХреЙрд░реНрдб рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЖрдк рд▓рдХреНрд╖реНрдп рд╕реНрд░реЛрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрдИ рд╕реНрд░реЛрдд рдкреНрд░рддрд┐рдХреГрддрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд▓рд┐рдВрдХ
рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдЖрдк pg_chameleon рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред