さくらVPSのphpにcomposerを導入

composer が導入されているか

 

composer が利用できないことを確認
----------------------------------------
composer --version
-bash: composer: コマンドが見つかりません
----------------------------------------

 

composer をどこのディレクトリにダウンロードしてどこにインストールするべきか確認した結果、特に決まりはなく任意のディレクトリでよさそうだ。ただ、プロジェクトだけで必要か、システム全体で使えるようにしたいのかでインストールの実行ディレクトリを決めればいいという意見も多くあった。

自分はさくらVPS の環境でグローバルで使えたほうが便利と考えたのでファイルのダウンロード先を ルートディレクトリ(/root)と決めた

 

root になってホームディレクトリ(/root)でコマンドを実行
-----------------------------------------------------------------------
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-----------------------------------------------------------------------

すると /root に composer-setup.php がダウンロードされる

 

次のコマンドでファイルに問題がないか確認
-----------------------------------------------------------------------
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
-----------------------------------------------------------------------
Installer verified と出たらOK

セットアップを実行
-----------------------------------------------------------------------
php composer-setup.php
-----------------------------------------------------------------------

この状態でカレントディレクトリであるルートディレクトリ(/root)を確認すると composer 関連の二つのファイルが確認できる
-----------------------------------------------------------------------
composer-setup.php composer.phar
-----------------------------------------------------------------------

composer-setup.php はもういらないので削除
-----------------------------------------------------------------------
php -r "unlink('composer-setup.php');"
-----------------------------------------------------------------------

パスを通すために composer.phar を /usr/local/bin/composer に移動
-----------------------------------------------------------------------
mv composer.phar /usr/local/bin/composer
-----------------------------------------------------------------------

composer は root で実行しないように推奨されているのでユーザーを変更。
-----------------------------------------------------------------------
su - ユーザー名
-----------------------------------------------------------------------
参考:rootユーザでcomposerコマンドを実行してはダメな理由

https://akamist.com/blog/archives/261

 

composer が利用できることを確認
--------------------------------------------------------------------------------
composer
--------------------------------------------------------------------------------

 

実際に利用するには composer.json ファイルが必要

適当なディレクトに移動、もしくは作る。自分は /var 直下に作った。

カレントディレクトリに composer.json をつくる。
-q で対話形式の入力を行わない
--------------------------------------------------
composer init -q
--------------------------------------------------

インストール参考

https://technoledge.net/composer-install-and-use/

https://laboradian.com/php-composer/

https://qiita.com/inakadegaebal/items/d370bcb1627fce2b5cd1

https://weblabo.oscasierra.net/php-composer-centos-install/

composerディレクトリ構成

http://tadasy.hateblo.jp/entry/2013/10/09/193415

【さくらのVPS】mb_send_mail でメールが送れない

php の mb_send_mail 関数で一部のメールが送れない。
yahoo メール宛てには送れるのに、独自メールが送れない。

--------------------------------------------------
環境
送信元:さくらのVPS WEBサーバーより mb_send_mail を利用
--------------------------------------------------

mb_send_mail 関数自体はエラーを吐かず、正常に終了する。

ターミナルでメールエラーを確認
--------------------------------------------------
cd /var/log/maillog
--------------------------------------------------

エラーっぽい箇所の抜粋
--------------------------------------------------
May 29 12:14:51 localhost postfix/smtp[32237]: 70ED82C028C: to=, relay=○○.sakura.ne.jp[49.212.235.97]:25, delay=0.08, delays=0.02/0/0.04/0.02, dsn=5.1.8, status=bounced (host ○○.sakura.ne.jp[49.212.235.97] said: 553 5.1.8 ... Domain of sender address apache@localhost.localdomain does not exist (in reply to MAIL FROM command))
--------------------------------------------------

検索して見つけた対処法
設定してなかった mb_send_mail 第五引数に "-fプロバイダメールアドレス" を指定。
第五引数はエラーがあった場合にメールを送信するメールアドレス。
これで送信できるようになった。

ちなみに別で契約しているもう一つのさくらVPSでは 第五引数がなくても送信できている。サーバーの設定を変えることでも問題解決できそうだ。

参考

https://okwave.jp/qa/q4822148.html

