# GCP Cloud SQL
### 數據庫標籤
## 建立執行個體

## MySQL / PostgreSQL
### MySQL
##### 基本設定

##### 連線

##### 機器類型和儲存空間

##### 備份、復原與高可用性

##### 旗標

##### 維護

##### 標籤

### MySQL 旗標設定
| Cloud SQL標籤 | 類型 |
|:--------------------:|:--------------:|
| character_set_server | utf8 / utf8mb4 |
| default-time-zone | +08:00 |
| slow_query_log | on |
### MySQL Docker連線
```
docker exec -it <CONTAINER_ID> mysql -u <USER> -p
```
### [MySQL 筆記](https://hackmd.io/4RmJYjQTSimhuHXokUAsWw?both/)
### MySQL 壓力測試
```
mysqlslap
-h // hostname
-i // 指定測試迭代次數
-u // 帳號
-p // 密碼
-P // Port號
# 千萬不要用,指定資料庫[Database],自定義sql語句,模擬50個併發使用者進行測試:
mysqlslap -uroot -proot -c 50 --create-schema=[DATABASE] -q "[SQL 語法]"
# 從指定的.sql檔案中載入sql語句進行測試
mysqlslap -uroot -proot -c 50 --number-of-queries=100 --create="路徑/schema.sql" -q "路徑/select_query.sql" --delimiter=";"
```
### [MySQL 儲存引擎](https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html)
* **InnoDB**:**MySQL 5.5之後的默認存儲引擎。** InnoDB是用於MySQL的事務安全(兼容ACID)的存儲引擎,具有提交,回滾和崩潰恢復功能來保護用戶數據。 InnoDB行級鎖定(無需升級為更粗粒度的鎖定)和Oracle風格的一致非鎖定讀取可提高多用戶並發性和性能。InnoDB將用戶數據存儲在聚集索引中,以減少基於主鍵的常見查詢的I / O。為了保持數據完整性, InnoDB還支持FOREIGN KEY引用完整性約束。
* **MyISAM**:這些表佔用的空間很小。 限制了讀/寫工作負載中的性能,因此它**通常用於Web和數據倉庫配置中的只讀或只讀工作負載中。**
* **Memory**:將所有數據存儲在RAM中,以便在需要快速查找非關鍵數據的環境中進行快速訪問。該發動機以前稱為HEAP發動機。它的用例正在減少;InnoDB借助其緩衝池存儲區,它提供了一種通用且持久的方式來將大多數或所有數據保留在內存中,並 NDBCLUSTER為大型分佈式數據集提供了快速的鍵值查找。
* **CSV**:其表實際上是帶有逗號分隔值的文本文件。
* **Archive**:封存使用,存檔或安全審核信息。
* **NDB**(也稱為 NDBCLUSTER):此集群數據庫引擎特別適合於需要盡可能高的正常運行時間和可用性的應用程序。
### MySQL GUI 工具
[SequelPro](https://sequelpro.com/)
---
### PostgreSQL
##### 基本設定

##### 連線
##### 機器類型和儲存空間

##### 備份、復原與高可用性

##### 旗標

##### 維護

##### 標籤

### PostgreSQL 旗標設定
### PostgreSQL Docker連線
```
docker exec -it <CONTAINER_ID> psql -U <USER>
```
### PostgreSQL 壓力測試
```
pgbench
```
### PostgreSQL 儲存引擎
只有預設
---
### SQL 大量生成假資料方式
建立 Table
```sql
CREATE TABLE `test_innodb` (
`id` INT (11) NOT NULL AUTO_INCREMENT,
`user_id` VARCHAR (20) NOT NULL,
`group_id` INT (11) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `index_user_id` (`user_id`) USING HASH
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
```
建立隨機參數
```sql
delimiter $$
CREATE FUNCTION rand_string(n int) RETURNS varchar(255)
begin
declare chars_str varchar(100)
default "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
declare return_str varchar(255) default "";
declare i int default 0;
while i < n do
set return_str=concat(return_str,substring(chars_str,floor(1+rand()*62),1));
set i= i+1;
end while;
return return_str;
end $$
delimiter ;
```
建立儲存過程
```sql
delimiter $$
CREATE PROCEDURE `insert_data`(IN n int)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE (i <= n ) DO
INSERT into test_innodb (user_id,group_id,create_time ) VALUEs (rand_string(20),FLOOR(RAND() * 100) ,now() );
set i=i+1;
END WHILE;
END $$
delimiter ;
```
插入數據
```sql
call insert_data(1000000);
```
複製數據
```sql
create table test_myisam engine=myisam as select * from test_innodb;
```
### SQL 語法先後順序
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. DISTINCT
7. UNION
8. ORDER BY
### 其他文章
* [閃開!讓專業的來:SQL 與 NoSQL](https://ithelp.ithome.com.tw/articles/10187443)
* [關於NoSQL與SQL的區別](https://read01.com/GPnEx.html#.XorldtMzZTY)
* [MYSQLSLAP 一个MYSQL数据库压力测试工具](http://smilejay.com/2013/04/mysqlslap-mysql-stress-test/)
* [2016-為什麼Uber Engineering從Postgres切換到MySQL](https://eng.uber.com/postgres-to-mysql-migration/)
---
## Cloud Proxy

在連線設定中分別為兩個項目:
* 私人IP - 如要啟用私人 IP 連線功能,您必須使用額外的 API 並具備其他權限。您可能需要與貴機構管理員聯絡,請對方為您啟用或使用這項功能。以目前來說,私人 IP 一經啟用即無法停用。
* 公共IP - 請授權網路或透過 Proxy 連線至您的執行個體。網路只能透過這些位址取得授權。
私人IP - GCP專案內部的虛擬機經由VPC網路層來連接
公共IP - 需開啟公共IP限定白名單,的經由Cloud Proxy轉址連接
### 優勢
* 在高可用狀態下進行容錯移轉時,會自動連接新的機器
* 簡化連結方式
### docker 連接
```
docker run -d \
-v <PATH_TO_KEY_FILE>:/config \
-p 127.0.0.1:3306:3306 \
gcr.io/cloudsql-docker/gce-proxy:1.12 /cloud_sql_proxy \
-instances=<INSTANCE_CONNECTION_NAME>=tcp:0.0.0.0:3306 -credential_file=/config
```
### Google Tool
[啟用Cloud SQL AdminAPI](https://console.cloud.google.com/flows/enableapi?apiid=sqladmin&redirect=https://console.cloud.google.com&_ga=2.201960337.1021283044.1585533527-81926104.1564623669)
```
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
chmod +x cloud_sql_proxy
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:<LOCAL_PORT> \
-credential_file=<PATH_TO_KEY_FILE> &
```
## 高可用配置
### 容錯移轉

* 主實例 或 地區發生故障,備用實例 會再重新連結後發送數據
* 重新建立連結大約 2-3 分鐘
## 複製與資料管理功能
> 備援機制,熱替換,有分兩種:read replicas / external replicas
{"metaMigratedAt":"2023-06-15T08:20:54.960Z","metaMigratedFrom":"YAML","title":"GCP Cloud SQL","breaks":true,"contributors":"[{\"id\":\"4f5c5dc0-df78-40b6-8b4c-d0c83c7416cb\",\"add\":73,\"del\":9},{\"id\":\"a09f8fbb-4d13-4b04-aee0-7e6821ff4cf2\",\"add\":5316,\"del\":0}]"}