天天看點

Linux環境中MySQL主從同步--添加新的從庫

目前我認為資料庫主從有兩大應用價值:

1.從庫相當于主庫的備份。雖然資料庫的主從并不能代替/取代備份,例如錯誤的資料可能毀掉所有的資料庫,但主從也是在一種可讀的狀态下保持備份的一種實作方式。

2.從庫可以緩解主庫的壓力,能提高性能。由于從庫是隻讀的,是以在讀取查詢方面,從庫可以代替主庫,承擔一定的壓力,無論是這些壓力是來自使用者(應用程式)還是開發、運維自己。

mysql的主從其實并不困難,而且需要做的事情也并不多,mysql官方給出的文檔中對主從也做出了詳細的指導、說明和解釋,但總共也多少篇幅。鑒于很多網友已經詳細叙寫了相關的文檔或文章,此處就能不贅述了(也可以略微參考本文的最後一部分“資料庫主從的配置過程中使用的一些指令和步驟”)。

簡單說幾句關于添加新的從庫的小技巧。

因為添加從庫時,需要知道master_log_file和master_log_pos,雖然通過在master主庫上執行“show master status”能看到目前的master_log_file和master_log_pos,但實際上這種方法隻能用于master主庫剛開始用的情況下,即資料庫剛建好,沒有任何資料寫入的情況下,或者能将這些資料先手動同步到從庫中去。

一種較為友善的方法就是,通過mysqldump導出主庫的資料庫,同時導出事件、觸發器、函數和視圖,以及master-data,這樣通過檢視mysqldump導出的檔案的前幾行就能找到master_log_file和master_log_pos,這時在将從主庫導出的sql語句在從庫執行以後,就可以通過這一個master_log_file和master_log_pos,配置好從庫,并開始同步。

通過mysqldump導出主庫的資料庫,同時導出事件、觸發器、函數和視圖,以及master-data:

1

<code>/usr/local/mysql/bin/mysqldump</code> <code>-uusername -hipaddress  -ppassword -pport --routines --events --triggers --single-transaction --flush-logs --master-data=1 –databases databasename</code>

如果想單獨導出事件、觸發器、函數和視圖等而不導出資料,則可以執行:

<code>/usr/local/mysql/bin/mysqldump</code> <code>-uusername -hipaddress  -ppassword -pport --routines --events --triggers --no-create-info --no-data --no-create-db</code>

此外将一個資料庫主從的配置過程中使用的一些指令和步驟陳列如下,以作參考或備忘:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

<code># sat aug 22 11:23:03 cst 2015</code>

<code># get mysql 5.5.38 for production use</code>

<code># https://downloads.mariadb.com/archive/index/p/mysql/v/5.5.38</code>

<code># https://downloads.mariadb.com/archives/mysql-5.5/mysql-5.5.38.tar.gz</code>

<code>wget -c https:</code><code>//downloads</code><code>.mariadb.com</code><code>/archives/mysql-5</code><code>.5</code><code>/mysql-5</code><code>.5.38-linux2.6-x86_64.</code><code>tar</code><code>.gz</code>

<code># remove some conflicts</code>

<code>rpm -e mysql-server mysql</code>

<code>userdel mysql</code>

<code>rm</code> <code>-rf </code><code>/usr/local/mysql/</code>

<code>rm</code> <code>-f </code><code>/etc/my</code><code>.cnf</code>

<code>#  set user and group</code>

<code>groupadd -r -g 27 mysql </code>

<code>useradd</code> <code>-r -u 27 -g mysql mysql -c </code><code>"mysql server"</code> <code>-d </code><code>/dev/null</code> <code>-s </code><code>/sbin/nologin</code>

<code>groupadd -r mysql </code>

<code>useradd</code> <code>-r -g mysql mysql -c </code><code>"mysql server"</code> <code>-d </code><code>/dev/null</code> <code>-s </code><code>/sbin/nologin</code>

<code># install  mysql database </code>