https://b-risk.jp/blog/2013/01/php_mb_send_mail/

追記
ezweb を使っている方から仮登録メールが届かないという連絡が問い合わせフォームからあった。

SPF の設定が何のが原因か?

----------------------------------------
"v=spf1 +ip4:web公開サーバーのipアドレス +mx ~all"
----------------------------------------

参考

https://qiita.com/ryounagaoka/items/931081c74b5c7a9b2bff

spfの確認

http://mxtoolbox.com/spf.aspx

追記2
gmail 宛てに送ったら迷惑メールに振り分けられたら

gmail から メールヘッダーを確認。

Received-SPF の部分が softfail になっていたらそれが原因。
ip6 対応のサーバーから送信した場合、SPF の設定に ip6 を追加する必要がある。

参考

https://www.nalabo.net/blog/2013/06/18/148

さくらのvpsにおいてphpでメールが送れない

php の mb_send_mail 関数でメールが送れない。他のサーバーでは送れるのでスクリプトのエラーではない。

ターミナルから送ろうとするとエラーが出た。

こう打つ
--------------------------------------------------------------------
[root@localhost ~]# echo "test" | /usr/sbin/sendmail -t -i ○○@yahoo.co.jp
--------------------------------------------------------------------

//↓出たエラー
--------------------------------------------------------------------
sendmail: fatal: parameter inet_interfaces: no local interface found for ::1
--------------------------------------------------------------------

↓このページのようにしたらできた。

https://qiita.com/cs_sonar/items/706a9204cba1a8e99cb1

postfix はメールを送るためのソフト。

壊れたnasのHDDからデータを取り出す

台風で停電になった後、qnap の turbo nas の動作が不安定になった。

Windows10 からアクセスしてもネットワークがすぐに途切れる。

他の PC からアクセスしても症状は変わらず。nas に外付け HDD を接続してそこにコピーしようとしてもマウントが解除される。

以上のことから nas もしくは HDD に問題がある可能性がとても高い。

とりあえず、ネットワークが切れるまでの数秒から数分の間は HDD にアクセスできるので、切断されたらまた接続を繰り返して、Windows の Cドライブにデータを移行。

また、turbo nas の電源を落として再起動すると、再起動完了時に nas 本体のディスプレイに表示される IPアドレスが、0.0.0.0 になっているのに気づく。

nas 本体に LAN 端子が二つあるので 下の端子から上の端子に LAN ケーブルをつなぎ変えると IPアドレスが正しいものに戻った。(LANケーブルを変えたこと関係があるかは不明)

途中で切れることはなくなった。

nas 本体に外付けHDDを繋げてコピーできる機能があるが、なぜか途中でエラーになる。

なので、外付けHDDを買いなおしてふたたび実行したら滞りなくできた。このときフォーマットなどはしていない。一度エラーを出したHDDだったのが原因かもしれない。エラーが出たHDDもフォーマットしたらうまくいっていたかも。

↓ raid設定のHDDからデータを取り出す方法。実行はしていないけどわかりやすい。

https://datarescue.yamafd.com/software_to_read_nas_hdd/

Let'sEncryptの更新設定

let's encrypt の導入はこちら

Let'sEncrypt の有効期限は 90日。有効期限が切れる前に自動更新するように設定する必要がある。

certbot-auto の場所を確認
--------------------------------------
find -name certbot-auto
--------------------------------------

場所はここだった
--------------------------------------
./certbot-auto
--------------------------------------

更新コマンド
--------------------------------------
sudo ./certbot-auto renew --post-hook "sudo service httpd restart"
--------------------------------------

更新期間まえだと次のように出る。有効期限も確認できる
--------------------------------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem expires on 2018-10-23 (skipped)
No renewals were attempted.
No hooks were run.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
--------------------------------------

強制的に更新するなら次のコマンド
--------------------------------------
sudo ./certbot-auto renew --force-renew --post-hook "sudo service httpd restart"
--------------------------------------

cronへの登録

certbot-auto の場所を調べる
--------------------------------------
find -name certbot-auto
--------------------------------------

シェルスクリプトを用意
--------------------------------------
#!/bin/sh

# #!で始まる一行目の記述はインタプリタの指定
# シェルスクリプトの最初に書くおまじない

