顯示具有 mysql 標籤的文章。 顯示所有文章
顯示具有 mysql 標籤的文章。 顯示所有文章

星期六, 7月 30, 2022

mysqldump/pgdump 連線密碼的存放

寫資料庫備份腳本時,會避免把密碼放在腳本裡,免得密碼流出去。

這時候密碼要藏在那邊呢?

postgresql

postgresql 的 pg_dump 預設會去讀取 $HOME/.pgpass 檔案,所以可以把帳號跟密碼放在這邊,腳本裡使用 pg_dump 進行備份時就不需要額外用參數指定。

.pgpass 檔案的內容是

hostname:port:database:username:password
  • hostname: 資料庫主機
  • port: 資料庫主機的 port
  • database: 資料庫
  • username: 連線的使用者帳號
  • password: 連線的使用者密碼

使用的時候,就不需要指定密碼了

pg_dump -h <db_host> -U <db_user> -F c -f $dump_file <db_name>

mysql

一般備份 mysql 資料庫會使用 mysqldump,mysqldump 有個參數 --defaults-file=<config_file>

所以可以用這個參數來指定,先在 $HOME/.config 資料夾下新增 backup.my.cnf 檔案,內容如下

[mysqldump]
user=<db_user>
password=<db_pass>
  • <db_user>: 放連線的使用者帳號
  • <db_pass>: 放連線的使用者密碼

至於主機的部份,可以用 mysqldump 參數指定,例如

mysqldump --defaults-file=$HOME/.config/backup.my.cnf -h <db_host> <db_name>

參考資料

星期三, 5月 29, 2019

MySQL 到底有沒有 case sensitive ?

公司的程式有人回報說,在搜尋電子郵件時,沒有區分大小寫 (case insensitive),我心裡想,雖然電子郵件並沒有嚴格區分大小寫,但我應該沒有特別做這件事,照理說,是要有區分大小寫才是,於是我開始看程式碼去找是不是 Django 等框架/函式庫自動加上了。
不過我找了好一陣子都沒找到,看來應該不是程式的問題。既然不是程式問題,那就可能是資料庫問題了,我在開發環境的 SQLite 裡用 SELECT SQL 查詢,有區分大小寫;生產環境是用 MySQL,我改在 MySQL shell 用 SELECT SQL 來查詢。結果,真的是資料庫設定問題,上網搜尋,才確定真的是 MySQL 問題:
簡單的說,是 collation 問題,所以解決方法也算是簡單,一個方法是改變 collation,看是要資料庫整個改,還是個別 table/column 去改;一個方法則是改 column data type。
MySQL 手冊對 collation 的說明是這樣的 (連結),只要後綴是 _cs 的或是 _bin 的,都是 case-sensitive 的。改 collation ,可以先使用 SHOW COLLATION WHERE COLLATION LIKE “%_cs” 來找,但 utf8 是沒有後綴名為 _cs 的 collation,只能使用 utf8_bin 。找到合適的 collation 後,要改指定 column data type ,可以使用 ALTER TABLE documents__document CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
以 Django 來說,當然最好是一開始在建立資料庫時,就指定好 charset 跟 collation,之後的作法就是自己寫 Migration 執行自訂的 SQL 來變更指定欄位的 data type 了。

星期二, 4月 18, 2017

Django queryset 對日期時間欄位的額外設定

Django queryset 對日期時間的處理已經很完備了,可以透過使用 __year 或 __month 等方式來找到是某年或某月的紀錄。
這兩天碰到的狀況是,資料是 MySQL 時,日期時間的比對 (__year / __month) 失效了。仔細看過文件以後,才發現 MySQL 需要事先設定,使用 mysql_tzinfo_to_sql 載入時區表格才行。
This function performs time zone conversions directly in the database. As a consequence, your database must be able to interpret the value of tzinfo.tzname(None). This translates into the following requirements:
在終端機 (shell) 裡,輸入下列指令:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
接著重新啟動 MySQL 伺服器即可。
mysql_tzinfo_to_sql 的用法不只一種,我選擇的是最簡單的用法。

星期三, 9月 30, 2015

Heroku 小記

安裝:wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh
在現有的 web application project 目錄裡輸入 heroku create ,這會自動去遠端 (就 heroku) 開一個 app project,然後把 git repository 放到 git remote 裡。
git remote -v 裡會多出一個 heroku ,當你把 master branch push 到 heroku 時 (git push heroku master),就會自動佈署到 heroku 上。
這裡要注意的是 heroku 只認定 master,只有推 master 上去時,才會真正的進行佈署,如果是其他 branch 名稱,heroku 不鳥你。
多台機器開發,我是指一下在 A 機器開發,一下又在 B 機器開發的情況。那這時候怎麼處理 project ?
第1種情況是,直接從 heroku 取得專案:heroku git:clone -a your_heroku_app_name the_directory
第 2種情況是,你已經先從你的 git repository 取得專案,那麼這時候就先切換到專案目錄下,再用 heroku git:remote -a your_heroku_app_name 這個指令來自動在 git remote 裡增加一個 heroku 的 remote repository。