<code>tar</code> <code>zxf mysql-5.5.38-linux2.6-x86_64.</code><code>tar</code><code>.gz</code>

<code>cp</code> <code>-r mysql-5.5.38-linux2.6-x86_64 </code><code>/usr/local/mysql</code>

<code># /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --explicit_defaults_for_timestamp --skip-name-resolve</code>

<code>/usr/local/mysql/scripts/mysql_install_db</code> <code>--basedir=</code><code>/usr/local/mysql</code> <code>--datadir=</code><code>/data/mysql/data</code> <code>--user=mysql --skip-name-resolve</code>

<code># run it temporarily </code>

<code># /usr/local/mysql/bin/mysqld_safe &amp;</code>

<code>/usr/local/mysql/bin/mysqld_safe</code> <code>--defaults-</code><code>file</code><code>=</code><code>/etc/my</code><code>.cnf &amp;</code>

<code># set mysql commands </code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/bin/mysql</code> <code>/usr/bin/mysql</code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/bin/mysqladmin</code> <code>/usr/bin/mysqladmin</code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/bin/mysqldump</code> <code>/usr/bin/mysqldump</code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/bin/mysqlbinlog</code> <code>/usr/bin/mysqlbinlog</code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/bin/mysql_config</code> <code>/usr/bin/mysql_config</code>

<code># set mysql root password, etc</code>

<code>/usr/local/mysql/bin/mysql_secure_installation</code>

<code># set mysql library </code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/lib/libmysqlclient</code><code>.so.18.0.0 </code><code>/usr/lib64/libmysqlclient</code><code>.so.18.0.0</code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/lib/libmysqlclient</code><code>.so.18.0.0 </code><code>/usr/lib64/libmysqlclient</code><code>.so.18</code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/lib/libmysqlclient</code><code>.so.18.0.0 </code><code>/usr/lib64/libmysqlclient</code><code>.so</code>

<code>ls</code> <code>-l </code><code>/usr/lib64/libmysqlclient</code><code>.so.18.0.0</code>

<code>ls</code> <code>-l </code><code>/usr/lib64/libmysqlclient</code><code>.so.18</code>

<code>ls</code> <code>-l </code><code>/usr/lib64/libmysqlclient</code><code>.so</code>

<code>vim </code><code>/etc/ld</code><code>.so.conf.d</code><code>/mysql-x86_64</code><code>.conf </code>

<code>    </code><code>/usr/lib64/mysql</code> 

<code>    </code><code>/usr/local/mysql/lib</code>

<code>ldconfig</code>

<code># set mysql replication </code>

<code># master db</code>

<code>cp</code> <code>/usr/local/mysql/support-files/my-small</code><code>.cnf </code><code>/etc/my</code><code>.cnf</code>

<code>sed</code> <code>-i </code><code>"s@server-id\t= 1@server-id       = 101@g"</code> <code>/etc/my</code><code>.cnf</code>

<code>sed</code> <code>-i </code><code>"s@#log-bin=mysql-bin@log-bin=mysql-bin@g"</code> <code>/etc/my</code><code>.cnf</code>

<code>sed</code> <code>-i </code><code>"s@#binlog_format=mixed@binlog_format=mixed@g"</code> <code>/etc/my</code><code>.cnf</code>

<code># slave db</code>

<code>sed</code> <code>-i </code><code>"s@server-id\t= 1@server-id       = 103@g"</code> <code>/etc/my</code><code>.cnf</code>

<code># read errors from logs</code>

<code>cat</code> <code>/usr/local/mysql/data/</code><code>`</code><code>hostname</code><code>`.err</code>

<code># some reference</code>

<code># server-id = 101</code>

<code># log-bin=/usr/local/mysql/data/bin-log</code>

<code># max_binlog_size = 1500m</code>

<code># binlog_cache_size = 128k</code>

<code># binlog-do-db = devdbops</code>

<code># binlog-ignore-db = mysql</code>

