一. 如何部署mysql 中發現的問題


1. 安裝過程中發現啓動mysql時候缺少某些so包。但是apt-get安裝so包安裝不成功


1. 類似採用apt search libaio*,先確認現在的so包的名字。之前mysql 6.5的包需要的so包,現在都是64位了,名字都變了


2. 確認好名字後,類似apt-get install libaio1t64 libaio-dev進行安裝


3. find / -name libaio1t64*,查找對應的so包的安裝位置


4. 啓動其實會依然報錯。原因是,例如mysql啓動需要的是libaio.so.1。但是安裝的是64位的libaio1t64.so.2包。所以依然找不到。所以需要將libaio1t64.so.2改名為libaio.so.1


其他類似的情況這樣處理。應該就可以啓動起來mysql


二. mysql 如果通過mac的brew安裝的,此時如果不知道my.cnf的位置,可以採用mysqld --verbose --help|less ,裏面有顯示my.cnf 的查找路徑.brew 安裝的位置一般在/opt/homebrew/opt/下


三. mysql安裝成功後,發現無法遠程登錄。原因是除了bind-address = 0.0.0.0還需要通過mysql命令登錄數據庫後,設置root的權限。但是這裏注意root是要設置密碼才能遠程連接的,否則還是遠程無法連接


四. serverTimezone的作用


本質上serverTimezone就是告知當前的session下,mysql的數據庫的臨時時區是什麼。其實是告知jbdc,在讀取的時候,讀到的時間所在是時區是serverTimezone這個時區的時間,再結合當前程序所在的本地時區,就可以在getTimestamp的時候,將serverTimezone這個時區的時間轉化成本地程序所在時區的時間,返回給jdbc上層程序。也就是説,serverTimezone在寫入的時候不起作用,寫入什麼時間,mysql就記錄什麼時間,mysql甚至不知道你寫的時間是什麼時區的,他不關心。其實是在sql讀取的時候起作用,讀取的時間到底是哪個時區的,完全是serverTimezone決定的。然後getTimestamp左右就是返回當前golang程序所在的機器的本地時間,所以這裏會根據serverTimezone和本地時區的差別,getTimestamp進行時區轉換,返回轉換後的時間。

String connStr = "jdbc:mysql://10.45.21.139:3306?serverTimezone=Asia/Shanghai&useSSL=false";
public class Main {
    public static void main(String[] args) throws SQLException {
        // serverTimezone=GMT%2B4 serverTimezone=Asia/Shanghai&
        System.out.println("Hello world!");
        String connStr = "jdbc:mysql://10.45.21.139:3306?useSSL=false";
        String u = "root";
        String p = "root";
        Connection conn = DriverManager.getConnection(connStr,u,p);
        Statement stmt =conn.createStatement();
        ResultSet rs = stmt.executeQuery("select * from test.tt");
        while (rs.next()){
            java.sql.Timestamp name = rs.getTimestamp(1);
            System.out.println(name.toString());
            name = rs.getTimestamp(2);
            System.out.println(name.toString());
        }
//        stmt.execute("insert into test.tt values ('2022-10-24 15:45:00', '2022-10-24 15:45:00')");
 
    }
}

如果寫入時候serverTimezone=Asia/Shanghai,而讀取的時候用的sql的url連接為

serverTimezone=GMT%2B9.那麼用rs.getTimestamp獲取到的時間,就是2022-10-24 14:45:00。因為讀取時候認為數據庫返回的2022-10-24 15:45:00時間是GMT%2B9時區,本地是+8區,因此時間要-1.

如果請求sql的url不寫serverTimezone,則會使用數據庫的global.time_zone作為數據庫時間讀取的所在的時區。

可以通過以下一些命令查詢

show variables like "%time_zone%";
 
set global time_zone = '+0:00';
flush privileges;
 
set  time_zone = '+8:00';
flush privileges;
 
SELECT @@global.time_zone, @@SESSION.time_zone;

注意,如果通過

//            String a = rs.getString(1);

//            System.out.println(a.toString());

//             a = rs.getString(2);

//            System.out.println(a.toString());

按照string去讀取,則不會有時間轉換的問題,和寫入的時間是一樣的