рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВред рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг CentOS 5.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рд╣рдо PostgreSQL 8.4.7 рдФрд░ SymmetricDS-2.2.2 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреНрдпрд╛ рд╣реИ?
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╣реИред рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдХреА рдЧрд▓рддреА рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдкрд╣рд▓реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдХреА рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рджреВрд╕рд░рд╛ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдЖрддрд╛ рд╣реИ), рдпрд╛ рд▓реЛрдб рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рд╡рд┐рднрд┐рдиреНрди рд╕рд░реНрд╡рд░ рд╡рд┐рднрд┐рдиреНрди рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рджреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддреНрдпреЗрдХ PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рджреЛ рд╕рдорд╛рди рд╕рд░реНрд╡рд░ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдХрд╛ рдЖрдИрдкреА рдкрддреЗ 10.0.2.20 рд╣реЛрдЧрд╛, рджреВрд╕рд░реЗ рдХрд╛ 10.0.2.21 рд╣реЛрдЧрд╛, рдФрд░ рджреЛрдиреЛрдВ рдЧреЗрдЯрд╡реЗ рдХрд╛ 10.0.2.2 рд╣реЛрдЧрд╛ред
рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП VirtualBox, рдЗрд╕рдореЗрдВ рджреЛ рд╡рд░реНрдЪреБрдЕрд▓ рд╕рд░реНрд╡рд░ рдмрдирд╛рдПрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рд╛рдПрдВред
рдЙрдкрд░реЛрдХреНрдд рдЖрджреЗрд╢реЛрдВ рдореЗрдВ, рдкрд╣рд▓рд╛ рд╡рд░реНрдг # рдпрд╛ $ рдЪрд┐рд╣реНрди рд╣реЛрдЧрд╛, рдЗрди рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рдХреЛ рд░реВрдЯ рд╕реЗ рдпрд╛ рдирд┐рдпрдорд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рдХреНрдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП:
рдЪрд▓реЛ рд╕реЗрдЯрдЕрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдкреЛрд╕реНрдЯрдЧреНрд░реИрдХреНрд╕реНрд▓ рд╕реЗрд╡рд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ:
# chkconfig --level 3 postgresql on
# service postgresql start
рдЕрдм рд╣рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдорд╛рдереЗ" рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
# createdb mytest
psql: FATAL: user "root" does not exist
рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд▓рд┐рдирдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЗрдВ рдПрдХ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо "sa" рдФрд░ рд▓рд┐рдирдХреНрд╕ рдпреВрдЬрд░ рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдореЗрдВ рдПрдХ рд╕реБрдкрд░рдпреБрд╕рд░ рдмрдирд╛рдПрдВрдЧреЗ, рдкрд╛рд╕рд╡рд░реНрдб рд╕рдорд╛рди рд╣реЛрдЧрд╛, "sa"ред
# adduser -m sa
# su - postgres
$ createuser -d -s -P sa
рдЕрдм рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рд╕рд╛" рдХреЗ рддрд╣рдд рдПрдХ рдХрдорд╛рдВрдб рд╢реБрд░реВ рдХрд░рдХреЗ рдПрдХ рдЯреЗрдмрд▓ "рдЯреЗрд╕реНрдЯ" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
# su - sa
$ createdb mytest
рдЕрдм рдЖрдк psql рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
psql mytest
рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рджреЛ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
SymmetricDS рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдЦреИрд░, рдЕрдм рдпрд╣ рдХрд╛рдо рдХрд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рджреЛ рд╕рд░реНрд╡рд░ рд╣реИрдВред
рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдкрд┐рдВрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ SymmetricDS рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкреЛрд░реНрдЯ 8080 рдФрд░ 9090 рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдареАрдХ рд╣реИред SymmetricDS рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ java рджреБрднрд╛рд╖рд┐рдпрд╛ рдФрд░ JRE 1.6 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
java.com рд╕реЗ jre-6u24-linux рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ (рдмрд╕ рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рдЪрд▓рд╛рдПрдВ:
рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ):
# ln -s /usr/java/latest/bin/java /usr/bin/java
рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рд▓рд┐рдЦреЗрдВ - рдЙрдирдХреЗ рдмрд┐рдирд╛, SymmetricDS рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрдХреНрд╖рд╛ рдХреЛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛ред
$ CLASSPATH=/usr/java/latest/lib; export CLASSPATH
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдореНрдореА (рд╕рд┐рдореЗрдЯреНрд░рд┐рдХ рдбреАрдПрд╕ рдХреА рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓) рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╛рд╣рд░реА рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдФрд░ рди рдХреЗрд╡рд▓ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░) рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдХреЛ рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдпреВрдирд┐рдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ рджреЛ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
1) рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ /var/lib/pgsql/data/postgresql.conf рдореЗрдВ рдЕрд╕рд╣рдЬ рдХрд░реЗрдВ:
listen_addresses = '*'
2) /var/lib/pgsql/data/pg_hba.conline рдореЗрдВ рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╕реНрдЯ рд╡рд┐рдзрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
3) рдлрд╝рд╛рдЗрд▓ /var/lib/pgsql/data/postgresql.conf рдореЗрдВ рд╕рддреНрд░ рдЪрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:
custom_variable_classes = 'symmetric'
4) рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ:
# service postgresql restart
рдЖрдк рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
$ psql mytest -U sa -h localhost
рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: psql: FATAL: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "sa" рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╡рд┐рдлрд▓ рд╣реБрдЖред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, psql рдХреЛ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ SymmetricDS-2.2.2 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреЛрдиреЛрдВ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рдЕрдирдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ:
$ unzip symmetric-ds-2.2.2-server.zip
$ cd symmetric-ds-2.2.2/samples
рд╕рдордорд┐рддрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рд╣рдо рдЗрд╕ рдирдореВрдиреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реИрдВ root.properties рдФрд░ client.properties рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдЙрдиреНрд╣реЗрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реИрдХреНрд╕реНрд▓ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрдирд╕реБрдирд╛ рдХрд░рдиреЗ, рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдпрд╛ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
root.properties рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдиреЛрдб рдкрд░ рд╣реИ, client.properties - рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдкрд░ред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ SymmetricDS рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
Formireum рдПрдХ рдРрд╕реА root.properties рдлрд╝рд╛рдЗрд▓ рд╣реИ:
root.properties
# The class name for the JDBC Driver
db.driver=org.postgresql.Driver
# The JDBC URL used to connect to the database
db.url=jdbc:postgresql://localhost/mytest
# The user to login as who can create and update tables
db.user=sa
# The password for the user to login as
db.password=sa
registration.url=http://10.0.2.20:8080/sync
sync.url=http://10.0.2.20:8080/sync
# Do not change these for running the demo
group.id=corp
external.id=00000
# Don't muddy the waters with purge logging
job.purge.period.time.ms=7200000
рд░реВрдЯ рдиреЛрдб рдкрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдБ:
$ psql postgres -c "CREATE database mytest;"
рдЗрд╕ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдЯреА 2 рддрд╛рд▓рд┐рдХрд╛ рд╣реЛрдЧреА рдЬреЛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ (рдкреНрд░рддрд┐рдХреГрддрд┐) рд╣реЛрдЧреАред рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВред
$ ../bin/sym -p root.properties --run-ddl create_sample.xml
create_sample.xml рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
<? xml рд╕рдВрд╕реНрдХрд░рдг = "1.0"?>
<! DOCTYPE рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд┐рд╕реНрдЯрдо "http://db.apache.org/torque/dtd/database.dtd">
<рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдирд╛рдо = "mytest">
<рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо = "t2">
<рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо = "рдЖрдИрдбреА" рдкреНрд░рдХрд╛рд░ = "INTEGER" рдЖрд╡рд╢реНрдпрдХ = "рд╕рддреНрдп" рдкреНрд░рд╛рдердорд┐рдХ рдХреА = "рд╕рд╣реА" рдСрдЯреЛрдЗрдВрдЯрд░рдореЗрдВрдЯ = "рд╕рдЪ" />
<рдХреЙрд▓рдо рдирд╛рдо = "mydata" рдкреНрд░рдХрд╛рд░ = "VARCHAR" рдЖрдХрд╛рд░ = "64" рдЖрд╡рд╢реНрдпрдХ = "рдЧрд▓рдд" />
<рдХреЙрд▓рдо рдирд╛рдо = "intval" рдкреНрд░рдХрд╛рд░ = "DECIMAL" рдЖрдХрд╛рд░ = "10.2" рдЖрд╡рд╢реНрдпрдХ = "рдЧрд▓рдд" />
</ рддрд╛рд▓рд┐рдХрд╛>
</ рдбрд╛рдЯрд╛рдмреЗрд╕>
рдЖрдкрдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ plpgsql рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдВ:
$ ./create_func.sh
create_func.sh
#!/bin/sh
psql mytest -U sa -h localhost -c "CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '\$libdir/plpgsql' LANGUAGE C;"
psql mytest -U sa -h localhost -c "CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS '\$libdir/plpgsql' LANGUAGE C;"
psql mytest -U sa -h localhost -c "CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler VALIDATOR plpgsql_validator;"
рдЕрдм рдЖрдк рдореВрд▓ рдиреЛрдб рдкрд░ SymmetricDS рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ ../bin/sym -p root.properties --auto-create
рдЖрдЙрдЯрдкреБрдЯ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
[sa@CENTOS1 samples]$ ../bin/sym -p root.properties --auto-create
Log output will be written to ../logs/symmetric.log
SymmetricLauncher - Option: name=properties, value={root.properties}
SymmetricLauncher - Option: name=auto-create, value={}
PlatformFactory - The name/version pair returned for the database, PostgreSQL8,
was not mapped to a known database platform. Defaulting to using just the database type of PostgreSql
PostgreSqlDbDialect - The DbDialect being used is org.jumpmind.symmetric.db.postgresql.PostgreSqlDbDialect
ConfigurationService - Initializing SymmetricDS database.
PostgreSqlDbDialect - There are SymmetricDS tables missing. They will be auto created.
PostgreSqlDbDialect - Starting auto update of SymmetricDS tables.
PostgreSqlDbDialect - Just installed sym_triggers_disabled
PostgreSqlDbDialect - Just installed sym_node_disabled
PostgreSqlDbDialect - Just installed sym_fn_sym_largeobject
ConfigurationService - Auto-configuring config channel.
ConfigurationService - Auto-configuring reload channel.
ConfigurationService - Done initializing SymmetricDS database.
рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рдЗрд╕ рд▓рд┐рдкрд┐ рдиреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП 26 рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рдЯреЗрдмрд▓ sym_ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░рдХреЗ рдЙрдирдХреА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
$ psql mytest -c "select tablename from pg_tables where tablename like 'sym%';"
рдЕрдЧрд▓рд╛ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрднреА рдмрдирд╛рдИ рдЧрдИ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЖрдмрд╛рдж рдХрд░рдХреЗ рд╕рдордорд┐рддрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
$ ../bin/sym -p root.properties --run-sql insert_sample.sql
рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
insert_sample.sql
insert into t2(mydata, intval) values('sdsdsdsds', 102);
--
-- Nodes
--
insert into sym_node_group (node_group_id, description)
values ('corp', 'Central Office');
insert into sym_node_group (node_group_id, description)
values ('store', 'Store');
insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action)
values ('store', 'corp', 'P');
insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action)
values ('corp', 'store', 'W');
insert into sym_node (node_id, node_group_id, external_id, sync_enabled)
values ('00000', 'corp', '00000', 1);
insert into sym_node_identity values ('00000');
--
-- Channels
--
insert into sym_channel
(channel_id, processing_order, max_batch_size, enabled, description)
values('channel_t2', 1, 100000, 1, 't2 data from register and back office');
--
-- Triggers
--
insert into sym_trigger
(trigger_id,source_table_name,channel_id,last_update_time,create_time)
values('trigger_t2','t2','channel_t2',current_timestamp,current_timestamp);
-- Example of a "dead" trigger, which is used to only sync the table during initial load
insert into sym_trigger
(trigger_id,source_table_name,channel_id, sync_on_insert, sync_on_update, sync_on_delete, last_update_time,create_time)
values('t2_dead','t2','channel_t2',0,0,0,current_timestamp,current_timestamp);
--
-- Routers
--
-- In this example, both routers pass everything all the time.
insert into sym_router
(router_id,source_node_group_id,target_node_group_id,create_time,last_update_time)
values('corp_store_identity', 'corp', 'store', current_timestamp, current_timestamp);
insert into sym_router
(router_id,source_node_group_id,target_node_group_id,create_time,last_update_time)
values('store_corp_identity', 'store', 'corp', current_timestamp, current_timestamp);
--
-- Trigger Router Links
--
insert into sym_trigger_router
(trigger_id,router_id,initial_load_order,last_update_time,create_time)
values('trigger_t2','corp_store_identity',100,current_timestamp,current_timestamp);
insert into sym_trigger_router
(trigger_id,router_id,initial_load_order,last_update_time,create_time)
values('trigger_t2','store_corp_identity', 200, current_timestamp, current_timestamp);
-- Example of a "dead" trigger, which is used to only sync the table during initial load
insert into sym_trigger_router
(trigger_id,router_id,initial_load_order,last_update_time,create_time)
values('trouter_dead','corp_store_identity', 300, current_timestamp, current_timestamp);
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдмрджрд▓рддреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ - SymmetricDS рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рдЬрдм рднреА рдЖрдк sym_trigger рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ SymmetricDS рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЖрдк source_table_name рддрд╛рд▓рд┐рдХрд╛ рдмрджрд▓рддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ t2 рддрд╛рд▓рд┐рдХрд╛ рд╣реИ)ред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдорд╛рд░реНрдЧ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реИрдВ (рджреЗрдЦреЗрдВ sym_trigger_router)ред рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рд░реНрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ, рддреЛ рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛ рдЪреИрдирд▓ рд╣реИрдВ, рджреЛрдиреЛрдВ рддрд░рдл: рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рджреВрд╕рд░реЗ рдФрд░ рджреВрд╕рд░реЗ рд╕реЗ рдкрд╣рд▓реЗ (рджреЗрдЦреЗрдВ sym_router)ред
рд╣рдо рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдХрдорд╛рдВрдб рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рдЫреЛрдбрд╝реЗрдЧрд╛, рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рд▓реЙрдЧ рд▓рд╛рдПрдЧрд╛ред
$ ../bin/sym -p root.properties --port 8080 --server
рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкрдВрдЬреАрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ (рджреВрд╕рд░реА рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдВрдбреЛ рд╕реЗ рдЪрд▓рд╛рдПрдВ)
$ ../bin/sym -p root.properties --open-registration "store,1"
рд╡рд╣ рд╕рдм рд╣реИред рд░реВрдЯ рдиреЛрдб рдкрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕рд░реНрд╡рд░ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ SymmetricDS рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗрдЯрд┐рдВрдЧ рдХрд░реЗрдВред рд╣рдо рдРрд╕реА рдлрд╛рдЗрд▓ рдХреЛ рд╕рд┐рдорд┐рдЯреНрд░рд┐рдХ-рдбреАрдПрд╕-2.2.2 / рд╕реИрдВрдкрд▓ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ:
client.properties
# The class name for the JDBC Driver
db.driver=org.postgresql.Driver
# The JDBC URL used to connect to the database
db.url=jdbc:postgresql://localhost/mytest
# The user to login as who can create and update tables
db.user=sa
# The password for the user to login as
db.password=sa
# The HTTP URL of the root node to contact for registration
registration.url=http://10.0.2.20:8080/sync
# Do not change these for running the demo
group.id=store
external.id=1
job.routing.period.time.ms=2000
# This is how often the push job will be run.
job.push.period.time.ms=5000
# This is how often the pull job will be run.
job.pull.period.time.ms=5000
рд╣рдо рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ:
$ psql postgres -c "CREATE database mytest;"
рдФрд░ рдЗрд╕рдореЗрдВ рд╕рдорд╛рди рдЯреНрд░рд┐рдЧрд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдмрдирд╛рдПрдВ:
$ ../bin/sym -p client.properties --run-ddl create_sample.xml
$ ./create_func.sh
рд╣рдо рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рддрд┐рдХреГрддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
$ ../bin/sym -p client.properties --port 9090 --server
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрднреА рддрдХ рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рддрд┐рдХреГрддрд┐ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВред рдЪрд▓реЛ рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ:
$ psql mytest -c "select * from t2;"
рдпрд╣ рдХрдорд╛рдВрдб рд░реВрдЯ рдиреЛрдб рдкрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, рд╡рд╣рд╛рдБ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд_sample.sql рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ рд░реВрдЯ рдиреЛрдб рдкрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдВ рд╡рд╣реА рдХрдорд╛рдВрдб рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред рдЯреЗрдмрд▓ рдЦрд╛рд▓реА рд╣реЛрдЧреАред
рдЕрдм рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рдд: рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдЗрд╕ рдХрдорд╛рдВрдб рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!
$ ../bin/sym -p root.properties --reload-node 1
рд╕реЗрдХрдВрдб рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдореЗрдВ, рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░, рдЯреА 2 рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕рдорд╛рди рд╣реЛрдЧреА! рд╣реБрд░реНрд░реЗ!
рдпрджрд┐ рдЖрдкрдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдиреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╕рд░реНрд╡рд░ рдЖрдИрдкреА рдкрддреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ (рд╕рднреА 26 рд╕рд┐рдорд┐рдЯреНрд░рд┐рдХреИрдбреНрд╕ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде) рдХреЛ рдорд╛рд░реЗрдВ рдФрд░ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛрдиреЛрдВ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:
$ psql postgres -c "drop databse mytest;"
рдФрд░ рдЗрд╕ рд▓рд╛рдЗрди рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджреЗрдЦреЗрдВ :)
$ psql postgres -c "CREATE database mytest;"
рдЕрд╕рд▓реА рднрд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг
рд╣рдо рд░реВрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрд▓ рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднрд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд▓реВрдк рдореЗрдВ рдПрдХ рд╕реМ рдЕрджреНрдпрддрди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред
test.pl
#! / usr / рдмрд┐рди / рдкрд░реНрд▓
рдбреАрдмреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ;
рдореЗрд░реЗ $ dbh = DBI-> рдХрдиреЗрдХреНрдЯ ("DBI: Pg: dbname = mytest", "sa", "sa");
рдХреЗ рд▓рд┐рдП (рдореЗрд░реА $ idval = 5000; $ idval <9000; $ idval ++)
{
$ dbh-> do ("t2 (id, mydata, intval) рдорд╛рдиреЛрдВ ($ idval, 'рдХреБрдЫ рдбреЗрдЯрд╛', $ idval)" рдореЗрдВ рдбрд╛рд▓реЗрдВ;);
}
рдореЗрд░рд╛ $ рдирд╡рд╛рд╡рд▓ = 3434;
рдореЗрд░рд╛ $ рдЕрдВрддрд░рд╛рд▓ = 0;
(рдореЗрд░реЗ $ j = 0; $ j <100000; $ j ++)
{
рдХреЗ рд▓рд┐рдП (рдореЗрд░реА $ idval = 5000; $ idval <9000; $ idval ++)
{
$ newval ++;
$ рдЕрдВрддрд░рд╛рд▓ ++;
$ dbh-> do ("UPDATE t2 set intval = $ newval рдЬрд╣рд╛рдБ id = $ idval");
рдкреНрд░рд┐рдВрдЯрдл ("UPD [% 04d] id =% d val =% d \ r", $ j, $ idval, $ newval);
рдЕрдЧрд░ ($ рдЕрдВрддрд░рд╛рд▓ == 100)
{
$ рдЕрдВрддрд░рд╛рд▓ = 0;
`рдкрд┐рдВрдЧ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ -w 1> / рджреЗрд╡ / рдирд▓ 2> & 1`;
}
}
}
$ dbh-> рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ;
"\ n \ n" рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ;
рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд░реВрдЯ рдиреЛрдб рдкрд░ рдЪрд▓рд╛рдиреЗ рд╕реЗ, рддрд╛рд▓рд┐рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧреАред рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреИрд╕реЗ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреБрдЫ рджреЗрд░реА рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
$ psql mytest -c "select * from t2 where id=5000;"
рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЧрд╣рди рдорд╛рди рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЙрдЪреНрдЪ рд▓реЛрдб рд╕рдорд╕реНрдпрд╛рдУрдВ
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрдЪреНрдЪ рд▓реЛрдб рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рдереЗред рдкреНрд░рддрд┐рдХреГрддрд┐ рдХрд░рддреЗ рд╕рдордп, SymmetricDS рджреВрд░рд╕реНрде рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдиреА sym_data рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░реВрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдиреНрд╕рд░реНрдЯ / рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЙрдЪреНрдЪ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкрд░ (рдЬреИрд╕реЗ, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕реИрдХрдбрд╝реЛрдВ рдЖрд╡реЗрд╖рдг), рд╕рд┐рдореНрдлрдбрд╛рдЯрд╛ рдЯреЗрдмрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдмрдврд╝рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдХреГрддрд┐ рдХреЗ рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Symmetric DS рдореЗрдВ Purge Service рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рдкреНрд░рдореБрдЦ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ root.properties рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:
start.purge.job
job.purge.period.time.ms (рдХрд┐рддрдиреА рдмрд╛рд░ Purge Job рдЪрд▓реЗрдЧреА)
purge.retention.minutes (рджреВрд╕рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рднреЗрдЬреЗ рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдХрдм рддрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)
рдЕрдВрддрд┐рдо рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реАрдзреЗ sym_data рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдпрд╣ purge.retention.minutes * рдбрд╛рд▓рдиреЗ / рдЕрдкрдбреЗрдЯ рдкреНрд░рддрд┐ рдорд┐рдирдЯ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред
PurgeService рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдкреБрд╢ рдФрд░ рдкреЛрд▓ (рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдкрд░реНрдЬ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рд╕рд┐рдорд┐рдЯреНрд░рд┐рдХрдбреАрдПрд╕ рд╕реЗрд╡рд╛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╡реГрджреНрдзрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд░реНрдЬ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдзрд┐рдорд╛рдирддрдГ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдХрдо рд▓реЛрдб рдХреА рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди:
../bin/sym тАУp root.properties тАУX
рдЧреБрдб рд▓рдХред