# Let's Encrypt 証明書の更新
sudo /root/certbot-auto renew --post-hook "sudo service httpd restart"
--------------------------------------

毎週月曜日に実行
--------------------------------------
2 3 * * * /var/myshellscript/backupmysql.sh
--------------------------------------

有効期間の残りが30日未満の証明書のみ更新される。

サイトのssl化の手順

サイトのssl化の手順 覚書

let's encrypt の更新はこちら

さくらのレンタルサーバー かつ wordpress 利用の場合

-----------------------------------------------------------------------------------------

1.さくらのサーバーコントロールから無料SSL証明書を発行

2.Really Simple SSL をインストールして実行

さくらインターネット提供のプラグインも存在するが php のバージョンが違ったので Really Simple SSL をインストールした

参考サイト

https://zenlogic.jp/aossl/operation/wp-plugin/

3.google の Search Console と analytics の設定を変更する

https://candy.fun-net.biz/https-google-search-console-analytics/

-----------------------------------------------------------------------------------------

さくらのレンタルサーバー かつ wordpress でないの場合

-----------------------------------------------------------------------------------------
1さくらのレンタルサーバー wordpress でない場合

1.さくらのサーバーコントロールから無料SSL証明書を発行

2.CSS や 画像ファイル の URL を http → https に変更

SSL証明書を発行後に https のアドレスでページにアクセスすると表示はされるもののレイアウトが崩れる。このとき chrome のアドレスバーには鍵マークでなく「!」になっていた。原因は http CSS や画像ファイルを http で読み込んでいるのが原因なので https に書き換える。

3.htaccess で http → https の301リダイレクトを設定

htaccess に記述
---------------------------------------------------
RewriteEngine on
RewriteCond %{HTTPS} off //RewriteRuleが実行される条件。直後の RewriteRule のみが対象
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
---------------------------------------------------

4.google の Search Console と analytics の設定を変更する

https://candy.fun-net.biz/https-google-search-console-analytics/

-----------------------------------------------------------------------------------------

さくらのvpsの場合

基本的にここ↓を参考にする

https://knowledge.sakura.ad.jp/10534/

しかしリンク先の解説は CentOS7 を対象としているが、自分が利用しているのは CentOS6.9なのでちょいちょい違うので注意。

ファイアウォールのコマンドは CentOS6.9を利用しているので firewall-cmd ではなく iptables を使う。

iptables の起動状態を確認
-------------------------------------
/etc/init.d/iptables status
-------------------------------------

ssl で利用する 443 ポートが開いていることを確認
-------------------------------------
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
-------------------------------------

Let's Encrypt を利用するには Certbot を利用する必要があるのでインストール

コマンド
-------------------------------------
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto
-------------------------------------

その後指示に従う。

途中で、http でのアクセスを https にリダイレクトするか聞かれるが、手動(htaccess)でリダイレクトしたいので「1」を選択

-------------------------------------

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
-------------------------------------

インストールが完了したら httpd を再起動

-------------------------------------
service httpd start
-------------------------------------

https でアクセスできるか確認する

二つ契約しているさくらのVPSの片一方がうまく SSL化できなかった。

適用するドメインを選択するこの場面で現在利用してないドメインも選択したのが原因だと思われる。

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: one,example.com
1: two,example.com
1: three,example.com
1: four,example.com
1: five,example.com
1: six,example.com
1: seven,example.com
1: eight,example.com
-------------------------------------------------------------------------------

エラーが出てきちんと完了しない場合は、関連ファイルを全部消して再度実行するといい。
削除したファイル1
----------------------------------------------------
rm -rf /opt/eff.org/certbot
rm -rf /etc/letsencrypt
----------------------------------------------------

削除したファイル2
certbot-auto というファイルがいくつかのディレクトリ内にできているのですべて削除
探す場所
----------------------------------------------------
cd /opt/eff.org/
cd /etc/
cd /etc/httpd/conf.d/
----------------------------------------------------

不要ファイルをすべて削除したら再度実行。

コマンド
-------------------------------------
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto
-------------------------------------

【linux】はじめてのcron実行

まず、cron が使える状態であることを確認
-------------------------------------------------
# /etc/rc.d/init.d/crond status
crond (pid xxxx) を実行中... // 動いている!
-------------------------------------------------

