Tuesday, October 25, 2011

MySQL 5.5 Replication Procedure

OverView

Step by Step Approach to MySQL Replication
  • Make sure the database in each server (A, B, C, D) is in same state.
§  Make a dump of database on any one of the server A and copy that into rest of the entire server B, C, D.
§  Server A command line> mysqldump -u <mysql user> -p<mysql password> -c <database name> > <filename of dump>
§  Copy the dump file created in Server A to Server B, C and D.
§  Repeat the following command in Server B, C and D.
§  Server B, C, D command line> mysql -u <mysql user> -p<mysql password> -D <database name> < <filename of dump>
§  Make sure that the databases in all four servers look alike.
  • Create a "slave user" on each server. These users are used by MySQL for the slave to master connection and need to be given specific privileges.
§  Repeat the following in all four servers MySQL command line.
§  Server MySQL command line> USE mysql;
§  Server MySQL command line> INSERT INTO user (Host, User, Password, Select_priv, Reload_priv, Super_priv, Repl_slave_priv, ssl_cipher, x509_issuer, x509_subject) VALUES ('<Hostname/IP>', '<slave_user>', password('<slave_password>'), 'Y', 'Y', 'Y', 'Y', ‘ ‘, ‘ ‘, ‘ ‘);
§  Server MySQL command line> GRANT REPLICATION SLAVE ON *.* TO ‘slave_user’@’%’ IDENTIFIED BY ‘slave_password’;
§  Server MySQL command line> FLUSH ALL PRIVILEGES;
·         Delete the following files in all the servers, inside the MySQL data folder. Usually it is C:\ProgramData\MySQL\MySQL Server 5.5\data.
§  Stop MySQL service
§  *.err, *.pid, master.info, relay-log.info, *-relay-bin.*
§  Start MySQL service
·         Open and edit my.ini in all servers for Slave Configuration.
§  Stop MySQL services.
§  Comment “skip-innodb”
§  Uncomment “innodb_flush_log_at_trx_commit=1”
§  Add the following…
#Replication Configuration Server A
sync_binlog=1
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 10
auto-increment-offset = 1
log-slave-updates
replicate-do-db = <database1>
                                replicate-do-db = <database2>
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
log-bin = C:\mysql\log\log-bin.log # change this to a path/name appropriate to your system
binlog-do-db = <database1>
binlog-do-db = <database2>

#Replication Configuration Server B
sync_binlog=1
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 10
auto-increment-offset = 2
log-slave-updates
replicate-do-db = <database name>
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
log-bin = C:\mysql\log\log-bin.log # change this to a path/name appropriate to your system
binlog-do-db = <database1>
binlog-do-db = <database2>
 
#Replication Configuration Server C
sync_binlog=1
server-id = 3
replicate-same-server-id = 0
auto-increment-increment = 10
auto-increment-offset = 3
log-slave-updates
replicate-do-db = <database1>
                                replicate-do-db = <database2>
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
log-bin = C:\mysql\log\log-bin.log # change this to a path/name appropriate to your system
binlog-do-db = <database1>
binlog-do-db = <database2>

#Replication Configuration Server D
sync_binlog=1
server-id = 4
replicate-same-server-id = 0
auto-increment-increment = 10
auto-increment-offset = 4
log-slave-updates
replicate-do-db = <database1>
replicate-do-db = <database2>
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
log-bin = C:\mysql\log\log-bin.log # change this to a path/name appropriate to your system
binlog-do-db = <database1>
binlog-do-db = <database2>
§  Note: The two MySQL configuration variables that prevent key collisions are auto-increment-increment and auto-increment-offset. The value of auto-increment-increment should be at least set to N, where N is equal to the number of servers in the replication setup (in this case two). The auto-increment-offset and server-id configuration variables should be set as consecutive integers (in this case 1, 2, 3, and 4). Server-id should be any unique integer assigned to each server.
§  The path given in log-bin (in next step) should be a valid path. Create the folders if doesn’t exist.
§  After adding the server-id, the server has to be restarted.
§  Start MySQL service.
·         Set the Master Configuration from the MySQL command line on each server.
§  Server MySQL command line> STOP SLAVE;
§  Server MySQL command line> SHOW MASTER STATUS;
Eg:
 File                          -  log-bin.000002
 Position                   - 107
 Binlog_Do_DB        - <database name>
