Vagrant + MySQL データは外に置きたい

Filed in Linux | MySQL | MySQL | Vagrant Leave a comment

Windowsで使っています。
VagrantのVM上にデータまで置いちまうと何かと不便なので、vagrant氏が勝手に作ってくれる/vagrantディレクトリを通して、ホストOS上にmysqlのdatadirを持ってきちゃおうと思いました。

まずmysql停止。

んでmy.cnfを編集

[mysqld]
#datadir=/var/lib/mysql
#↓こうしてみました
datadir=/vagrant/MYSQL_DATA_DIR
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

んで、
/var/lib/mysql/mysql
にあるファイルをまるっと
/vagrant/MYSQL_DATA_DIR
にコピー。
#実際のとこ/var/lib/mysql/mysqlの中身だけ移し替えてもだめで、他にも必要ぽかった。
#あたしのばあいは空っぽから始めても差し支えなかったので、まるっと作りなおしちゃった。移行するケースの場合はいろいろ考えてあげないとだめぽ。

こう書き換えて、mysqlをスタート。ハイ失敗。まあそうだろうと思っていた。
/vagrantにあるファイルは所有者がユーザvagrantになっちゃうので、ユーザmysqlでは見られない。
あくまでローカルの開発環境の話なので、さしあたり動けばいい。

usermod -G vagrant mysql

というわけでvagrantグループにmysql氏を追加して、再度mysqldのスタート。
OKでーす。ありがとうございましたー。
あれ、

user=mysql

こいつをvagrantユーザにしても良かったのではないか。どっちも違和感あるけどどっちがマシかな。

/var/lib/mysqlに、ibdata1とかいう巨大なファイルがある。

innodb_file_per_tableを有効にしていると、テーブルのデータはそれぞれのテーブルスペースに格納される。しかし共有テーブルスペースには次のようなInnoDBの内部データが格納されている。
データディクショナリ(InnoDBテーブルのメタデータ)
チェンジバッファ
ダブルライトバッファ
UNDOログ

引用元:MySQL ibdata1が肥大化する理由(記事の意訳) | Ore no homepage

へー。知りませんでした。ほっとくとおっかないなあ。こっちはVM上にあるから、知らないうちに圧迫して死ぬとかありそう。

MySQL – 肥大化したibdata1を縮小する – Qiita

, ,

MySQLでテーブルの複製をしたい

Filed in MySQL Leave a comment

MySQL テーブルの複製(コピー)を作成する
役に立った記事。likeってそこでの用途もあるのか―と驚きました。
テーブルのコピーあんまやった記憶なかった。

ブログのテーマを試してCSS調整ようという時、じっさいに投稿済のpostでテストしたかったと。
そんなんで久しぶりにクエリを叩く羽目になりましたまる

SQLAlchemyでUNIQUE制約

Filed in Pylons | Python | SQLAlchemy Leave a comment

ship_idとskill_idの組がUniqueであるっつうテーブル制約を加えたい。

table_obj= Table('table_a', metadata,
    Column('id',        Integer, primary_key=True),

    Column('ship_id',   Integer, ForeignKey('ship.id') , unique=True),
    Column('skill_id',  Integer, ForeignKey('skill.id'), unique=True),
    )

こうやりがち。でもこれぶー。ship_idとskill_idにそれぞれUnique制約かかっちゃって、何にも入らないテーブルの一丁上がり。

table_obj= Table('table_a', metadata,
    Column('id',        Integer, primary_key=True),

    Column('ship_id',   Integer, ForeignKey('ship.id')),
    Column('skill_id',  Integer, ForeignKey('skill.id')),
    UniqueConstraint('ship_id', 'skill_id', name='ship_skill')
    )

UniqueConstraintってのがあったよ。これで

CREATE TABLE table_a (
        id INTEGER NOT NULL AUTO_INCREMENT,
        ship_id INTEGER,
        skill_id INTEGER,
        delflg SMALLINT NOT NULL,
        created DATETIME,
        updated DATETIME,
        PRIMARY KEY (id),
        FOREIGN KEY(skill_id) REFERENCES mst_optionskill (id),
        FOREIGN KEY(ship_id) REFERENCES ship (id),
        CONSTRAINT ship_skill UNIQUE (ship_id, skill_id)
)

的なアレになる。よかった。

, ,

TOP