ターミナルからサーバーにログインしてcrontabを編集
-------------------------------------------------
crontab -e
-------------------------------------------------
※ crontab -r は全消去なので注意
※内容確認は crontab -l

//編集内容。一分おきに「テスト出力」を追記
-------------------------------------------------
*/1 * * * * echo "テスト出力" >> /var/backup_sql/test.txt
-------------------------------------------------

日付入りファイルの場合
--------------------------------------------------
*/1 * * * * echo "テスト出力" >> /var/backup_sql/backup_`date +\%Y\%m\%d`.txt
--------------------------------------------------
日付は本来 date +%Y%m%d でいけるが、cron の場合 \ のエスケープが必要

一分過ぎたらファイルが出力されているか確認する
-------------------------------------------------
cat /var/backup_sql/test.txt
-------------------------------------------------

cron のログ確認ならこっち
-------------------------------------------------
tail -f /var/log/cron
-------------------------------------------------
※tail は最後の10行のみ表示

毎晩三時二分にシェルスクリプトを実行
-------------------------------------------------
#am03:02 execution
2 3 * * * /var/myshellscript/backupmysql.sh
-------------------------------------------------

backupmysql.sh の内容
-------------------------------------------------
#!/bin/sh

# バックアップの保存期間(days)
period=30

# バックアップ保存用ディレクトリの指定
dirpath='/var/backup_sql'

# MySQLrootパスワード
ROOTPASS=xxxxxxxx

# ファイル名を指定する(※ファイル名で日付がわかるようにしておきます)
filename=`date +%y%m%d`

# 指定したDBのスキーマおよびデータをすべて吐き出す ファイル名接頭辞はあれば
mysqldump -u root --password=パスワード データベース名 テーブル名 > $dirpath/ファイル名接頭辞_$filename.sql

# パーミッション変更
chmod 700 $dirpath/ファイル名接頭辞_$filename.sql

# 保存期間を過ぎたバックアップを削除
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/ファイル名接頭辞_$oldfile.sql
-------------------------------------------------

php + mysql のデータマイニングを高速化したときの覚書

mysql のデータベース内に入っているデータをphpを使ってデータマイニングした際、時間がかかったのでしたこと。

何も対策せずにすると35日ほどかかった。

もう一度する必要でてきたのでそのときにしたこと。

ブラウザを複数立ち上げて同時に処理していった。

このとき同じブラウザ(IE)でやると、それぞれのブラウザで処理が倍になってトータル時間が変わらなかった。

なので、IE、chrome、opera の三つで同時に行った。

単純に三倍速くはならなかったけど、2.5倍ほど早くなったように思う。

【jquery】スクロールできるモーダルウインドウの作り方

http://naming-dic.com/word2.html?lang=en&wordurl=48132895

スクロールできるモーダルウインドウの作り方

以下のページを参考にして、自分の環境用にいじったもの

jQueryでスクロールバーの出るモーダルウィンドウを作る方法

ウィンドウのスクロールバーの横幅を計算するjQueryコード

モーダルを表示したときに背景部分はスクロールできないようにする

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>[DEMO]jQueryでスクロールバーの出るモーダルウィンドウを作る方法</title>
<script src="js/jquery.js"></script>
<script>
//スクロールバーの出るモーダルウィンドウ
///////////////////////////////////////////////////////
// スクロールバーの横幅を取得
$('html').append('<div class="scrollbar" style="overflow:scroll;"></div>');

//これがスクロールバーの横幅
var scrollbar_width = window.innerWidth - $(window).outerWidth(true);
$('.scrollbar').hide();

var current_scrollY;

