- 投稿日:2019-01-27T20:45:04+09:00
(解決)mysql(mariadb)が起動しなくなった
環境
GCP (Google Cloud Platform)
Compute Engine状態チェック
sudo systemctl status mariadb
Active: failedで起動していません(涙
Status: "MariaDB server is down" が哀愁を深めます。● mariadb.service - MariaDB 10.1.31 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/mariadb.service.d └─migrated-from-my.cnf-settings.conf Active: failed (Result: exit-code) since 日 2019-01-27 20:26:45 JST; 2min 17s ago Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ Process: 1694 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/F AILURE) Process: 1587 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS) Process: 1583 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Main PID: 1694 (code=exited, status=1/FAILURE) Status: "MariaDB server is down" 1月 27 20:26:43 instance-sugasaki-gom-kusanagi-02 systemd[1]: Starting MariaDB 10.1.31 database server... 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 mysqld[1694]: 2019-01-27 20:26:45 140290193697024 [Note] /usr/sbi...... 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 systemd[1]: mariadb.service: main process exited, code=exited, st...URE 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 systemd[1]: Failed to start MariaDB 10.1.31 database server. 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 systemd[1]: Unit mariadb.service entered failed state. 1月 27 20:26:45 instance-sugasaki-gom-kusanagi-02 systemd[1]: mariadb.service failed. Hint: Some lines were ellipsized, use -l to show in full.以下のファイルにログファイルのパスを発見
/etc/my.cnf.d/server.cnf/etc/my.cnf.d/server.cnf... log-error = /var/log/mysql/mysqld.log ...
vi /var/log/mysql/mysqld.logでログファイルを確認2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Using mutexes to ref count buffer pool pages 2019-01-27 19:16:22 140146316003584 [Note] InnoDB: The InnoDB memory heap is disabled 2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins 2019-01-27 19:16:22 140146316003584 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier 2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Compressed tables use zlib 1.2.7 2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Using Linux native AIO 2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Using SSE crc32 instructions 2019-01-27 19:16:22 140146316003584 [Note] InnoDB: Initializing buffer pool, size = 384.0M
The InnoDB memory heap is disabledと書いてあります。
はっ!結果
GCPのVMインスタンスの料金をケチって、メモリを最小(0.6GB)に変えてたのが原因でした。
↓
- 投稿日:2019-01-27T17:20:06+09:00
備忘録 (参考にしたサイト)
Qiitaの参考サイトはストックしてるのでここには記載しない。
ubuntuにmysqlをインストール
https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/
ubuntuでMyDNSのIP自動通知設定
ubuntuにwindows Homeからリモートデスクトップ接続
- 投稿日:2019-01-27T12:56:20+09:00
【Go言語】DBトランザクション共通処理の具体例
初めに
Go言語でDBトランザクション処理をシンプルに書く方法を模索していた。
有力な方法が見つかったので検討の経緯とその具体例を共有する。検討した実装パターン候補
*例コードはGORMを利用している前提。
実直に書く
tx := db.Begin() if tx.Error != nil { return nil, tx.Error } // 何らかの処理が失敗 tx.Rollback() // 成功時 tx.Commit()→ もっとDRYにしたい
→ Rollback or Commitのコールを忘れそう。。トランザクション状態を管理しつつdefer関数内で判断し必要に応じてRollbackをコール
(以下検討アイデアの雰囲気コード)
myTx, err := db.MyBegin() //← このレシーバー関数でBeginして管理トランザクション状態を開始にする if err != nil { return err } defer myTx.MyFinish() //← トランザクション状態判定して未完了ならRollback // 任意のDB処理 user := User { Name: "test name", } if err := myTx.tx.Create(&user).Error; err != nil { return err } if err = myTx.MyCommit(); err != nil { //← Commit成功時、管理トランザクション状態を完了にする return err } return nil→ 少しDRYになった
→ もしMyCommit()を忘れてもトランザクションは必ず終了する
→ でも状態管理せずに済むならそちらの方がシンプルで良さそう。。(結論)共通ラッパー処理を用意する
共通ラッパー処理を関数化するアイデアを採用した。
以下は返り値情報を受け取る場合。// トランザクション実行し情報を受取る func TransactAndReturnData(db *gorm.DB, txFunc func(*gorm.DB) (interface{}, error)) (data interface{}, err error) { tx := db.Begin() if tx.Error != nil { return nil, tx.Error } defer func() { if p := recover(); p != nil { tx.Rollback() panic(p) } else if err != nil { tx.Rollback() } else { err = tx.Commit().Error } }() data, err = txFunc(tx) return }具体例
以下の様なテーブルスキーマとそれぞれのCreate関数が有ると仮定する。
type User struct { ID uint `gorm:"primary_key"` Name string } type Event struct { ID uint `gorm:"primary_key"` UserID uint // ← 外部キー Name string }// ユーザー作成 CreateUser(db *gorm.DB, name string) (*User, error) // ユーザーに紐付くイベント作成 CreateEvent(db *gorm.DB, userID uint, name string) (*Event, error)以下の様にトランザクションを扱いつつまとめて関数化出来る。
func CreateUserAndEventInTransaction(db *gorm.DB, userName, eventName string) (*User, error) { data, err := TransactAndReturnData(db, func(tx *gorm.DB) (interface{}, error) { user, err := CreateUser(tx, userName) if err != nil { return nil, err } _, errEvent := CreateEvent(tx, user.ID, eventName) if errEvent != nil { return nil, errEvent } return user, nil }) if err != nil { return nil, err } // 受け取りたいものをラッパー関数内で返却してキャストすれば良い return data.(*User), nil }ラッパー関数内で漏れなく各処理の結果を返す事だけを守れば安全かつシンプルにトランザクション処理が書ける様になった!
参考
- 投稿日:2019-01-27T01:16:37+09:00
Pythonで株価情報を取得して、MySQLに格納する
やりたいこと
データ分析用に永続データとして日本の株価情報を取得して、MySQLに格納します。
MySQLの環境は、MetabaseとMySQL環境をDockerで作るで作成したMySQLに格納します。データソース
データソースはQuandlというサイトを利用します。
有料データもありますが、無料でも使えます。
今回はQuandlで収集されているデータの中から、東京証券取引所が提供しているデータを利用します。環境
- Mac OS X 10.14.2
- Python 3.7.1
- Quandl 3.4.5
手順
アカウント登録
APIキーを取得するためにQuandlのアカウント登録を行います。
登録は無料です。APIキーの確認
アカウントを作成したら、右上のメニューから[ACCOUNT SETTINGS]を選択します。
プロフィール画面に遷移すると、[YOUR API KEY]にAPIが記載されているのでメモします。データの取得
実際にデータを取得してみます
※必要なライブラリは適宜インストールしてください。#!/usr/local/bin/python3 # -*- coding: utf-8 -*- import datetime import quandl import pandas as pd # 各種設定 ## 取得したい日付レンジの指定 start = datetime.datetime(2007, 1, 1) end = datetime.datetime(2019, 1, 19) # 取得したい会社のティックシンボルを記載します。 ## 例えばの武田薬品工業の場合 TSE/4502 となります。 ## https://www.quandl.com/data/TSE/4502-Takeda-Pharmaceutical-Co-Ltd-4502 company_id = 'TSE/4502' # APIキーの設定 quandl.ApiConfig.api_key = '前の手順で確認したAPIキーをここに記載' # データ取得 df = quandl.get(company_id ,start_date=start,end_date=end)データが以下のように取得できていることを確認します。
>>> df.head() Open High Low Close Volume Date 2007-01-04 8180.0 8210.0 8170.0 8180.0 1401400.0 2007-01-05 8180.0 8180.0 7970.0 8010.0 3020100.0 2007-01-09 8000.0 8010.0 7940.0 7950.0 2696200.0 2007-01-10 7950.0 7960.0 7760.0 7760.0 3807700.0 2007-01-11 7820.0 7890.0 7710.0 7760.0 3286800.0MySQLにデータを格納する。
取得したデータをMySQLに格納します。
上の続きと思ってください。import sqlalchemy as sa ## Indexが日付なので行に取り込んで、データ型を変更する。 df = df.reset_index() df['Date'] = pd.to_datetime(df['Date']) ## 表名の指定 table_name = 'TAKEDA' ## 接続情報設定 engine = sa.create_engine('mysql+mysqlconnector://stock:stock@127.0.0.1/stock', echo=True) # MySQLにデータを格納 df.to_sql(table_name, engine , index=False, if_exists='replace')データの確認
MySQLにアクセスして、データを確認します。
$ mysql --host=127.0.0.1 --user=stock --password mysql> use stock Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------+ | Tables_in_stock | +-----------------+ | AAPL | | TAKEDA | +-----------------+ mysql> desc TAKEDA; +--------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+----------+------+-----+---------+-------+ | Date | datetime | YES | | NULL | | | Open | double | YES | | NULL | | | High | double | YES | | NULL | | | Low | double | YES | | NULL | | | Close | double | YES | | NULL | | | Volume | double | YES | | NULL | | +--------+----------+------+-----+---------+-------+ 6 rows in set (0.00 sec)

