① java中怎樣有效提升mysql的還原速度
1、 加了single-transaction參數 備份時 需要先flush table with read lock 這個過程中會有一個鎖表的過程,如果有事務或語句正在執行,沒有結束,那麼備份進程會一直等待,並且阻塞別的事務,那麼也會影響業務。所以要先確認備份的時候沒有大的事務在運行。具體 single-transaction的加鎖可以參考 我的博客:mysqlmp備份時加single-transaction會不會加鎖2 、mysqlmp是單進程的,沒有辦法並行,但現在機器的瓶頸多是出現在IO方面,可以使用更了的IO設備加快速度3 、mysqlmp時如果空間夠的話,不要邊壓縮邊備份二 加速恢復
1 關閉binlog:不寫入Binlog會大大的加快數據導入的速度2 innodb_flush_log_at_trx_commit=0
3 更好的配置
建議:
如果非要使用邏輯備份,可以考慮mysqlmper, mysqlpump(5.7)這兩個工具去備份,這兩個在備份的時候支持並行操作,mysqlmper還可以對單表進行恢復,在只需要恢復單表的情況下,恢復速度會大大加快使用物理備份 xtrabackup (open source),MEB(oracle提供,收費): 他們的備份原理是基於mysql crash recover, 備份速度 是和邏輯備份的相差不太大。但是恢復速度卻有很大的提升。
邏輯備份 備出來的是sql語句文件,恢復時需要一條一條的執行sql,所以恢復很慢。
而物理備份和還原的速度 相當於直接文件,所以恢復的時候性能有很大的提升並且這兩個軟體還支持並行,效果更好。
邏輯備份最大的優點是 備份好的文件經壓縮後佔用空間較小,最大缺點恢復太慢物理備份可以很快的恢復,但是備份好的文件壓縮後佔用空間比邏輯備份要大
② java調debzium ,調MySqlConnector的方法
如果你用的是jdbc4 即jdk6以上,只要把jar包加入到java運行可以取到的地方即可。
比如在classpath中寫入你的Jar包位置
在war包 WEB-INFO/lib路徑下
等
③ java怎麼使用redis進行mysql數據的緩存
方法有很多
其中之一
實時獲取mysql
binlog進行解析
然後修改redis
MySQL到Redis數據方案
無論MySQL還是Redis
自身都帶有數據同步的機制,像比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實現的,這樣的數據其實還是一個非同步過程,只不過當伺服器都在同一內網時,非同步的延遲幾乎可以忽略
那麼理論上我們也可以用同樣方式,分析MySQL的binlog文件並將數據插入Redis。但是這需要對binlog文件以及MySQL有非常深入的理解,同時由於binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實現同步的工作量是非常大的。
因此這里選擇了一種開發成本更加低廉的方式,借用已經比較成熟的MySQL
UDF,將MySQL數據首先放入Gearman中,然後通過一個自己編寫的PHP
Gearman
Worker,將數據同步到Redis
④ java mysql切庫 return false 為什麼
兩個參數,一個是binlog_ignore_db.另一個是replicate-ignore-db 區別:
binlog_ignore_db 參數是設置在主庫上的,例如:binlog-ignore_db=test,那麼針對test庫下的所有操作(增刪改)都會記錄下來,這樣slave在接受主庫的binlog文件時文件量就會減少。
⑤ redis怎麼用java設定一定緩存時間作為該數據的存活時間
大方向兩種方案:
1.腳本同步:
自己寫腳本將資料庫數據寫入到redis/memcached。
這就涉及到實時數據變更的問題(mysql
row
binlog的實時分析),binlog增量訂閱Alibaba
的canal
,以及緩存層數據
丟失/失效
後的數據同步恢復問題。
⑥ java培訓要學習哪些內容
目前Java培訓內容包括:
1、HTML+CSS3+資料庫
2、Java SE(Java面向對象思想;設計模式、面向對象原則、Java高階API、線程、網路編程、反射、NIO)
3、Java web(Java web基礎、JS、DOM操作、JSP/Servlet、第三方工具包、Tomcat...)
4、框架(網路原理、HTTP協議、Linux操作系統、雲服務搭建、SSM框架應用、Oracle應用、Spring JPA、Hibernate...)
5、高可用、高並發、高擴展(SpringBoot、緩存、分布式、插件、全文索引、服務中間件、消息中間件、雲伺服器、雲存儲、雲資料庫、域名服務...)
6、微服務、大數據
以下是我們2020年更新的課程,您可以了解一下!
如想學習,可以在我們線上學習平台:百戰程序員進行了解!
⑦ java向資料庫插入數據時的錯誤: Duplicate entry '' for key 'PRIMARY' 是什麼問題,怎麼解決,先謝啦!
是代碼輸入錯誤造成的,解決方法如下:
1、需要重新配置資料庫,首找到資料庫安裝目錄下的MySQLInstanceConfig.exe,雙擊打開。
⑧ 怎麼用java實現mysql的復制資料庫里所有的表跟數據
樓主要考慮的不僅僅是標題的需求。
1、復制資料庫里所有的表和數據的目的是什麼。
a、假設樓主是要做資料庫備份的話,且通過程序來做的話,可以使用程序來執行dos命令
如java:Runtime.getRuntime().exec("e:\\MySQL\\bin\\mysqlmp -h localhost -uroot -p123 db_name")
b、假設樓主是要做庫與庫之間的同步的話,可以使用第三方客戶端進行,比如navicat,sqlyong等
c、假設樓主是要做庫與庫之間的同步且用程序進行的話,可以使用mysql中提供操作資料庫的api來做相對應的讀取工作和對比工作,然後寫入工作
⑨ java 監聽 binlog日誌文件 怎麼監聽
使用jpcap,java的截包工具。可以截取主機上某個埠的數據包。在主機上安裝郵件伺服器,然後監聽截取25埠數據並解析,提取有用數據。
⑩ 為什麼使用kafka處理mysql binlog
在開發 Spark Streaming 的公共組件過程中,需要將 binlog 的數據(Array[Byte])轉換為 Json 格式,供用戶使用,本文提供一種轉換的思路。另外我們會用到幾個輔助類,為了行文流暢,我們將輔助類的定義放在文章的最後面。如果如果本文有講述不詳細,或者錯誤指出,肯請指出,謝謝對於 binlog 數據,每一次操作(INSERT/UPDATE/DELETE 等)都會作為一條記錄寫入 binlog 文件,但是同一條記錄可能包含資料庫中的幾行數據(這里比較繞,可以看一個具體的例子)在資料庫中,有 id, name 兩個欄位,其中 id 為主鍵,name 隨意, age 隨意。有兩行數據如下idnameage
1john30
2john40
那麼你進行操作
update table set age = 50 where name = john的時候,就會將兩行的數據都進行更改,這兩行更改的數據會在同一個 binlog 記錄中,這一點會在後面的實現中有體現。
下面,我們給出具體的代碼,然後對代碼進行分析def desirializeByte(b: (String, Array[Byte])) : (String, String) = {val binlogEntry = BinlogEntryUtil.serializeToBean(b._2) //將 Array[Byte] 數據轉換成 com.meituan.data.binlog.BinlogEntry 類,相關類定義參考附錄val pkeys = binlogEntry.getPrimaryKeys.asScala //獲取主鍵,這里的 asScala 將 Java 的 List 轉換為 Scala 的 Listval rowDatas : List[BinlogRow] = binlogEntry.getRowDatas.asScala.toList //獲取具體的信息val strRowDatas = rowDatas.map(a => { //將獲取到的具體信息進行轉換,這里主要是將沒一條信息的內容,轉換 [(K1:V1,K2:V2...Kn:Vn)] 的形式,方面後面進行 Json 化val b = a.getBeforeColumns.asScala //獲取 beforColumnsval c = a.getAfterColumns.asScala //獲取 afterColumnsval mb = b.map(d => (d._1, d._2.getValue)) //去掉所有不需要的信息,只保留每個欄位的值val mc = c.map(c => (c._1, c._2.getValue)) //去掉所有不需要的信息,只保留每個欄位的值(mb, mc) //返回轉換後的 beforeColumns 和 afterColumns})
//下面利用 json4s 進行 Json 化
(binlogEntry.getEventType, compact("rowdata" -> strRowDatas.map{w => List("row_data" -> ("before" -> w._1.toMap) ~ ("after" -> w._2.toMap)) //這里的兩個 toMap 是必要的,不然里層會變成 List,這個地方比較疑惑的是,//w._1 按理是 Map類型,為什麼還需要強制轉換成 Map//而且用 strRowDatas.foreach(x => println(s"${x._1} ${x._2}")列印的結果表名是 Map}))
desirializeByte 函數傳入 topic 中的一條記錄,返回參數自己確定,我這里為了測試,返回一個 (String, String) 的 Tuple,第一個欄位表示該條記錄的 EventType(Insert/Update/Delete 等),第二個欄位為 Json 化後的數據。
BinlogEntryUtil.serilizeToBean 是一個輔助類,將 binlog 數據轉化為一個 Java bean 類。
第 4 行,我們得到表對應的主鍵,第 5 行獲得具體的數據第 6 行到第 12 行是 Json 化之前的輔助工作,將所有不需要的東西給剔除掉,只留下欄位,以及欄位對應的值。
第 14, 15 行就是具體的 Json 工作了(使用了 json4s 包進行 Json 化)這個過程中有一點需要注意的是,在 Json 化的時候,記得為 w._1 和 w._2 加 toMap 操作,不然會變成 List(很奇怪,我將 w._1 和 w._2 列印出來看,都是 Map 類型)或者你可以在第 7,8 行的末尾加上 .toMap 操作。這個我查了 API,進行了實驗,暫時懷疑是在和 json4s 組合的時候,出現了問題,有待驗證。
利用上述代碼,我們可以得到下面這樣 Json 化之後的字元串(我進行了排版,程序返回的 Json 串是不換行的){"rowdata":
[{"row_data":
{"before":{"param_name":"creator","param_value":"chenqiang05","horigindb_etl_id":"2532","utime":"2016-07-26 15:07:16","id":"15122","status":"0","ctime":"2016-07-25 17:06:01"},"after":{"param_name":"creator","param_value":"chendayao","horigindb_etl_id":"2532","utime":"2016-08-01 10:32:01","id":"15122","status":"0","ctime":"2016-07-25 17:06:01"}
}
}]
}"
到這里,基本就完成了一種將 binlog 數據 Json 化的代碼。
附錄代碼,由於這些代碼是從其他工程裡面摳出來的,可能讀起來會不順暢,還請見諒。
public static BinlogEntryserializeToBean(byte[] input) {BinlogEntrybinlogEntry = null;
Entryentry = deserializeFromProtoBuf(input);//從 protobuf 反序列化if(entry != null) {
binlogEntry = serializeToBean(entry);
}
return binlogEntry;
}
public static EntrydeserializeFromProtoBuf(byte[] input) {Entryentry = null;
try {
entry = Entry.parseFrom(input);
//com.alibaba.otter.canal.protocol.CanalEntry#Entry 類的方法,由 protobuf 生成} catch () {logger.error("Exception:" + var3);
}
return entry;
}
//將 Entry 解析為一個 bean 類
public static BinlogEntryserializeToBean(Entryentry) {RowChangerowChange = null;
try {
rowChange = RowChange.parseFrom(entry.getStoreValue());} catch (Exceptionvar8) {
throw new RuntimeException("parse event has an error , data:" + entry.toString(), var8);}
BinlogEntrybinlogEntry = new BinlogEntry();String[] logFileNames = entry.getHeader().getLogfileName().split("\\.");String logFileNo = "000000";
if(logFileNames.length > 1) {
logFileNo = logFileNames[1];
}
binlogEntry.setBinlogFileName(logFileNo);binlogEntry.setBinlogOffset(entry.getHeader().getLogfileOffset());binlogEntry.setExecuteTime(entry.getHeader().getExecuteTime());binlogEntry.setTableName(entry.getHeader().getTableName());binlogEntry.setEventType(entry.getHeader().getEventType().toString());IteratorprimaryKeysList = rowChange.getRowDatasList().iterator();while(primaryKeysList.hasNext()) {
RowDatarowData = (RowData)primaryKeysList.next();BinlogRowrow = new BinlogRow(binlogEntry.getEventType());row.setBeforeColumns(getColumnInfo(rowData.getBeforeColumnsList()));row.setAfterColumns(getColumnInfo(rowData.getAfterColumnsList()));binlogEntry.addRowData(row);
}
if(binlogEntry.getRowDatas().size() >= 1) {BinlogRowprimaryKeysList1 = (BinlogRow)binlogEntry.getRowDatas().get(0);binlogEntry.setPrimaryKeys(getPrimaryKeys(primaryKeysList1));} else {
ArrayListprimaryKeysList2 = new ArrayList();binlogEntry.setPrimaryKeys(primaryKeysList2);}
return binlogEntry;
}
public class BinlogEntry implements Serializable {private String binlogFileName;
private long binlogOffset;
private long executeTime;
private String tableName;
private String eventType;
private List<String> primaryKeys;
private List<BinlogRow> rowDatas = new ArrayList();}
public class BinlogRow implements Serializable {public static final String EVENT_TYPE_INSERT = "INSERT";public static final String EVENT_TYPE_UPDATE = "UPDATE";public static final String EVENT_TYPE_DELETE = "DELETE";private String eventType;
private Map<String, BinlogColumn> beforeColumns;private Map<String, BinlogColumn> afterColumns;}
public class BinlogColumn implements Serializable {private int index;
private String mysqlType;
private String name;
private boolean isKey;
private boolean updated;
private boolean isNull;
private String value;
}