數據庫遷移Postgres 到 Mysql

mysql安裝
migration 兼容處理
pg數據導入
sql 兼容處理
mysql | pg 同步
rails mysql 支持

mysql 設置編碼爲utf8mb4(
1.utf8 是 Mysql 中的一種字符集,只支持最長三個字節的 UTF-8字符;
2.要在 Mysql 中保存 4 字節長度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以後
3. 對於 CHAR 類型數據,utf8mb4 會多消耗一些空間,根據 Mysql 官方建議,使用 VARCHAR 替代 CHAR
)

設置utf8mb4:

cat /usr/local/etc/my.cnf 

character-set-server=utf8mb4 

mysql.server stop 

mysql.server start 

mysql -uroot -p123456 

show variables like 'character_set_database';

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

已有的庫和表更改爲utf8mb4

#更改數據庫編碼:
ALTER DATABASE 數據庫名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

#更改表編碼:
ALTER TABLE 表名CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 
如有必要,還可以更改列的編碼

MySql錯誤:ERROR 1449 (HY000)

ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist

SET GLOBAL innodb_fast_shutdown = 1;

quit

調用mysql_upgrade升級mysql後,需要重啓mysql才能讓系統表更新生效

mysql_upgrade -u root -p;

重新登錄之後,服務恢復正常。

rails mysql string -> varchar(255);

rails pg string -> varchar
rails pg money -> rails mysql integer

Rails 5 中會用一張ar_internal_metadata表在執行Migration的過程中把要保護的數據庫環境信息存儲到其中,然後在執行高危動作時自動對環境做偵測預判。

db_2ccm_production=# select * from ar_internal_metadata;
     key     |   value    |         created_at         |         updated_at
-------------+------------+----------------------------+----------------------------
 environment | production | 2017-07-13 17:37:26.683599 | 2017-07-13 17:37:26.683599

rails 內置表 ar_internal_metadata 不能同步

50000+的數據使用transaction方式 同步會出現錯誤

[array] partner_order_item: invoice_numbers | refund_invoice_numbers users: exchange_code_array | platforms

mysql 不支持 with_advisory_lock Model.with_advisory_lock('transaction_name', transaction: DB.postgresql?) 事務塊 裏面的 Transaction-level locks

mysql 不支持 reset_pk_sequence 重置序列
pg ActiveRecord::Base.connection.reset_pk_sequence!(table_name) mysql ActiveRecord::Base.connection.execute("ALTER TABLE #{table_name} AUTO_INCREMENT = #{new_max_id};")

mysql 不支持 array 類型的字段
pg add_column table_names, column, :string, array: true, default: [] mysql add_column table_names, column, :text

mysql ALTER TABLE table AUTO_INCREMENT = max_id

TRUNCATE table table_name could drop all table data

mysql 不支持 like serialize columns

OpenSSL::Cipher::AES ruby 2.5.0 出現問題 aes加密 iv截取16位

mysql 不支持 ROW_NUMBER
PG

SELECT
  id
FROM (
  SELECT
      id,
      ROW_NUMBER()
      OVER (PARTITION BY
             start_sale_time
         ORDER BY
             start_sale_time DESC) AS rank
     FROM
         auction_products
     WHERE
         status = #{AuctionProduct.statuses[:presale]}) aps
 WHERE
     aps.rank <= 8
      

MYSQL

      
SELECT
id
FROM(
SELECT
  id,start_sale_time,
  if(@current_timestamp > UNIX_TIMESTAMP(start_sale_time),@rank:=@rank+1,@rank) as the_rank,
  @current_timestamp := UNIX_TIMESTAMP(start_sale_time) as the_time
FROM
  auction_products
WHERE
  status = #{AuctionProduct.statuses[:presale]}
ORDER BY start_sale_time desc
) aps
WHERE
aps.the_rank <= 8
      

mysql 時區設置
show variables like “%time_zone%”;
set global time_zone = ‘+8:00’; ##修改mysql全局時區爲北京時間,即我們所在的東8區
set time_zone = ‘+8:00’; ##修改當前會話時區
flush privileges; #立即生效

mysql extract different with pg

pg extract(‘year’ from time_column) = ?", time.strftime(’%Y’)
mysql extract(year from time_column) = ?", time.strftime(’%Y’)

mysql unsupport pg_search use like or aliyun

用戶首頁: year too big to marshal: 1899 UTC

users.platforms sql更換
update users set users.platforms = case platforms when “” then “—” else concat("—\n- “, REPLACE(REPLACE(REPLACE(REPLACE(users.platforms, “[”,”"), “]”,""), “,”,"\n- "), “’”, “”)) end

索引長度限制 set innodb_large_prefix on

update taggings set taggings.context=“tags”;

sudo apt-get install libmysqlclient-dev

數據格式限制

➜  2ccm-work-api git:(release) rails db:migrate
== 20190410033249 AddRefundIdentification: migrating ==========================
-- add_column(:trade_orders, :refund_identification, :string)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Invalid default value for 'created_at': ALTER TABLE `trade_orders` ADD `refund_identification` varchar(255)

解決: mysql> SET GLOBAL sql_mode = '';

PostgresToMysql功能介紹
1、可以將PostgreSQL數據轉換成mysql數據;

2、支持批量轉換;

3、支持命令行操作;

4、支持重複操作;

5、支持在指定的時間自動操作;

6、可以使用SQL命令查詢操作。

MySQL優化
http://www.cnblogs.com/roverliang/p/6481765.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章