<code># log-slave-updates</code>

<code># expire_logs_day=2</code>

<code># binlog_format=mixed</code>

<code># end mysql temporarily</code>

<code>kill</code> <code>-term `</code><code>ps</code> <code>-ef | </code><code>awk</code> <code>'/mysqld_safe/ &amp;&amp; ! /awk/ {print $2}'</code><code>` || </code><code>kill</code> <code>-kill `</code><code>ps</code> <code>-ef | </code><code>awk</code> <code>'/mysqld_safe/ &amp;&amp; ! /awk/ {print $2}'</code><code>`</code>

<code>ps</code> <code>-ef | </code><code>awk</code> <code>'/mysqld_safe/ &amp;&amp; ! /awk/ {print $2}'</code>

<code>kill</code> <code>-term `</code><code>ps</code> <code>-ef | </code><code>awk</code> <code>'/mysqld/ &amp;&amp; ! /awk/ {print $2}'</code><code>` || </code><code>kill</code> <code>-kill `</code><code>ps</code> <code>-ef | </code><code>awk</code> <code>'/mysqld/ &amp;&amp; ! /awk/ {print $2}'</code><code>`</code>

<code>ps</code> <code>-ef | </code><code>awk</code> <code>'/mysqld/ &amp;&amp; ! /awk/ {print $2}'</code>

<code># setting sysvinit </code>

<code>cp</code> <code>/usr/local/mysql/support-files/mysql</code><code>.server </code><code>/etc/init</code><code>.d</code><code>/mysql</code>

<code>chmod</code> <code>+x </code><code>/etc/init</code><code>.d</code><code>/mysql</code>

<code># start mysql database</code>

<code>service mysql start</code>

<code>service mysql status</code>

<code># some operation about replicaion</code>

<code>grant all privileges on *.* to root@</code><code>"%"</code> <code>identified by </code><code>"root"</code><code>;</code>

<code>flush privileges;</code>

<code>create user </code><code>'dev'</code><code>@</code><code>'%'</code> <code>identified by </code><code>'dev'</code><code>;</code>

<code>create database if not exists devdbops;</code>

<code>grant alter,alter routine,create,create routine,create temporary tables,create view,delete,drop,execute,index,insert,lock tables,select,update,show view on devdbops.* to </code><code>'dev'</code><code>@</code><code>"%"</code><code>;</code>

<code>use devdbops;</code>

<code>create table `testtable` (</code>

<code>`</code><code>id</code><code>`  int not null ,</code>

<code>`name`  varchar(255) null ,</code>

<code>`value`  varchar(255) character set utf8 collate utf8_general_ci null ,</code>

<code>primary key (`</code><code>id</code><code>`)</code>

<code>)</code>

<code>;</code>

<code>insert into `testtable` (`</code><code>id</code><code>`, `name`, `value`) values (</code><code>'0'</code><code>, </code><code>'a'</code><code>, </code><code>'b'</code><code>);</code>

<code># create user 'repl'@'%.mydomain.com' identified by 'slavepass';</code>

<code># grant replication slave on *.* to 'repl'@'%.mydomain.com';</code>

<code># create user 'repl'@'%' identified by 'slavepass';</code>

<code># grant replication slave on devdbops.* to 'replication'@'%';</code>

<code>show master status;</code>

<code>show processlist \g;</code>

<code>show slave hosts;</code>

<code>quit;</code>

<code>stop slave;</code>

<code>change master to master_host=</code><code>'192.168.1.101'</code><code>,master_user=</code><code>'root'</code><code>,master_password=</code><code>'root'</code><code>,master_log_file=</code><code>'mysql-bin.000002'</code><code>,master_log_pos=107;</code>

<code>start slave;</code>

<code>show slave status \g;</code>

<code># read for test</code>

tag:mysql主從配置,mysql添加從庫,mysql備份視圖函數,mysql備份腳本,linux安裝mysql

--end--