Binlog_Ignore_DB   -
§  Change Master Configuration.
Server B MySQL command line> CHANGE MASTER TO MASTER_HOST='<Server A’s IP>', MASTER_USER='<A’s slave_user>', MASTER_PASSWORD='<A’s slave_password>', MASTER_PORT=3306, MASTER_LOG_FILE='<A’s Master Filename
MASTER_LOG_POS=<A’s Master Position>, MASTER_CONNECT_RETRY=60;
Server C MySQL command line> CHANGE MASTER TO MASTER_HOST='<Server B’s IP>', MASTER_USER='<B’s slave_user>', MASTER_PASSWORD='<B’s slave_password>', MASTER_PORT=3306, MASTER_LOG_FILE='<B’s Master Filename>',
MASTER_LOG_POS=<B’s Master Position>, MASTER_CONNECT_RETRY=60;
Server D MySQL command line> CHANGE MASTER TO MASTER_HOST='<Server C’s IP>', MASTER_USER='<C’s slave_user>', MASTER_PASSWORD='<C’s slave_password>', MASTER_PORT=3306, MASTER_LOG_FILE='<C’s Master Filename>',
MASTER_LOG_POS=<C’s Master Position>, MASTER_CONNECT_RETRY=60;
Server A MySQL command line> CHANGE MASTER TO MASTER_HOST='<Server D’s IP>', MASTER_USER='<D’s slave_user>', MASTER_PASSWORD='<D’s slave_password>', MASTER_PORT=3306, MASTER_LOG_FILE='<D’s Master Filename>',
MASTER_LOG_POS=<D’s Master Position>, MASTER_CONNECT_RETRY=60;     
§  Server MySQL command line> START SLAVE;
§  Server MySQL command line> SHOW SLAVE STATUS;
Look for the following fields in the row
     slave_IO_State: Waiting for master to send event           
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            Last_Errno: 0
            Last_IO_Errno: 0
            Last_SQL_Errno: 0
            Master_Server_Id: <Master’s server-id>
*       Now test by making some changes to the database. It should be replicated on all 4 Servers.

SVN Tutorial using Command Prompt


Update Trunk from Branch

1)     Create a working folder for trunk.
2)     Checkout trunk from the server.
svn checkout <Server URL> <Working Path>
3)     Merge branch to trunk in trunk’s working folder.
svn merge <Branch URL> <Working Path>
4)     Commit changes.
svn commit <Working Path> -m “<log>”
Note : If there is any conflicts while merging do a resolve
          svn resolve –R - -accept working <Working Path>

Create a New Tag & Branch from Trunk

1)     Now create a new branch (To work on next release. Create two branch, one for next version & one for a patch release on same version) and tags.
a.     Copy head trunk revision to new branch.
svn copy <Trunk URL> <Branch URL> -m “<log>”
b.    Copy head trunk revision to new tag.
svn copy <Trunk URL> <Tag URL> -m “<log>”

Delete files/folder from SVN Repository

1)     Delete command will be commited to the repository automatically.
svn delete <URL> -m “<log>”
2)     Multiple files/folders can be deleted simultaneously.
svn delete <URL1> <URL2> <URL3> ……. –m “<log>”

Using Local Repository for Training

1)     Create a new folder for SVN Repository.
2)     Create SVN Repository on the new folder created.
svnadmin create –fs-type fsfs <Repository Path>
3)     Export desired revision from the server repository for practice.
svn export –r <rev#> <ServerURL>
4)     Local repository is now ready for training.
Note: Examples for Path & URL format.
Path/URL
Examples
Path
C:\folder1\folder2……
URL - Server Repository
URL - Local Repository
File:///C:/folder1/folder2/folder3/.....