c本地sql
很多人用到MySQL來開發一些項目,有時為了性能,我們會直接用C語言來開發相關的模塊,尤其在我們的web應用中,雖然php、JSP等腳本均提供了MySQL的介面,但是顯然直接使用C語言具有更好的安全性和性能,Michael以前用PHP開發的多個項目中就使用了C語言編寫的這類介面,然後再編譯到php裡面,供php腳本直接使用,這方面的話題就不多說了,下面主要說一下在Linux下如何用C語言連接MySQL資料庫,並且讀取裡面的數據返回,同時如何進行編譯。
這里的大部分代碼參考了MySQL發行包裡面的.c源文件,大家也可以去裡面找找相關的代碼,下面這段代碼實現了連接到本地MySQL伺服器上9tmd_bbs_utf8資料庫,從數據表tbb_user中根據輸入的userid取得該用戶的用戶名並列印輸出到終端。
#if defined(_WIN32) || defined(_WIN64) //為了支持windows平台上的編譯
#i nclude
#endif
#i nclude
#i nclude
#i nclude "mysql.h" //我的機器上該文件在/usr/local/include/mysql下
//定義資料庫操作的宏,也可以不定義留著後面直接寫進代碼
#define SELECT_QUERY "select username from tbb_user where userid = %d"
int main(int argc, char **argv) //char **argv 相當於 char *argv[]
{
MYSQL mysql,*sock; //定義資料庫連接的句柄,它被用於幾乎所有的MySQL函數
MYSQL_RES *res; //查詢結果集,結構類型
MYSQL_FIELD *fd ; //包含欄位信息的結構
MYSQL_ROW row ; //存放一行查詢結果的字元串數組
char qbuf[160]; //存放查詢sql語句字元串
if (argc != 2) { //檢查輸入參數
fprintf(stderr,"usage : mysql_select \n\n");
exit(1);
}
mysql_init(&mysql);
if (!(sock = mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) {
fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql));
perror("");
exit(1);
}
sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));
if(mysql_query(sock,qbuf)) {
fprintf(stderr,"Query failed (%s)\n",mysql_error(sock));
exit(1);
}
if (!(res=mysql_store_result(sock))) {
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(sock));
exit(1);
}
printf("number of fields returned: %d\n",mysql_num_fields(res));
while (row = mysql_fetch_row(res)) {
printf("Ther userid #%d 's username is: %s\n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0])) ;
puts( "query ok !\n" ) ;
}
mysql_free_result(res);
mysql_close(sock);
exit(0);
return 0; //. 為了兼容大部分的編譯器加入此行
}
編譯的時候,使用下面的命令
gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm) 後面兩個選項可選,根據您的環境情況
運行的時候,執行下面的命令
./mysql_select 1
將返回如下結果:
number of fields returned: 1
Ther userid #1 's username is: Michael
query ok !
B. C語言中使用嵌入式sql
嵌入式SQL程序的VC+SQL server 2000實現的環境配置
嵌入SQL的C應用程序具體到VC++6.0, SQL Server2000 下調試可分為五步:1、環境初始化;2、預編譯;3、編譯;4、連接;5、運行。下面就其中重要的的操作方法給以詳細說明。
1、環境初始化
(1) SQL Server2000為其嵌入式SQL提供了一此特殊的介面;默認的安裝方式沒有安裝這此介面;因此,需要把devtools.rar解壓到SQLServer的系統日錄下(即文件夾devtools中的所有文件);如果操作系統安裝在C盤,則SQL Server的系統目錄是C:\Program Files\Microsoft SQL Server。(或 在安裝Microsoft SQL Server 2000時選擇安裝Development Tools,為使用嵌入式SQL語言准備必要的頭文件和庫文件。)
( 2)初始化Visual C++ 6.0編譯器環境。在命令行方式下運行文件\Microsoft Visual Studio\VC98\Bin\vcvars32.bat。
(3)初始化SQL Server的預編譯環境。在命令行方式下運行文件:\Devtools\samples\esqlc\setenv.bat。
( 4) VC++6.0環境配置。具體配置分為如下三步[:
①Tools->options->directories->Include Files:添加 C:\Program Files\Microsoft SQL Server\devtools\include。將SQL server自帶的用於資料庫開發的頭文件包含到工程環境中。
②Tools->options->directories->Lib Files:添加C:\Program Files\Microsoft SQL Server\devtools\x861ib。將開發用到的包包含到工程中。
③project->Settings->Link->Object/Library Moles,添加庫文件:SQLakw32.lib, Caw32.lib。這兩個文件之間用空格分開。
2、預編譯
C語言編譯程序不能識別應用程序中的SQL語句,需要經過預處理程序將其轉換成C語句。SQL Server的預處理程序是nsqlprep.exe。 nsqlprep.exe在SQL Server安裝日錄的MSSQL\Binn下。若SQL Server資料庫採用的是默任安裝方式,則需要把binn.rar的內容拷貝到指定目錄下。
Microsoft SQL Server 2000提供的預編譯程序nsqlprep.exe,用於對嵌入式SQL程序進行預編譯處理,生成C語言源程序.實際上就是將嵌入式SQL程序中的嵌入式SQL語句替換為對運行時庫文件Sqlakw32. dll的函數調用,接著運行時庫文件調用動態連接庫Ntwdblib. dll通過網路來存取Microsoft SQL Server 2000資料庫伺服器.
預編譯程序nsqlprep的常用語法為:
nsqlprep ESQL_File /SQLACCESS /DB server_name.database_name /PASS login.password
其中ESQL_File是要預編譯的嵌入式SQL程序;/SQLACCESS通知nsqlprep自動地為嵌入式SQL程序中的靜態SQL語句創建相應的存儲過程;/DB server_name.database_name指明要連接的伺服器以及資料庫名稱;/PASS login.password給出登錄名及相應的口令.
下面的程序demo.sqc實現了從資料庫伺服器hushaobo的資料庫pubs中的authors表中讀取au_lname為white的人對應的 au_fname 值,並保存到變數first_name 中顯示出來。(連接資料庫的用戶為sa,對應密碼為1982)
#include<stdio.h>
void main()
{
EXEC SQL BEGIN DECLARE SECTION;
char first_name[40];
char last_name[]="White";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO hushaobo.pubs
USER sa.1982;
EXEC SQL SELECT au_fname INTO :first_name from authors WHERE au_lname = :last_name;
EXEC SQL DISCONNECT ALL;
printf("first name: %s \n",first_name);
}
在命令行下運行:nsqlprep demo.sqc /SQLACCESS /DB hushaobo.pubs /PASS sa.1982
則生成demo.c,將該文件添加到VC工程中編譯即可。
3、編譯,連接與運行
在VC++6.0中創建一個 "WIN32 Console Application"的Proiect,然後將預編譯生成的c文件加入Proiect,編譯連接即可生成訪問SQL Server的可執行程序。 Visual C++ 6.0進行編譯連接時需要用到動態鏈接庫SQLakw32.d11與SQLaiw32.d11;盡管這兩個文件已經隨同binn.rar被拷貝到SQLServer安裝目錄的MSSQL\Binn文件夾下,但仍然需要把它們的路徑加到系統路徑變數中,以使得程序運行時能找到它們,具體添加方法如下:
方法1:把這兩個文件拷貝到操作系統目錄下的system32子目錄中。
方法2:我的電腦->屬性->高級->環境變數->path->編輯,在變數值中加入路徑值;新路徑與已有路徑間用;間隔。
注意調適程序時,文件名中不要包含cursor,否則可能會出錯。
C. 怎樣用C讀sql資料庫中的數據
C語言資料庫編程,網上查查有例子
D. 本地sql資料庫怎麼與遠程sql資料庫同步
MySQL
MySQL數據同步主要有三種方式:
1.利用MySQL自身的資料庫同步功能
2.利用MySQL資料庫的特性(資料庫存在固頂目錄,並且以文件形式存儲),進行資料庫目錄同步以達到數據同步目的
3.利用專用的MySQL資料庫同步軟體
1.利用MySQL自身的資料庫同步功能(下面參考自網上的文章,寫的非常詳細了)
MySQL從3.23.15版本以後提供資料庫復制功能。利用該功能可以實現兩個資料庫同步,主從模式,互相備份模式的功能.
資料庫同步復制功能的設置都在mysql的設置文件中體現。mysql的配置文件(一般是my.cnf),在unix環境下在/etc/mysql/my.cnf或者在mysql用戶的home目錄下的my.cnf。
windows環境中,如果c:根目錄下有my.cnf文件則取該配置文件。當運行mysql的winmysqladmin.exe工具時候,該工具會把c:根目錄下的my.cnf命名為mycnf.bak。並在winnt目錄下創建my.ini。mysql伺服器啟動時候會讀該配置文件。所以可以把my.cnf中的內容拷貝到my.ini文件中,用my.ini文件作為mysql伺服器的配置文件。
設置方法:
設置範例環境:
操作系統:window2000professional
mysql:4.0.4-beta-max-nt-log
Aip:10.10.10.22
Bip:10.10.10.53
A:設置
1.增加一個用戶最為同步的用戶帳號:
GRANTFILEON*.*TObackup@'10.10.10.53'IDENTIFIEDBY『1234』
2.增加一個資料庫作為同步資料庫:
createdatabasebackup
B:設置
1.增加一個用戶最為同步的用戶帳號:
GRANTFILEON*.*TObackup@'10.10.10.22'IDENTIFIEDBY『1234』
2.增加一個資料庫作為同步資料庫:
createdatabasebackup
主從模式:A->B
A為master
修改Amysql的my.ini文件。在mysqld配置項中加入下面配置:
server-id=1
log-bin
#設置需要記錄log可以設置log-bin=c:mysqlbakmysqllog設置日誌文件的目錄,
#其中mysqllog是日誌文件的名稱,mysql將建立不同擴展名,文件名為mysqllog的幾個日誌文件。
binlog-do-db=backup#指定需要日誌的資料庫
重起資料庫服務。
用showmasterstatus命令看日誌情況。
B為slave
修改Bmysql的my.ini文件。在mysqld配置項中加入下面配置:
server-id=2
master-host=10.10.10.22
master-user=backup#同步用戶帳號
master-password=1234
master-port=3306
master-connect-retry=60預設重試間隔60秒
replicate-do-db=backup告訴slave只做backup資料庫的更新
重起資料庫
用showslavestatus看同步配置情況。
注意:由於設置了slave的配置信息,mysql在資料庫目錄下生成master.info
所以如有要修改相關slave的配置要先刪除該文件。否則修改的配置不能生效。
雙機互備模式。
如果在A加入slave設置,在B加入master設置,則可以做B->A的同步。
在A的配置文件中mysqld配置項加入以下設置:
master-host=10.10.10.53
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中mysqld配置項加入以下設置:
log-bin=c:mysqllogmysqllog
binlog-do-db=backup
注意:當有錯誤產生時*.err日誌文件。同步的線程退出,當糾正錯誤後要讓同步機制進行工作,運行slavestart
重起AB機器,則可以實現雙向的熱備。
測試:
向B批量插入大數據量表AA(1872000)條
A資料庫每秒鍾可以更新2500條數據。
2.資料庫目錄同步,方法和文件同步一樣,設置好需要同步的兩個資料庫目錄就可以了!
缺點很明顯,數據同步只能單向進行,可以作為備份方案
3.用專用的MySQL同步軟體進行同步
這方面的軟體有SQLBalance和MyReplicator,優點是方便直觀,還有很多爭強功能!
缺點和2一樣,只能單項同步!
當然你也可以修改鏡像網站的程序為提交數據到母資料庫,讀取則在當前鏡像下的數據,不過,修改起來麻煩!普通用戶修改也非常難!呵呵,大家了解一下就可以!給大家一個思路!有能力的朋友可以試試阿!
4.關於MySQL論壇的數據同步
由於數據來源的不可控制(不好表達),論壇數據是實時的,而且還要考慮來自鏡像論壇的數據,如何實現鏡像論壇與母論壇數據同步呢?
用1中介紹的MySQL自帶的資料庫同步功能互相備份模式就可以實現的!
不過,具體的應用我沒有測試!穩定性不敢保證!
有能力的朋友推薦用下面這種思路來同步,相對來說減少點效率,但能減少發生的錯誤!
比如鏡像論壇數據同步:
1.母論壇和鏡像論壇的數據全寫在母論壇資料庫里,主從模式,讀取只在本地讀取,這個需要修改程序!
2.每次寫數據,都同時提交到兩個資料庫中,安全,但是效率很差,也得修改程序!
MSSQL
MSSQL數據同步利用資料庫復制技術實現數據同步更新(來自網路,也是非常完美的教程)
復制的概念
復制是將一組數據從一個數據源拷貝到多個數據源的技術,是將一份數據發布到多個存儲站點上的有效方式。使用復制技術,用戶可以將一份數據發布到多台伺服器上,從而使不同的伺服器用戶都可以在許可權的許可的范圍內共享這份數據。復制技術可以確保分布在不同地點的數據自動同步更新,從而保證數據的一致性。
SQL復制的基本元素包括
出版伺服器、訂閱伺服器、分發伺服器、出版物、文章
SQL復制的工作原理
SQLSERVER主要採用出版物、訂閱的方式來處理復制。源數據所在的伺服器是出版伺服器,負責發表數據。出版伺服器把要發表的數據的所有改變情況的拷貝復制到分發伺服器,分發伺服器包含有一個分發資料庫,可接收數據的所有改變,並保存這些改變,再把這些改變分發給訂閱伺服器
SQLSERVER復制技術類型
SQLSERVER提供了三種復制技術,分別是:
1、快照復制(呆會我們就使用這個)
2、事務復制
3、合並復制
只要把上面這些概念弄清楚了那麼對復制也就有了一定的理解。接下來我們就一步一步來實現復制的步驟。
第一先來配置出版伺服器
(1)選中指定[伺服器]節點
(2)從[工具]下拉菜單的[復制]子菜單中選擇[發布、訂閱伺服器和分發]命令
(3)系統彈出一個對話框點[下一步]然後看著提示一直操作到完成。
(4)當完成了出版伺服器的設置以後系統會為該伺服器的樹形結構中添加一個復制監視器。同時也生成一個分發資料庫(distribution)
第二創建出版物
(1)選中指定的伺服器
(2)從[工具]菜單的[復制]子菜單中選擇[創建和管理發布]命令。此時系統會彈出一個對話框
(3)選擇要創建出版物的資料庫,然後單擊[創建發布]
(4)在[創建發布向導]的提示對話框中單擊[下一步]系統就會彈出一個對話框。對話框上的內容是復制的三個類型。我們現在選第一個也就是默認的快照發布(其他兩個大家可以去看看幫助)
(5)單擊[下一步]系統要求指定可以訂閱該發布的資料庫伺服器類型,SQLSERVER允許在不同的資料庫如ORACLE或ACCESS之間進行數據復制。但是在這里我們選擇運行"SQLSERVER2000"的資料庫伺服器
(6)單擊[下一步]系統就彈出一個定義文章的對話框也就是選擇要出版的表
(7)然後[下一步]直到操作完成。當完成出版物的創建後創建出版物的資料庫也就變成了一個共享資料庫。
第三設計訂閱
(1)選中指定的訂閱伺服器
(2)從[工具]下拉菜單中選擇[復制]子菜單的[請求訂閱]
(3)按照單擊[下一步]操作直到系統會提示檢查SQLSERVER代理服務的運行狀態,執行復制操作的前提條件是SQLSERVER代理服務必須已經啟動。
(4)單擊[完成]。完成訂閱操作。
完成上面的步驟其實復制也就是成功了。但是如何來知道復制是否成功了呢?這里可以通過這種方法來快速看是否成功。展開出版伺服器下面的復制——發布內容——右鍵發布內容——屬性——擊活——狀態然後點立即運行代理程序接著點代理程序屬性擊活調度把調度設置為每一天發生,每一分鍾,在0:00:00和23:59:59之間。接下來就是判斷復制是否成功了打開C:/ProgramFiles/MicrosoftSQLServer/MSSQL/REPLDATA/unc/XIAOWANGZI_database_database下面看是不是有一些以時間做為文件名的文件夾差不多一分中就產生一個。要是你還不信的話就打開你的資料庫看在訂閱的伺服器的指定訂閱資料庫下看是不是看到了你剛才所發布的表—
一個手工同步的方案
--定時同步伺服器上的數據
--例子:
--測試環境,SQLServer2000,遠程伺服器名:xz,用戶名為:sa,無密碼,測試資料庫:test
--伺服器上的表(查詢分析器連接到伺服器上創建)
createtable[user](idintprimarykey,numbervarchar(4),namevarchar(10))
go
--以下在區域網(本機操作)
--本機的表,state說明:null表示新增記錄,1表示修改過的記錄,0表示無變化的記錄
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[user]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[user]
GO
createtable[user](idintidentity(1,1),numbervarchar(4),namevarchar(10),statebit)
go
--創建觸發器,維護state欄位的值
createtriggert_stateon[user]
afterupdate
as
update[user]setstate=1
from[user]ajoininsertedbona.id=b.id
wherea.stateisnotnull
go
--為了方便同步處理,創建鏈接伺服器到要同步的伺服器
--這里的遠程伺服器名為:xz,用戶名為:sa,無密碼
ifexists(select1frommaster..sysserverswheresrvname='srv_lnk')
execsp_dropserver'srv_lnk','droplogins'
go
execsp_addlinkedserver'srv_lnk','','SQLOLEDB','xz'
execsp_addlinkedsrvlogin'srv_lnk','false',null,'sa'
go
--創建同步處理的存儲過程
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_synchro]')andOBJECTPROPERTY(id,N'IsProcere')=1)
dropprocere[dbo].[p_synchro]
GO
createprocp_synchro
as
--setXACT_ABORTon
--啟動遠程伺服器的MSDTC服務
--execmaster..xp_cmdshell'isql/S"xz"/U"sa"/P""/q"execmaster..xp_cmdshell''netstartmsdtc'',no_output"',no_output
--啟動本機的MSDTC服務
--execmaster..xp_cmdshell'netstartmsdtc',no_output
--進行分布事務處理,如果表用標識列做主鍵,用下面的方法
--BEGINDISTRIBUTEDTRANSACTION
--同步刪除的數據
deletefromsrv_lnk.test.dbo.[user]
whereidnotin(selectidfrom[user])
--同步新增的數據
insertintosrv_lnk.test.dbo.[user]
selectid,number,namefrom[user]wherestateisnull
--同步修改的數據
updatesrv_lnk.test.dbo.[user]set
number=b.number,name=b.name
fromsrv_lnk.test.dbo.[user]a
join[user]bona.id=b.id
whereb.state=1
--同步後更新本機的標志
update[user]setstate=0whereisnull(state,1)=1
--COMMITTRAN
go
--創建作業,定時執行數據同步的存儲過程
ifexists(SELECT1frommsdb..sysjobswherename='數據處理')
EXECUTEmsdb.dbo.sp_delete_job@job_name='數據處理'
execmsdb..sp_add_job@job_name='數據處理'
--創建作業步驟
declare@sqlvarchar(800),@dbnamevarchar(250)
select@sql='execp_synchro'--數據處理的命令
,@dbname=db_name()--執行數據處理的資料庫名
execmsdb..sp_add_jobstep@job_name='數據處理',
@step_name='數據同步',
@subsystem='TSQL',
@database_name=@dbname,
@command=@sql,
@retry_attempts=5,--重試次數
@retry_interval=5--重試間隔
--創建調度
EXECmsdb..sp_add_jobschele@job_name='數據處理',
@name='時間安排',
@freq_type=4,--每天
@freq_interval=1,--每天執行一次
@active_start_time=00000--0點執行
go
E. 怎樣把本地sql server資料庫導入到伺服器
【第一導入數據結構】
打開本地計算機上的 SQL Server Management Studio 客戶端軟體:
本地電腦:登陸本機資料庫連接控制端:
選擇您要導出到伺服器的資料庫然後滑鼠右鍵:選擇生成SQL腳本:
選中本地電腦需要導出腳本的庫名字:
需要選擇選擇兼容sql2005的版本的腳本:
修改sql腳本的保存路徑:記錄下這個路徑
查看生產腳本生成的選項:
成功生成sql腳本:並記錄下腳本導出的路徑
連接到伺服器提供的目標資料庫伺服器:
並點擊新建查詢,拷貝您導出的 SQL 腳本代碼(此代碼為第一步導出的sql腳本代碼)到上圖顯示的查詢分析器中,點擊分析腳本,如果沒有語法錯誤,就點擊執行腳本,直到執行完畢。【導入數據結構完畢】
【第二:導入資料庫數據】
下面咱們開始導入資料庫表中的數據:登陸您本地的資料庫:
點擊您本地計算機上的資料庫右鍵-任務-導出數據:
選擇目標資料庫,如下添加虛擬主機提供給您的資料庫信息(伺服器地址,用戶名,密碼,資料庫):
點擊下一步,點擊下一步,選中所有表,並確保「目標」
點擊下一步,直到執行完畢:這樣你的本地資料庫就導入到虛擬主機上了
【導入資料庫數據完畢】
注意事項
伺服器資料庫必須允許遠程連接
確保你的電腦可以上網
資料庫埠防火牆設置了例外
華普在線小祝為你解答,希望可以幫助到你。
F. 學了c語言,學了sql資料庫操作語言,能在c語言中插入sql嗎需要介面嗎
資料庫操作一般會提供專門的介面來調用。
找到提供c本版的介面。函數中調用介面。sql語句是字元串的形式輸入的在c語言中。
G. 如何在C語言裡面執行SQL語句
C語言程序與資料庫打交道的方式分為直連(同步)和非直連(非同步)兩種,它們的特點如下所示:
1. 直連方式
在該方式中,C語言程序直接與資料庫進行消息的交互。
該方式的優點是消息交互是即時的,C語言程序向資料庫發送消息之後,很快就能夠得到結果;缺點是如果資料庫執行緩慢,那麼C語言程序需要掛在那裡等待結果,影響了程序執行效率。
2. 非直連方式
在該方式中,C語言程序通過一個獨立的第三方模塊間接與資料庫進行消息的交互。
該方式的優點是當C語言程序向第三方模塊發送消息之後,可以不用等待資料庫返回結果而去執行其它流程;缺點是如果消息序列號沒有定義好,那麼極有可能會導致第三方模塊返回的結果出現混亂。因此,在該方式中,定義好發送消息的順序(即設定好序列號)很重要。
由於需要與資料庫打交道,因此要在C語言程序所使用的配置文件中填寫好關聯資料庫的相關信息,如資料庫機器的IP地址、埠號、用戶名、密碼、模塊號和所操作的具體資料庫名等。在運行程序之前,一定要確保相關配置項信息的正確性。
H. c語言怎麼與SQL相連
先安裝SQL Server,在SQL Server中創建資料庫,然後編寫C代碼訪問SQL Server,即可實現相連。
I. 本地sql資料庫怎麼與遠程sql資料庫同步
MySQL
MySQL數據同步主要有三種方式:
1.利用MySQL自身的資料庫同步功能
2.利用MySQL資料庫的特性(資料庫存在固頂目錄,並且以文件形式存儲),進行資料庫目錄同步以達到數據同步目的
3.利用專用的MySQL資料庫同步軟體
1.利用MySQL自身的資料庫同步功能(下面參考自網上的文章,寫的非常詳細了)
MySQL從3.23.15版本以後提供資料庫復制功能。利用該功能可以實現兩個資料庫同步,主從模式,互相備份模式的功能.
資料庫同步復制功能的設置都在mysql的設置文件中體現。mysql的配置文件(一般是my.cnf),在unix環境下在/etc/mysql/my.cnf或者在mysql用戶的home目錄下的my.cnf。
windows環境中,如果c:根目錄下有my.cnf文件則取該配置文件。當運行mysql的winmysqladmin.exe工具時候,該工具會把c:根目錄下的my.cnf命名為mycnf.bak。並在winnt目錄下創建my.ini。mysql伺服器啟動時候會讀該配置文件。所以可以把my.cnf中的內容拷貝到my.ini文件中,用my.ini文件作為mysql伺服器的配置文件。
設置方法:
設置範例環境:
操作系統:window2000professional
mysql:4.0.4-beta-max-nt-log
Aip:10.10.10.22
Bip:10.10.10.53
A:設置
1.增加一個用戶最為同步的用戶帳號:
GRANTFILEON*.*TObackup@'10.10.10.53'IDENTIFIEDBY『1234』
2.增加一個資料庫作為同步資料庫:
createdatabasebackup
B:設置
1.增加一個用戶最為同步的用戶帳號:
GRANTFILEON*.*TObackup@'10.10.10.22'IDENTIFIEDBY『1234』
2.增加一個資料庫作為同步資料庫:
createdatabasebackup
主從模式:A->B
A為master
修改Amysql的my.ini文件。在mysqld配置項中加入下面配置:
server-id=1
log-bin
#設置需要記錄log可以設置log-bin=c:mysqlbakmysqllog設置日誌文件的目錄,
#其中mysqllog是日誌文件的名稱,mysql將建立不同擴展名,文件名為mysqllog的幾個日誌文件。
binlog-do-db=backup#指定需要日誌的資料庫
重起資料庫服務。
用showmasterstatus命令看日誌情況。
B為slave
修改Bmysql的my.ini文件。在mysqld配置項中加入下面配置:
server-id=2
master-host=10.10.10.22
master-user=backup#同步用戶帳號
master-password=1234
master-port=3306
master-connect-retry=60預設重試間隔60秒
replicate-do-db=backup告訴slave只做backup資料庫的更新
重起資料庫
用showslavestatus看同步配置情況。
注意:由於設置了slave的配置信息,mysql在資料庫目錄下生成master.info
所以如有要修改相關slave的配置要先刪除該文件。否則修改的配置不能生效。
雙機互備模式。
如果在A加入slave設置,在B加入master設置,則可以做B->A的同步。
在A的配置文件中mysqld配置項加入以下設置:
master-host=10.10.10.53
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中mysqld配置項加入以下設置:
log-bin=c:mysqllogmysqllog
binlog-do-db=backup
注意:當有錯誤產生時*.err日誌文件。同步的線程退出,當糾正錯誤後要讓同步
J. 本地sql資料庫怎麼與遠程sql資料庫同步
MySQL數據同步主要有三種方式:
1.利用MySQL自身的資料庫同步功能
2.利用MySQL資料庫的特性(資料庫存在固頂目錄,並且以文件形式存儲),進行資料庫目錄同步以達到數據同步目的
3.利用專用的MySQL資料庫同步軟體
1.利用MySQL自身的資料庫同步功能:
MySQL從3.23.15版本以後提供資料庫復制功能。利用該功能可以實現兩個資料庫同步,主從模式,互相備份模式的功能.
資料庫同步復制功能的設置都在mysql的設置文件中體現。mysql的配置文件(一般是my.cnf),在unix環境下在/etc/mysql/my.cnf或者在mysql用戶的home目錄下的my.cnf。
windows環境中,如果c:根目錄下有my.cnf文件則取該配置文件。當運行mysql的winmysqladmin.exe工具時候,該工具會把c:根目錄下的my.cnf命名為mycnf.bak。並在winnt目錄下創建my.ini。mysql伺服器啟動時候會讀該配置文件。所以可以把my.cnf中的內容拷貝到my.ini文件中,用my.ini文件作為mysql伺服器的配置文件。
設置方法:
設置範例環境:
操作系統:window2000professional
mysql:4.0.4-beta-max-nt-log
Aip:10.10.10.22
Bip:10.10.10.53
A:設置
1.增加一個用戶最為同步的用戶帳號:
GRANTFILEON*.*TObackup@'10.10.10.53'IDENTIFIEDBY『1234』
2.增加一個資料庫作為同步資料庫:
createdatabasebackup
B:設置
1.增加一個用戶最為同步的用戶帳號:
GRANTFILEON*.*TObackup@'10.10.10.22'IDENTIFIEDBY『1234』
2.增加一個資料庫作為同步資料庫:
createdatabasebackup
主從模式:A->B
A為master
修改Amysql的my.ini文件。在mysqld配置項中加入下面配置:
server-id=1
log-bin
#設置需要記錄log可以設置log-bin=c:mysqlbakmysqllog設置日誌文件的目錄,
#其中mysqllog是日誌文件的名稱,mysql將建立不同擴展名,文件名為mysqllog的幾個日誌文件。
binlog-do-db=backup#指定需要日誌的資料庫
重起資料庫服務。
用showmasterstatus命令看日誌情況。
B為slave
修改Bmysql的my.ini文件。在mysqld配置項中加入下面配置:
server-id=2
master-host=10.10.10.22
master-user=backup#同步用戶帳號
master-password=1234
master-port=3306
master-connect-retry=60預設重試間隔60秒
replicate-do-db=backup告訴slave只做backup資料庫的更新
重起資料庫
用showslavestatus看同步配置情況。
注意:由於設置了slave的配置信息,mysql在資料庫目錄下生成master.info
所以如有要修改相關slave的配置要先刪除該文件。否則修改的配置不能生效。
雙機互備模式。
如果在A加入slave設置,在B加入master設置,則可以做B->A的同步。
在A的配置文件中mysqld配置項加入以下設置:
master-host=10.10.10.53
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中mysqld配置項加入以下設置:
log-bin=c:mysqllogmysqllog
binlog-do-db=backup
注意:當有錯誤產生時*.err日誌文件。同步的線程退出,當糾正錯誤後要讓同步機制進行工作,運行slavestart
重起AB機器,則可以實現雙向的熱備。
測試:
向B批量插入大數據量表AA(1872000)條
A資料庫每秒鍾可以更新2500條數據。
2.資料庫目錄同步:
方法和文件同步一樣,設置好需要同步的兩個資料庫目錄就可以了!
缺點很明顯,數據同步只能單向進行,可以作為備份方案
3.用專用的MySQL同步軟體進行同步 :
這方面的軟體有SQLBalance和MyReplicator,優點是方便直觀,還有很多爭強功能!
缺點和2一樣,只能單項同步!
當然也可以修改鏡像網站的程序為提交數據到母資料庫,讀取則在當前鏡像下的數據,不過,修改起來麻煩!普通用戶修改也非常難!呵呵,大家了解一下就可以!給大家一個思路!有能力的朋友可以試試阿!
4.關於MySQL論壇的數據同步
由於數據來源的不可控制(不好表達),論壇數據是實時的,而且還要考慮來自鏡像論壇的數據,如何實現鏡像論壇與母論壇數據同步呢?
用1中介紹的MySQL自帶的資料庫同步功能互相備份模式就可以實現的!
不過,具體的應用我沒有測試!穩定性不敢保證!
有能力的朋友推薦用下面這種思路來同步,相對來說減少點效率,但能減少發生的錯誤!
比如鏡像論壇數據同步:
1.母論壇和鏡像論壇的數據全寫在母論壇資料庫里,主從模式,讀取只在本地讀取,這個需要修改程序!
2.每次寫數據,都同時提交到兩個資料庫中,安全,但是效率很差,也得修改程序!
MSSQL
MSSQL數據同步利用資料庫復制技術實現數據同步更新(來自網路,也是非常完美的教程)
復制的概念 :
復制是將一組數據從一個數據源拷貝到多個數據源的技術,是將一份數據發布到多個存儲站點上的有效方式。使用復制技術,用戶可以將一份數據發布到多台伺服器上,從而使不同的伺服器用戶都可以在許可權的許可的范圍內共享這份數據。復制技術可以確保分布在不同地點的數據自動同步更新,從而保證數據的一致性。
SQL復制的基本元素包括
出版伺服器、訂閱伺服器、分發伺服器、出版物、文章
SQL復制的工作原理
SQLSERVER主要採用出版物、訂閱的方式來處理復制。源數據所在的伺服器是出版伺服器,負責發表數據。出版伺服器把要發表的數據的所有改變情況的拷貝復制到分發伺服器,分發伺服器包含有一個分發資料庫,可接收數據的所有改變,並保存這些改變,再把這些改變分發給訂閱伺服器
SQLSERVER復制技術類型
SQLSERVER提供了三種復制技術,分別是:
1、快照復制(呆會我們就使用這個)
2、事務復制
3、合並復制
只要把上面這些概念弄清楚了那麼對復制也就有了一定的理解。接下來我們就一步一步來實現復制的步驟。
第一先來配置出版伺服器
(1)選中指定[伺服器]節點
(2)從[工具]下拉菜單的[復制]子菜單中選擇[發布、訂閱伺服器和分發]命令
(3)系統彈出一個對話框點[下一步]然後看著提示一直操作到完成。
(4)當完成了出版伺服器的設置以後系統會為該伺服器的樹形結構中添加一個復制監視器。同時也生成一個分發資料庫(distribution)
第二創建出版物
(1)選中指定的伺服器
(2)從[工具]菜單的[復制]子菜單中選擇[創建和管理發布]命令。此時系統會彈出一個對話框
(3)選擇要創建出版物的資料庫,然後單擊[創建發布]
(4)在[創建發布向導]的提示對話框中單擊[下一步]系統就會彈出一個對話框。對話框上的內容是復制的三個類型。我們現在選第一個也就是默認的快照發布(其他兩個大家可以去看看幫助)
(5)單擊[下一步]系統要求指定可以訂閱該發布的資料庫伺服器類型,SQLSERVER允許在不同的資料庫如ORACLE或ACCESS之間進行數據復制。但是在這里我們選擇運行"SQLSERVER2000"的資料庫伺服器
(6)單擊[下一步]系統就彈出一個定義文章的對話框也就是選擇要出版的表
(7)然後[下一步]直到操作完成。當完成出版物的創建後創建出版物的資料庫也就變成了一個共享資料庫。
第三設計訂閱
(1)選中指定的訂閱伺服器
(2)從[工具]下拉菜單中選擇[復制]子菜單的[請求訂閱]
(3)按照單擊[下一步]操作直到系統會提示檢查SQLSERVER代理服務的運行狀態,執行復制操作的前提條件是SQLSERVER代理服務必須已經啟動。
(4)單擊[完成]。完成訂閱操作。
完成上面的步驟其實復制也就是成功了。但是如何來知道復制是否成功了呢?這里可以通過這種方法來快速看是否成功。展開出版伺服器下面的復制——發布內容——右鍵發布內容——屬性——擊活——狀態然後點立即運行代理程序接著點代理程序屬性擊活調度把調度設置為每一天發生,每一分鍾,在0:00:00和23:59:59之間。接下來就是判斷復制是否成功了打開C:/ProgramFiles/MicrosoftSQLServer/MSSQL/REPLDATA/unc/XIAOWANGZI_database_database下面看是不是有一些以時間做為文件名的文件夾差不多一分中就產生一個。要是你還不信的話就打開你的資料庫看在訂閱的伺服器的指定訂閱資料庫下看是不是看到了你剛才所發布的表—
一個手工同步的方案
--定時同步伺服器上的數據
--例子:
--測試環境,SQLServer2000,遠程伺服器名:xz,用戶名為:sa,無密碼,測試資料庫:test
--伺服器上的表(查詢分析器連接到伺服器上創建)
createtable[user](idintprimarykey,numbervarchar(4),namevarchar(10))
--以下在區域網(本機操作)
--本機的表,state說明:null表示新增記錄,1表示修改過的記錄,0表示無變化的記錄
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[user]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[user]
GO
createtable[user]
(idintidentity(1,1),numbervarchar(4),namevarchar(10),statebit)
go
--創建觸發器,維護state欄位的值
createtriggert_stateon[user]
afterupdate
as
update[user]setstate=1
from[user]ajoininsertedbona.id=b.id
wherea.stateisnotnull
go
--為了方便同步處理,創建鏈接伺服器到要同步的伺服器
--這里的遠程伺服器名為:xz,用戶名為:sa,無密碼
ifexists(select1frommaster..sysserverswheresrvname='srv_lnk')
execsp_dropserver'srv_lnk','droplogins'
go
execsp_addlinkedserver'srv_lnk','','SQLOLEDB','xz'
execsp_addlinkedsrvlogin'srv_lnk','false',null,'sa'
go
--創建同步處理的存儲過程
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].
[p_synchro]')andOBJECTPROPERTY(id,N'IsProcere')=1)
dropprocere[dbo].[p_synchro]
GO
createprocp_synchro
as
--setXACT_ABORTon
--啟動遠程伺服器的MSDTC服務
execmaster..xp_cmdshell'isql/S"xz"/U"sa"/P""/q"execmaster..xp_cmdshell''netstartmsdtc'',no_output"',no_output
--啟動本機的MSDTC服務
--execmaster..xp_cmdshell'netstartmsdtc',no_output
--進行分布事務處理,如果表用標識列做主鍵,用下面的方法
--BEGINDISTRIBUTEDTRANSACTION
--同步刪除的數據
deletefromsrv_lnk.test.dbo.[user]
whereidnotin(selectidfrom[user])
--同步新增的數據
insertintosrv_lnk.test.dbo.[user]
selectid,number,namefrom[user]wherestateisnull
--同步修改的數據
updatesrv_lnk.test.dbo.[user]set
number=b.number,name=b.name
fromsrv_lnk.test.dbo.[user]a
join[user]bona.id=b.id
whereb.state=1
--同步後更新本機的標志
update[user]setstate=0whereisnull(state,1)=1
--COMMITTRAN
go
--創建作業,定時執行數據同步的存儲過程
ifexists(SELECT1frommsdb..sysjobswherename='數據處理')
EXECUTEmsdb.dbo.sp_delete_job@job_name='數據處理'
execmsdb..sp_add_job@job_name='數據處理'
--創建作業步驟
declare@sqlvarchar(800),@dbnamevarchar(250)
select@sql='execp_synchro'--數據處理的命令
@dbname=db_name()--執行數據處理的資料庫名
execmsdb..sp_add_jobstep@job_name='數據處理',
@step_name='數據同步',
@subsystem='TSQL',
@database_name=@dbname,
@command=@sql,
@retry_attempts=5,--重試次數
@retry_interval=5--重試間隔
--創建調度
EXECmsdb..sp_add_jobschele@job_name='數據處理',
@name='時間安排',
@freq_type=4,--每天
@freq_interval=1,--每天執行一次
@active_start_time=00000--0點執行