㈠ sql怎麼實時數據同步
實現兩個Mysql資料庫之間同步同步原理:
MySQL 為了實現replication 必須打開bin-log 項,也是打開二進制的MySQL 日誌記錄選項。MySQL 的bin log 二
進制日誌,可以記錄所有影響到資料庫表中存儲記錄內容的sql 操作,如insert / update / delete 操作,而不記錄
select 這樣的操作。因此,我們可以通過二進制日誌把某一時間段內丟失的數據可以恢復到資料庫中(如果二進制日
志中記錄的日誌項,包涵資料庫表中所有數據,那麼, 就可以恢復本地資料庫的全部數據了)。 而這個二進制日誌,
如果用作遠程資料庫恢復,那就是replication 了。這就是使用replication 而不用sync 的原因。這也是為什麼要設
置bin-log = 這個選項的原因。
在同步過程中,最重要的同步參照物,就是同步使用那一個二進制日誌文件,從那一條記錄開始同步。下面就介紹
下怎樣實現兩個Mysql資料庫之間的主從同步。
一、 概述
MySQL從3.23.15版本以後提供資料庫復制(replication)功能,利用該功能可以實現兩個資料庫同步、主從模式、
互相備份模式的功能。本文檔主要闡述了如何在linux系統中利用mysql的replication進行雙機熱備的配置。
二、 環境
操作系統:Linux 2.6.23.1-42.fc8 # SMP(不安裝XEN)
Mysql版本:5.0.45-4.fc8
設備環境:PC(或者虛擬機)兩台
三、 配置
資料庫同步復制功能的設置都在MySQL的配置文件中體現,MySQL的配置文件(一般是my.cnf):在本環境下
為/etc/my.cnf。
3.1 設置環境:
IP的設置:
A主機 IP:10.10.0.119
Mask:255.255.0.0
B主機 IP:10.10.8.112
Mask:255.255.0.0
在IP設置完成以後,需要確定兩主機的防火牆確實已經關閉。可以使用命令service iptables status查看防火牆狀態
。如果防火牆狀態為仍在運行。使用service iptables stop來停用防火牆。如果想啟動關閉防火牆,可以使用setup命
令來禁用或定製。
最終以兩台主機可以相互ping通為佳。
3.2 配置A主(master) B從(slave)模式
3.2.1 配置A 為master
1、增加一個用戶同步使用的帳號:
GRANT FILE ON *.* TO 『backup』@'10.10.8.112' IDENTIFIED BY 『1234』;
GRANTREPLICATION SLAVE ON *.* TO 『backup』@'10.10.8.112' IDENTIFIED BY 『1234』;
賦予10.10.8.112也就是Slave機器有File許可權,只賦予Slave機器有File許可權還不行,還要給它REPLICATION SLAVE的權
限才可以。
2、增加一個資料庫作為同步資料庫:
create databbse test;
3、創建一個表結構:
create table mytest (username varchar(20),password varchar(20));
4、修改配置文件:
修改A的/etc/my.cnf文件,在my.cnf配置項中加入下面配置:
server-id = 1 #Server標識
log-bin
binlog-do-db=test #指定需要日誌的資料庫
5、重起資料庫服務:
service mysqld restart
查看server-id:
show variable like 『server_id』;
實例:
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.00 sec)
6、用show master status/G命令看日誌情況。
正常為:
mysql> show master status/G
*************************** 1. row ***************************
File: mysqld-bin.000002
positiion: 198
Binlog_Do_DB: test,test
Binlog_Ignore_DB:
1 row in set (0.08 sec)
3.2.2 配置B 為slave
1、增加一個資料庫作為同步資料庫:
create databbse test;
2、創建一個表結構:
create table mytest (username varchar(20),password varchar(20));
3、修改配置文件:
修改B的/etc/my.cnf文件,在my.cnf配置項中加入下面配置:
server-id=2
master-host=10.10. 0.119
master-user=backup #同步用戶帳號
master-password=1234
master-port=3306
master-connect-retry=60 #預設重試間隔60秒
replicate-do-db=test #告訴slave只做backup資料庫的更新
5、重起資料庫服務:
service mysqld restart
查看server-id:
show variables like 『server_id』;
實例:
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.00 sec)
6、用show slave status/G命令看日誌情況。
正常為:
mysql> show slave status/G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.0.119
Master_User: backup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 98
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 236
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test,test
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 236
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.01 sec)
3.2.3 驗證配置
分別使用insert, delete , update在A主機進行增刪改查資料庫;查看B主機的資料庫是否與A主機一致;若一致,則配
置成功。
3.3雙機互備模式
如果在A主機加入slave設置,在B主機加入master設置,則可以做B->A的同步。
1、在A主機的配置文件中 mysqld配置項加入以下設置:
master-host=10.10.8.112
master-user=backup
master-password=1234
replicate-do-db=test
master-connect-retry=10
2、在B的配置文件中 mysqld配置項加入以下設置:
log-bin
binlog-do-db=test
注意:當有錯誤產生時,*.err日誌文件同步的線程退出,當糾正錯誤後,要讓同步機制進行工作,運行slave
start。
重起A、B機器,則可以實現雙向的熱備份。
總之,成功完成以上配置後,在主伺服器A的test庫里添加數據或刪除數據,在從伺服器B的test庫里馬上也能
看到相應的變更。兩台伺服器的同步操作可以說是瞬間完成的。
㈡ 如何實現多個SQL資料庫同樣結構的表同步更新!
在每個資料庫的table1\table2都建立插入、刪除、修改觸發器
如在A1上
ceate trigger dbo.table1_u on A1.dbo.table1 for insert,update,delete as
IF @@rowcount = 0 RETURN
declare @no_i int -- 假設no為關鍵字
--declare 其他欄位
declare @no_d int -- 假設no為關鍵字
--declare 其他欄位
--賦值
select @no_i =no ,--其他值
from inserted
select @no_d =no ,--其他值
from deleted
--判斷@no_d,@no_i 是否在A2,A3,A4,A5的表中存在
--1、如果@no_d,@no_i 都存在,則用新值更新A2,A3,A4,A5的talbe1
--2、如果@no_d不存在@no_i存在,則將新值插入A2,A3,A4,A5的talbe1
--3、如果@no_d存在@no_i不存在,則刪除A2,A3,A4,A5的talbe1對應的值
if exists(select 1 from A2.dbo.talbe1 where no = @no_d) and
exists(select 1 from A2.dbo.talbe1 where no = @no_i)
begin
--修改A2資料庫的表
end
...............................
㈢ 如何同步sql server里的數據
有時由於項目開發的需要,必須將SQLServer2005中的某些表同步到Oracle資料庫中,由其他其他系統來讀取這些數據。不同資料庫類型之間的數據同步我們可以使用鏈接伺服器和SQLAgent來實現。假設我們這邊(SQLServer2005)有一個合同管理系統,其中有表contract 和contract_project是需要同步到一個MIS系統中的(Oracle9i)那麼,我們可以按照以下幾步實現資料庫的同步。
1.在Oracle中建立對應的contract 和 contract_project表,需要同步哪些欄位我們就建那些欄位到Oracle表中。
這里需要注意的是Oracle的數據類型和SQLServer的數據類型是不一樣的,那麼他們之間是什麼樣的關系拉?我們可以在SQLServer下運行:
SELECT *
FROM msdb.dbo.MSdatatype_mappings
SELECT *
FROM msdb.dbo.sysdatatypemappings
來查看SQLServer和其他資料庫系統的數據類型對應關系。第一個SQL語句是看SQL轉Oracle的類型對應,而第二個表則更詳細得顯示了各個資料庫系統的類型對應。根據第一個表和我們的SQLServer中的欄位類型我們就可以建立好Oracle表了。
SQLServer和Oracle的對應
2.建立鏈接伺服器。我們將Oracle系統作為SQLServer的鏈接伺服器加入到SQLServer中。
㈣ SQL資料庫 觸發器實現多表同步插入
create TRIGGER [dbo].[tr_tb_erp_make_Pack_insert]
ON [dbo].[tb_erp_make_Pack]
FOR INSERT
AS
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON
declare @out_Flag int=0
declare @out_Rtn varchar(40)=''
declare @smsg nvarchar(400)
DECLARE @v_barCode VARCHAR(20)
DECLARE @v_cInvCode NVARCHAR(20)
DECLARE @v_packID INT
DECLARE @v_packDate DATETIME
DECLARE @v_userID INT
begin tran
DECLARE Cur CURSOR FOR
SELECT barCode,cInvCode,packID,packDate,userID FROM insertedOPEN Cur
FETCH NEXT FROM Cur INTO @v_barCode,@v_cInvCode,@v_packID,@v_packDate,@v_userIDWHILE @@FETCH_STATUS=0
BEGIN
SET @out_Flag = 0
SET @out_Rtn='添加成功!'
IF EXISTS(SELECT 1 FROM tb_erp_make_barCode WHERE barCode=@v_barCode)BEGIN
UPDATE dbo.tb_erp_make_barCode SET cInvCode=@v_cInvCode,packID=@v_packID,packDate=@v_packDate,vFlag=0 WHERE barCode=@v_barCodeIF @@error <> 0
BEGIN
SET @out_Flag=1
SET @out_Rtn='觸發器修改(UPDATE)錯誤!'
SET @smsg='錯誤:'+@out_Rtn
ROLLBACK TRAN
RAISERROR (@smsg,11,1)
RETURN
END
END
ELSE
BEGIN
INSERT INTO dbo.tb_erp_make_barCode
(
barCode ,packID ,packDate ,cInvCode
)
VALUES (
@v_barCode ,@v_packID ,GETDATE() ,@v_cInvCode)
IF @@error <> 0
BEGIN
SET @out_Flag=2
SET @out_Rtn='觸發器新增(INSERT)錯誤!'
SET @smsg='錯誤:'+@out_Rtn
ROLLBACK TRAN
RAISERROR (@smsg,11,1)
RETURN
END
END
FETCH NEXT FROM Cur INTO @v_barCode,@v_cInvCode,@v_packID,@v_packDate,@v_userIDEND
CLOSE Cur
DEALLOCATE Cur
COMMIT TRAN
RETURN
㈤ mssql如何將一個資料庫中的表同步到另一個資料庫中 做成事務
1 在另一個資料庫中建立同樣結構的副表,導入相同的數據
2 在本地資料庫建立另一個資料庫的相應鏈接
3 在本地資料庫主表建立插入修改刪除觸發器,主表有什麼變化直接寫入到副表中
4當然這種方法也不是特別好,會影響本地資料庫主表的性能。
㈥ SQL間的兩個資料庫表的同步更新
我問問,你B2表中的內容還需要1月的內容么?僅僅是從2月開始?
Ans:你在往A中插入資料庫的時候自己要判斷一下當前月份,如果是同一個月就把數據分別插入到A和B中。到了下個月之後,繼續插入A的原表,但是B中新建一表來插入數據。
還有個疑問就是,你希望用代碼實現還是其他?
㈦ 有2個資料庫,怎麼實現數據同步
在pgsql的資料庫中將要同步的表建立一個一模一樣的同步表。然後建觸發器,將進入源表中的數據觸發到同步表中。然後做一個windows服務掃描這個同步表並且將同步表中的數據同步到mysql
或access中。
如果是整個資料庫中有許多表要進行同步。則建立一個共用的同步表,結構非常簡單。欄位如下:
主鍵(f_id),源表名(f_tablename),主鍵欄位名(f_keyname),主鍵值(f_keyvalue),操作標識(f_operflag
i:插入
u:更新
d:刪除),時間欄位(f_time).將要同步的表都建立觸發器,只要有增、改、刪都觸發到這個表裡。這樣你只掃描這個共用的同步表,根據這些欄位值完全可以實現數據的同步。隔離網閘就是這么個原理,只不過它的要比這復雜多了!
㈧ sql2000 在同一個資料庫一張表的修改,同步到另一張表。
可以建觸發器來實現:
更新
Create
Trigger
truTable1
On
表1
for
Update
-------------------------------------------------------
--Memo
:
臨時寫寫的,給你作個Sample。沒有調試阿。
-------------------------------------------------------
As
Update
表2
Set
表2.Name=i.username
,表2.CardID=i.usercardno
From
表2
,
Deleted
d
,Inserted
i
表2.CardID=d.usercardno
and
d.userstate
=
'0'
刪除
Create
trigger
trdTable1
On
表1
for
Delete
-------------------------------------------------------
--Memo
:
臨時寫寫的,給你作個Sample。沒有調試阿。
-------------------------------------------------------
As
Delete
表2
From
表2,
Deleted
d
Where
表2.CardID=d.usercardno
and
d.userstate
=
'0'
【有疑問可以HI我,或追問,但請不要關閉問題,謝謝!】
㈨ 2台MSSQL伺服器某資料庫怎麼同步
MSSQL_SERVER資料庫同步軟體(資料庫結構及數據)實現增量傳輸:使用方法: 1.配置源伺服器和目的伺服器. 2.配置表標志欄位(因為根據表中的(最後更新時間 例如:update_date)欄位,作增量傳輸) 3.同步開始時間(就是根據最後更新時間欄位 例如:update_date 大於等於這個時間的數據進行傳輸) 4.調度配置(配置自動多久執行一次) 5.最後保存設置. 6.可手動執行傳輸數據,也可自動根據調度執行. 7.同步表結構,此功能是只同步結構,不同步數據.(會同步表的結構,包含所有索引,默認值,主鍵.和屬性.同步存儲過程.函數.視圖.觸發器)
㈩ 在SQL中 如何實現不同資料庫的兩張表的同步
你可以分三個來寫,分別用來監視insert\delete\update三個(這樣寫容易完成),我下面寫一個,你其它有可以參照下面這個來寫
--插入行的情況
CREATE TRIGGER [填入觸發器名] ON [dbo].[表名]
FOR INSERT
AS
insert [另外一個資料庫名].[dbo].[表名] select * from inserted
你也可以參照料我下面這段,寫在一起,但比較麻煩,我就不具體按你要求的寫了羅.
CREATE trigger [資料庫A.tr_user] on [user]
/* 觸發器 在資料庫A的user表建立一個名字tr_user的觸發器 */
for update,insert,delete
/*監視 修改 插入 刪除*/
as
if not exists (select * from deleted)
/* 如果deleted表為空,那麼 */
insert 資料庫B..[user](username,userpass,landtime) select username,password,lastlogin from inserted
/* 將inserted表(就是對於觸發器來說剛剛被插入的集合)插入到B.user */
else if not exists (select * from inserted)--刪除
/* 否則 如果 inserted集合為空 */
delete 資料庫B..[user] where id in (select userid from deleted)
/* 那麼刪除B.user下id是deleted集合中出現的id 這里用了in */
else--更新
update [user]
set
[user].username=i.username,
[user].userpass=i.password
from 資料庫B..[user] as [user],
inserted as i
where [user].id=i.userid
/* update就很明顯了,凡是updated的都來更新,保持一樣就可以了 */
alter table 資料庫B..[user] ENABLE TRIGGER [資料庫B.tr_user]