// 「.modal-open」がクリックされたら
$('.modal-open').click(function(){

//スクロール済みの距離を取得
current_scrollY = $( window ).scrollTop();

//overflow: 'hidden' で下地画面をロックすると、画面が上に戻ってしまうので
//現在地まで移動させる
$( '#wrap' ).css( { top: -1 * current_scrollY } );

//下画面ロック
$( 'html, body' ).css( { overflow: 'hidden' } );

// オーバーレイ用の要素を追加
$('body').append('<div class="modal-overlay"></div>');

// オーバーレイをフェードイン
$('.modal-overlay').fadeIn('slow');

// モーダルコンテンツのIDを取得
var modal = '#' + $(this).attr('data-target');

// モーダルコンテンツを囲む要素を追加
$(modal).wrap("<div class='modal-wrap'></div>");

// モーダルコンテンツを囲む要素を表示
$('.modal-wrap').show();

// モーダルコンテンツの表示位置を設定
modalResize();

// モーダルコンテンツフェードイン
$(modal).fadeIn('slow');

// モーダルコンテンツをクリックした時はフェードアウトしない
//「.modal-open」がクリックされたときにはじめてイベントの登録(イベントが起こったとき関数が呼ばれるようにする)
$(modal).click(function(e){
e.stopPropagation();
});

// 「.modal-overlay」あるいは「.modal-close」をクリック
//「.modal-open」がクリックされたときにはじめてイベントの登録(イベントが起こったとき関数が呼ばれるようにする)
$('.modal-wrap, .modal-close').off().click(function(){
// モーダルコンテンツとオーバーレイをフェードアウト
$(modal).fadeOut('slow');
$('.modal-overlay').fadeOut('slow',function(){

// オーバーレイを削除
$('.modal-overlay').remove();

// モーダルコンテンツを囲む要素を削除
$(modal).unwrap("<div class='modal-wrap'></div>");

//モーダルウインドウを開いたときに設定したの current_scrollY を解除
$( '#wrap' ).css( { top: 0 } );

//overflow 'hidden' から戻す
$( 'html, body' ).css( { overflow: 'visible' } );

alert('current_scrollY' + current_scrollY + 'px');

//モーダルを表示する前の位置に戻る
$(window).scrollTop(current_scrollY);

});
});

// リサイズしたら表示位置を再取得
$(window).on('resize', function(){
modalResize();
});

// モーダルコンテンツの表示位置を設定する関数
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
function modalResize(){

// ウィンドウの横幅、高さを取得
var w = $(window).width();
var h = $(window).height();

// モーダルコンテンツの横幅、高さを取得
var mw = $(modal).outerWidth(true);
var mh = $(modal).outerHeight(true);

// モーダルコンテンツの表示位置を設定
if ((mh > h) && (mw > w)) {

$(modal).css({'left': 0 + 'px','top': 0 + 'px'});

} else if ((mh > h) && (mw < w)) {
var x = (w - scrollbar_width - mw) / 2;
// alert('アラート2\nx' + x + 'px\nh' + h + 'px\nw' + w + 'px\nscrollbar_width' + scrollbar_width + 'px\nmw(モーダル幅)' + mw + 'px\nwindow.innerWidth(垂直スクロールバー(表示されている場合)を含む幅)' + window.innerWidth + 'px\nclientWidth' + $('.scrollbar').prop('clientWidth') + 'px\ncurrent_scrollY(スクロールした距離)' + current_scrollY + 'px');
$(modal).css({'left': x + 'px','top': 0 + 'px'});
} else if ((mh < h) && (mw > w)) {

var y = (h - scrollbar_width - mh) / 2;
$(modal).css({'left': 0 + 'px','top': y + 'px'});

} else {

var x = (w - mw) / 2;
var y = (h - mh) / 2;
$(modal).css({'left': x + 'px','top': y + 'px'});

} //if

}
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////
//function modalResize ここまで
</script>

<style>
body {
margin:10px;
padding:10px;
border:10px solid #ddd;
}

.lock {
overflow:hidden;
}

.modal-content {
position:relative;
display:none;
width:50%;
margin:30px;
padding:10px 20px;
border:2px solid #aaa;
background:#fff;
}

.modal-content p {
margin:0;
padding:0;
}

.modal-overlay {
z-index:1;
display:none;
position:fixed;
top:0;
left:0;
width:100%;
height:120%;
background-color:rgba(0,0,0,0.75);
}

.modal-wrap {
z-index:2;
display:none;
position:fixed;
top:0;
left:0;
width:100%;
height:100%;
overflow:auto;
}

.modal-open {
color:#00f;
text-decoration:underline;
}

.modal-open:hover {
cursor:pointer;
color:#f00;
}

.modal-close {
color:#00f;
text-decoration:underline;
}

.modal-close:hover {
cursor:pointer;
color:#f00;
}
</style>
</head>
<body>
<a data-target="con1" class="modal-open">リンク1</a>
<a data-target="con2" class="modal-open">リンク2</a>
<a data-target="con3" class="modal-open">リンク3</a>
<a data-target="con4" class="modal-open">リンク4</a>
<a data-target="con5" class="modal-open">リンク5</a>

<div id="con1" class="modal-content">
<p><a href="./">リンク1の内容です。</a>・・・</p>
<p><a class="modal-close">閉じる</a></p>
</div>
<div id="con2" class="modal-content">
<p><a href="./">リンク2の内容です。</a>・・・</p>
<p><a class="modal-close">閉じる</a></p>
</div>
<div id="con3" class="modal-content">
<p><a href="./">リンク3の内容です。</a>・・・</p>
<p><a class="modal-close">閉じる</a></p>
</div>
<div id="con4" class="modal-content">
<p><a href="./">リンク4の内容です。</a>・・・</p>
<p><a class="modal-close">閉じる</a></p>
</div>
<div id="con5" class="modal-content">
<p><a href="./">リンク5の内容です。</a>・・・</p>
<p><a class="modal-close">閉じる</a></p>
</div>
<p>
クリックしてみてください。ウィンドウより大きいモーダルウィンドウにはスクロールバーが出ていると思います。<br>
</p>

</body>
</html>
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////

【mysql】Row size too large (> 8126) のエラー対処法

mysql で update を実行した際、以下のエラーが出た

-------------------------------------------------
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
-------------------------------------------------

ROW_FORMATが「Compact」のときに、8126バイト以上のレコードを入力しようとすると出るエラーらしい。

ターミナルの mysql から現在の ROW_FORMAT を確認

-------------------------------------------------
use データベース名 ← データベースを選択

SHOW TABLE STATUS LIKE 'テーブル名'\G
-------------------------------------------------

出力結果
*************************** 1. row ***************************
Name: テーブル名
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 35155
Avg_row_length: 4583
Data_length: 161136640
Max_data_length: 0
Index_length: 0
Data_free: 6291456
Auto_increment: 46319
Create_time: 2018-03-09 16:18:39
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.01 sec)

Row_format の Compact の部分を、DYNAMIC か COMPRESSED に変更すれば消えるらしい。で、変更するには innodb_file_format が Barracuda になっていないといけない。

innodb_file_format を確認

-------------------------------------------------
mysql> SHOW GLOBAL VARIABLES LIKE '%innodb_file_%';
-------------------------------------------------

出力結果
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| innodb_file_format | Antelope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | ON |
+--------------------------+-----------+
4 rows in set (0.00 sec)

innodb_file_format が Antelope なので Barracuda に変更する必要がある。

my.cnfを編集
-------------------------------------------------
vim /etc/my.cnf
-------------------------------------------------

[mysqld]以下に追記
-------------------------------------------------
[mysqld]
innodb_file_per_table = 1
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
-------------------------------------------------

service mysqld restart で再起動

変更を確認
mysql> SHOW GLOBAL VARIABLES LIKE '%innodb_file_%';
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| innodb_file_format | Barracuda |
| innodb_file_format_check | ON |
| innodb_file_format_max | Barracuda |
| innodb_file_per_table | ON |
+--------------------------+-----------+
4 rows in set (0.00 sec)

↑一度 mysqld を再起動しても反映されていない時があった。必ず反映していることを確認すること。

ここまでで、Row_format を Compact → DYNAMIC (or COMPRESSED)に変更する下準備ができたことになる。

再度確認
-------------------------------------------------
use データベース名 ← データベースを選択

SHOW TABLE STATUS LIKE 'テーブル名'\G
-------------------------------------------------

まだ Row_format は Compact のまま

今回は ROW_FORMAT を DYNAMIC にするので以下を実行
-------------------------------------------------
mysql> ALTER TABLE `テーブル名` ROW_FORMAT=DYNAMIC;
-------------------------------------------------

無事に変更されていることを確認する
-------------------------------------------------
use データベース名 ← データベースを選択

SHOW TABLE STATUS LIKE 'テーブル名'\G
-------------------------------------------------