安裝資料庫的 Addon
MySQL
Heroku 本身不提供 MySQL,只有合作廠商所提供的 ClearDB,但實質上 ClearDB 就是 MySQL。
ClearDB 有提供4個方案,Ignite 是免費的,雖然免費,但是安裝前,還是要先填信用卡資訊。
安裝方法:heroku addons:create cleardb:ignite
安裝以後,連線字串會放在 CLEARDB_DATABASE_URL 這個環境變數裡,程式只要存取這個環境變數就可以取得連線字串,用 heroku config:get CLEARDB_DATABASE_URL 則可以看到連接字串。
參考這篇文,就可以用本地端的 MySQL Query Browser (MySQL GUI 工具) 連上遠端的 ClearDB。
簡單說,就是從連線字串拆解出 username/password/host ,然後套進去用就可以了。
PostgreSQL
Heroku 預設提供的 database,不過還是要安裝。
安裝方法:heroku addons:add heroku-postgresql:dev
連線字串一樣是在環境變數裡:HEROKU_POSTGRESQL_BRONZE_URL 。

星期六, 7月 04, 2015

Ansible mysql 相關模組所需的套件

使用 mysql_usermysql_db 這兩個模組時,Target 方必須要安裝幾個套件才能運作,否則會有錯誤
msg: the python mysqldb module is required
在 Ubuntu 裡要裝的是 python-mysqldb 、mysql-server  。python-mysqldb 是必要的,因為 python 的程式會需要用到這個模組;而 mysql-server 則要視你的 mysql server 所在機器而定,如果是在其他機器上,就可以不需要安裝。

星期二, 2月 11, 2014

innobackupex

在噗浪上看到有人分享 innobackupex 這工具,就決定來試用看看。這指令其實是被包含在 xtrabackup 工具裡,使用 Perl 寫的,所以只要安裝 xtrabackup 就可以。

CentOS 5 上的安裝可以透過 yum,步驟可以參考 Percona 上的說明,首先用 rpm -Uhv http://ift.tt/1iiiaVw 安裝 Percona 的 repo 檔案,接著用 yum install percona-xtrabackup 就可以了。

我使用的是 MariaDB 5.5,試著要備份時,卻出現沒有指定 datadir 參數的問題。innobackupex 裡實際上使用的是 xtrabackup_55 (不同的資料庫需要用不同的指令,innobackupex 是自動判斷),大致追蹤指令原始碼,發現它是讀取 my.cnf 來得知 datadir 的值; MariaDB 的 my.cnf 很簡潔,直接 include /etc/my.cnf.d 下的所有 cnf 檔案,再查看裡面各個 cnf,都非常的簡潔,看起來是都採用預設值,所以不需要額外設置。因此我在 /etc/my.cnf.d/server.cnf 的 [mysqld] 之後加上 datadir=/var/lib/mysql 以後,innobackupex 就可以順利運作了。
  • 備份:innobackupex –user=DB_USER –password=DB_PASSWORD /path/to/BACKUP-DIR
  • 回存:innobackupex –copy-back /path/to/BACKUP-DIR

星期三, 5月 15, 2013

CentOS 5 升級 MySQL 為 MariaDB

早上看完這篇毫無理由使用 MySQL:MariaDB、MySQL 創始者 Michael Widenius 的訪談,很衝動的就想來升級,找了文章,發現 MariaDB 早就提供 CentOS 5 的 yum repository 了,那就沒理由不衝了。
大致的步驟是參考這篇:How can I upgrade from MySQL to MariaDB? - AskMonty KnowledgeBase
我的步驟:
  1. 先去 mariadb 參考 repository 設定,然後新增:https://downloads.mariadb.org/mariadb/repositories/
  2. service stop httpd
  3. service stop mysql
  4. 備份 /var/lib/mysql 下的檔案
  5. yum remove mysql-server mysql-libs mysql-devel mysql*
  6. 因為我有用 remi repository,所以依照前文指示,要以特別的步驟安裝 compat-mysql: yum --enablerepo=remi-test --disablerepo=remi install compat-mysql55
  7. 安裝 MariaDB:yum install MariaDB-client MariaDB-common MariaDB-compat MariaDB-devel MariaDB-server MariaDB-shared  php-mysql
  8. 啟動 mariadb:service mysql start
  9. 啟動 httpd:service httpd start
  10. 收工
其實那個備份是多餘的,依照 MariaDB 的說法是完全相容,接下來就是是用一陣子看看囉。