DB http://optimal-sdw.com/ ja MySQL5.7における全文検索の実装方法について http://optimal-sdw.com/blog/code-db/article_89 <span>MySQL5.7における全文検索の実装方法について</span> <span><span>@optimal-sdw.com</span></span> <span><time datetime="2020-02-11T22:05:57+09:00" title="2020年2月11日(火曜日) - 22:05">2020/02/11(火) - 22:05</time> </span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2020-04-12T13:30:00Z">2020/04/12(日) - 22:30</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-db/article_89"><img alt="article_89_eye_catch" data-entity-type="file" data-entity-uuid="f431754a-e2ba-4d1c-a954-4f67aac0773e" src="/sites/default/files/inline-images/article_89.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="882" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>以前、MySQLのデータベースエンジンであるInnoDBの全文検索を導入するために、MySQL5.6から5.7へバージョンアップしたのですが、InnoDBにおける全文検索は思ったほどのパフォーマンスは得られず、全文検索に特化したMroongaエンジンを利用することにしました。</p> <p>本記事ではInnoDBおよびMroongaの両方について紹介致します。</p> <p>※ おすすめはMroongaです。</p> <p>全文検索とは簡単にイメージを掴んで頂くと、Google検索のようなキーワードによるデータ検索機能です。</p> <p>例えば、会社でPCを貸与してもらうとき、交通費などの精算を行うときなど、何か所属部署の上長に許可を頂く際は申請書を提出すると思います。ほとんどの会社では紙での申請ではなく、システム上で申請する会社が多いと思います。</p> <p>このようなシステムにおいては、自分自身が登録した申請書や、自分が承認しなければならない申請書を検索したり、〇〇申請書やXX申請書といった申請書種類で検索したりなど、目的のデータを発見するために検索機能が備わっています。</p> <p>※ 業務アプリケーションだけではなく、Amazonなどのショッピングサイトやゲームにおいても商品(アイテム)検索があるように、システム開発では必ずと言っていいほど検索機能に触れることになります。</p> <p>しかしながら、業務系アプリケーションの検索機能はしばしば検索項目が多くなりがちで、例えば申請中、〇〇承認者承認待ち、XX承認者承認待ちなどといったステータスでの検索、申請書に振られる申請書番号や申請書のタイトルでの検索、申請書作成者の氏名や社員番号での検索などなど、個々の項目ごとに検索ワードを入力することが多いです。</p> <p>【検索条件の項目が多い画面例】</p> <img alt="search image" data-entity-type="file" data-entity-uuid="c0e222d1-25b5-4e67-9971-be30c3682019" src="/sites/default/files/inline-images/search.png" style="max-width:250px;width:100%;height:100%;" class="align-center" width="597" height="485" loading="lazy" /><p> </p> <p>上記のイメージのように検索項目が画面の半分近くを占め、検索結果が画面の半分にしか表示されない、よく使われる検索項目は1つ2つのみで他の項目はほとんど使われないなど、使い勝手が良くないことがほとんどです。</p> <p>このような課題を解決する一つの手法として登場するのが全文検索になります。全文検索を用いることで、登録データの複数項目に対し、Google検索のような一つのキーワード入力で検索することが可能になります。</p> <p>※ 特定項目のみにキーワードをヒットさせたい(他の項目のあいまい検索にヒットした結果を排除したい)というユーザ要望によってこのような画面になりがちです。その場合は詳細検索欄を設けて通常は折り畳み表示(意識的に開かない限り表示されない)を利用したりします。</p> <p>MySQLでは5.6から日本語での全文検索をサポートしておりますが、全文検索を実現するためのキーワード生成が多少面倒であり、あまり使い勝手は良くありません。</p> <p>MySQL5.6から5.7へバージョンアップすると、InnoDBエンジンにおいてngramパーサを標準で利用することができます。</p> <p>ngramとはキーワードを1文字、2文字、3文字といった特定のn文字へとぶつ切りにして、入力した検索キーワードが曖昧であっても部分的にヒットするようにしてくれる技術です。</p> <p>ngramパーサとは全文検索に利用したいキーワード項目を自動的にngramの形に変換してインデックスを作成してくれる機能です。インデックスとはデータベースに登録されたデータを高速に検索するための索引のことです。</p> <p>MySQL5.7ではFULLTEXTインデックスを全文検索用の項目に付与することで、ngramパーサによって自動的にngramに基づいたインデックスを生成してくれます。そのため、MySQL5.6では全文検索用の項目をわざわざngramの形にあうように登録してFULLTEXTインデックスを付与する必要がありましたが、MySQL5.7ではその必要が無いため全文検索の導入が非常に楽になります。</p> <p>なお、Mroongaを利用する場合は、Mroongaエンジンがngramをサポートしているため、MySQL5.6のままでも特に導入の手間に違いはありません。</p> <p> </p> <hr /><h2 id="sec01">MySQL5.7 InnoDBエンジンにおけるmy.cnfの設定サンプル</h2> <hr /><p>InnoDBエンジンでngramパーサを利用する場合には、MySQLの設定ファイルであるmy.cnfにngramで分割する文字数を設定することができます。標準では2文字になっています。</p> <p>利用するパラメータは「ngram_token_size」です。</p> <pre> <code class="language-xml">ngram_token_size=2</code> </pre> <p>3文字、4文字と変更したい場合は上記の設定値を変更します。</p> <p> </p> <hr /><h2 id="sec02">MySQL5.7 InnoDBエンジンにおける検索キーワードテーブルのサンプル</h2> <hr /><p>全文検索を実装する場合、検索対象のテーブルにキーワード項目を設けるよりも、対象テーブルのキー項目とキーワード項目で構成された別テーブルを用意したほうが良いと思います。</p> <p>FULLTEXTインデックスはデータの追加・更新・削除といった操作による再構築時に時間がかかるとされているためです。</p> <p>また、複数の項目を連結してキーワード項目は生成するため、比較的項目のサイズは大きくなり、分離されていないと検索結果の読み込み時にも時間がかかってしまいます。</p> <p>例えば商品の購入履歴を全文検索する場合、購入履歴テーブルとは別にキーワードテーブルを用意します。</p> <p>キーワードについては、購入履歴テーブルをもとに商品テーブルや商品の数量単位などを管理する単位テーブルなどから商品名や数量単位名等、キーワード検索の対象にしたい項目を選出し、半角スペース区切りで連結してキーワードテーブルに保存します。</p> <p> </p> <pre> <code class="language-sql">-- 商品テーブル CREATE TABLE `ITEM` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `ITEM_NUMBER` varchar(30) NOT NULL, `ITEM_NAME` varchar(100) NOT NULL, `UNIT_CODE` varchar(10) DEFAULT NULL, `UNIT_PRICE` decimal(15,0) DEFAULT NULL, `TAX_CODE` decimal(15,0) DEFAULT NULL, `INSERT_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `INSERT_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `UPDATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `UPDATE_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `DELETE_FLG` char(1) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `idx_itm_item_number` (`ITEM_NUMBER`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 単位テーブル CREATE TABLE `UNIT` ( `UNIT_CODE` varchar(10) DEFAULT NULL, `UNIT_NAME` varchar(20) NOT NULL, `INSERT_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `INSERT_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `UPDATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `UPDATE_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `DELETE_FLG` char(1) NOT NULL DEFAULT '0', PRIMARY KEY (`UNIT_CODE`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 購入履歴テーブル CREATE TABLE `ITEM_P_HISTORY` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `USER_ID` varchar(10) NOT NULL, `PURCHASE_DATE` timestamp NOT NULL, `ITEM_NUMBER` varchar(30) NOT NULL, `QUANTITY` decimal(15,3) DEFAULT NULL, `UNIT_CODE` varchar(10) DEFAULT NULL, `UNIT_PRICE` decimal(15,0) DEFAULT NULL, `AMOUNT` decimal(15,0) DEFAULT NULL, `AMOUNT_TAX` decimal(15,0) DEFAULT NULL, `INSERT_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `INSERT_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `UPDATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `UPDATE_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `DELETE_FLG` char(1) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `idx_iph_item_number` (`ITEM_NUMBER`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- キーワードテーブル CREATE TABLE `ITEM_P_HISTORY_KEYWORD` ( `HISTORY_ID` bigint(20) NOT NULL, `HISTORY_KEYWORD` mediumtext, `INSERT_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `INSERT_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `UPDATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `UPDATE_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `DELETE_FLG` char(1) NOT NULL DEFAULT '0', PRIMARY KEY (`HISTORY_ID`), FULLTEXT KEY `idx_iphk_history_keyword` (`HISTORY_KEYWORD`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</code> </pre> <p>なお、キーワードを生成する場合、例えば「R-1」のように「-」などの記号が含まれているキーワードについては記号を除去して「R 1」に変換します。全文検索の構文上、「-」や「+」といった記号に特別な意味を持つためです。</p> <p>ただし、ngram_token_size=2の場合、上記のキーワード「R 1」に対し、ngram_token_sizeより短いキーワード「R」や「R*」で検索してもヒットしません。</p> <p>※「R*」は前方一致検索になりますが、そもそものキーワード「R」がトークンサイズより短いためヒットしません。</p> <p>そのため、どうしても「R」や「1」の1文字で検索したいといった場合には、「RR」「11」といったキーワードを足して生成しておくことで検索結果に表示されます。</p> <p> </p> <hr /><h2 id="sec03">MySQL5.7 InnoDBエンジンにおける検索キーワード処理サンプル</h2> <hr /><p>検索画面で入力されたキーワードを受け取り、SQLに渡すキーワードを生成するサンプルになります。</p> <p>基本的にAND検索による絞り込みを前提にしています。</p> <p>サンプルはphpコードで記載していますが、別の言語でもやることは一緒です。</p> <p>サンプルコード中の正規表現における文字プロパティコードについては以下公式ページをご参考ください。</p> <p><a href="https://www.php.net/manual/ja/regexp.reference.unicode.php" rel="nofollow noopener noreferrer" target="_blank">https://www.php.net/manual/ja/regexp.reference.unicode.php</a></p> <p> </p> <p>【サンプル】</p> <p>(1) 入力されたキーワードから記号を除去する</p> <p>ngramのインデックスには「-」や「+」といった記号は含まれないため、入力されたキーワードから数字、アルファベット、アンダースコア以外の文字を除去します。また、全文検索の構文上、「-」や「+」といった記号に特別な意味を持つため、不要な文字を除去します。</p> <p>(2) ngram_token_sizeに設定した文字数より短いキーワードはワイルドカード検索となるようにする</p> <p>ngram_token_sizeに設定した文字数より短い文字にはヒットしないため、キーワードのヒット率を上げるためにワイルドカードを利用します。ただし、前方一致のワイルドカードのみなので、ヒットしないケースがあります。</p> <p>(3) IN BOOLEAN MODEでAND検索を実施するため、キーワードの先頭に「+」を付与する</p> <p>「+」を付与するとAND検索になり、何も付与しないとOR検索になります。「-」を付与するとNOTの意味になり、対象のキーワードを含んでいないものになります。</p> <pre> <code class="language-php">$keyword = "R-1 ドリンク"; //画面から入力されたキーワード $searchkeyword = ""; if (isset($keyword)) { $words = preg_replace('/[^\p{L}\p{N}_]+/u', ' ', $keyword); // 記号を除外(+や-は利用できないため) $newkeyword = ""; if (isset($words) &amp;&amp; $words != "") { foreach (explode(' ', $words) as $token) { if (trim($token) == "") { continue; } $token_length = mb_strlen($token); if ($token_length &lt; 2) { $token = $token . "*"; // ngram_token_sizeよりも短いワードは*でワイルドカード検索 } $newkeyword .= "+" . $token . " "; } } $searchkeyword = trim($newkeyword); // 余計な前後の半角スペースを除去 } </code> </pre> <p>上記サンプルでは、最終的に$searchkeywordという変数に「+R* +1* +ドリンク」というキーワードが生成されます。</p> <p>発行するSQLは以下のようになります。</p> <pre> <code class="language-sql">SELECT * FROM `ITEM_P_HISTORY` WHERE `ID` IN ( SELECT `HISTORY_ID` FROM `ITEM_P_HISTORY_KEYWORD` WHERE MATCH(`HISTORY_KEYWORD`) AGAINST('+R* +1* +ドリンク' IN BOOLEAN MODE) );</code></pre> <p> </p> <hr /><h2 id="sec04">MySQL5.7 Mroongaエンジンのインストール方法</h2> <hr /><p>Mroongaエンジンのインストールにつきましては、お使いのOS環境にて手順が異なります。</p> <p>詳細は公式ページを参照ください。</p> <p><a href="https://mroonga.org/ja/docs/install.html" rel="nofollow noopener noreferrer" target="_blank">Mroonga インストール手順</a></p> <p>例えばCentOS7におけるインストール方法は以下の通りです。</p> <pre> <code class="language-xml">sudo yum install -y https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm sudo yum install -y http://repo.mysql.com/mysql-community-release-el7-7.noarch.rpm sudo yum install -y yum-utils sudo yum-config-manager --disable mysql56-community sudo yum-config-manager --enable mysql57-community sudo yum install -y --enablerepo=epel mysql57-community-mroonga sudo systemctl start mysqld tmp_password=$(sudo grep 'A temporary password' /var/log/mysqld.log | sed -e 's/^.*: //') sudo mysqladmin -u root --password="${tmp_password}" password</code> </pre> <p> </p> <hr /><h2 id="sec05">MySQL5.7 Mroongaエンジンにおけるmy.cnfの設定サンプル</h2> <hr /><p>Mroongaを利用する場合はmy.cnfにトークナイザの設定を行います。</p> <p>トークナイザの種類については公式チュートリアルに記載があります。</p> <p><a href="https://mroonga.org/ja/docs/tutorial/storage.html#id4" rel="nofollow noopener noreferrer" target="_blank">トークナイザ一覧</a></p> <p> </p> <p>英数字かなをBigramで検索するにはTokenBigramSplitSymbolAlphaDigitを利用します。</p> <p> </p> <pre> <code class="language-xml">[mysqld] mroonga_default_tokenizer=TokenBigramSplitSymbolAlphaDigit</code> </pre> <p> </p> <hr /><h2 id="sec06">MySQL5.7 Mroongaエンジンにおけるキーワードテーブルサンプル</h2> <hr /><p>キーワードテーブルは基本的にInnoDBエンジンの場合と同じ構成になりますが、選択するエンジンはMroongaになります。</p> <p> </p> <pre> <code class="language-sql">-- キーワードテーブル CREATE TABLE `ITEM_P_HISTORY_KEYWORD` ( `HISTORY_ID` bigint(20) NOT NULL, `HISTORY_KEYWORD` mediumtext, `INSERT_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `INSERT_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `UPDATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `UPDATE_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `DELETE_FLG` char(1) NOT NULL DEFAULT '0', PRIMARY KEY (`HISTORY_ID`), FULLTEXT KEY `idx_iphk_history_keyword` (`HISTORY_KEYWORD`) ) ENGINE=Mroonga DEFAULT CHARSET=utf8;</code> </pre> <p> </p> <hr /><h2 id="sec07">MySQL5.7 Mroongaエンジンにおける検索キーワードの渡し方サンプル</h2> <hr /><p>Mroongaを利用すると、Bigramであっても1文字以上の検索キーワードにヒットするようになります。そのため、InnoDBエンジンの際にはワイルドカードを付与しておりましたが基本的に不要になります。</p> <p> </p> <pre> <code class="language-php">$keyword = "R-1 ドリンク"; //画面から入力されたキーワード $searchkeyword = ""; if (isset($keyword)) { $words = preg_replace('/[^\p{L}\p{N}_]+/u', ' ', $keyword); // 記号を除外(+や-は利用できないため) $newkeyword = ""; if (isset($words) &amp;&amp; $words != "") { foreach (explode(' ', $words) as $token) { if (trim($token) == "") { continue; } $newkeyword .= "+" . $token . " "; } } $searchkeyword = trim($newkeyword); // 余計な前後の半角スペースを除去 }</code> </pre> <p><span id="cke_bm_8266S" style="display: none;"> </span>上記サンプルでは、最終的に$searchkeywordという変数に「+R +1 +ドリンク」というキーワードが生成されます。</p> <p>発行するSQLは以下のようになります。</p> <pre> <code class="language-sql">SELECT * FROM `ITEM_P_HISTORY` WHERE `ID` IN ( SELECT `HISTORY_ID` FROM `ITEM_P_HISTORY_KEYWORD` WHERE MATCH(`HISTORY_KEYWORD`) AGAINST('+R +1 +ドリンク' IN BOOLEAN MODE) );</code></pre> <p> </p> <hr /><h2 id="sec08">MySQL5.7 InnoDBエンジンのテーブルとMroongaエンジンのテーブルは共存可能</h2> <hr /><p>通常のトランザクションデータ、マスタデータを保存するテーブルについてはInnoDB、キーワードテーブルはMroongaと、使用するエンジンをわけることが可能です。</p> <p>Mroongaエンジンはトランザクション機能を提供しないため、業務データを保存するためのエンジンとしては不向きです。</p> <p>そのため、Mroongaを利用する場合はキーワードテーブルは独立したテーブルとして定義したほうが良いと思います。</p> <p>※ FULLTEXTインデックスはデータの追加・更新・削除といった操作による再構築時に時間がかかるという理由もありますが、Mroongaの場合は上記理由からしても分ける必要があります。</p> <p> </p> <hr /><h2 id="sec09">MySQL5.7 全文検索導入 まとめ</h2> <hr /><p>InnoDBとMroonga両方を紹介致しましたが、正直なところInnoDBの全文検索機能を利用するメリットはあまりありません。</p> <p>全文検索を導入するのであれば検索パフォーマンス、キーワードのヒット率に優れたMroongaを利用したほうが良いと思います。</p> <p>(1) Mroongaをインストールする (<a href="https://mroonga.org/ja/docs/install.html" rel="nofollow noopener noreferrer" target="_blank">Mroonga インストール手順</a>)</p> <p>※ CentOS7の場合は以下の通り。</p> <pre> <code class="language-xml">sudo yum install -y https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm sudo yum install -y http://repo.mysql.com/mysql-community-release-el7-7.noarch.rpm sudo yum install -y yum-utils sudo yum-config-manager --disable mysql56-community sudo yum-config-manager --enable mysql57-community sudo yum install -y --enablerepo=epel mysql57-community-mroonga sudo systemctl start mysqld tmp_password=$(sudo grep 'A temporary password' /var/log/mysqld.log | sed -e 's/^.*: //') sudo mysqladmin -u root --password="${tmp_password}" password</code> </pre> <p> </p> <p>(2) my.cnfにトークナイザの設定を追記する (<a href="https://mroonga.org/ja/docs/tutorial/storage.html#id4" rel="nofollow noopener noreferrer" target="_blank">トークナイザ一覧</a>)</p> <pre> <code class="language-xml">[mysqld] mroonga_default_tokenizer=TokenBigramSplitSymbolAlphaDigit</code> </pre> <p> </p> <p>(3) FULLTEXTインデックス項目を持つMroongaエンジンのキーワードテーブルを個別に用意する</p> <pre> <code class="language-sql">-- キーワードテーブル CREATE TABLE `ITEM_P_HISTORY_KEYWORD` ( `HISTORY_ID` bigint(20) NOT NULL, `HISTORY_KEYWORD` mediumtext, `INSERT_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `INSERT_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `UPDATE_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `UPDATE_USER` varchar(10) NOT NULL DEFAULT 'SYSTEM', `DELETE_FLG` char(1) NOT NULL DEFAULT '0', PRIMARY KEY (`HISTORY_ID`), FULLTEXT KEY `idx_iphk_history_keyword` (`HISTORY_KEYWORD`) ) ENGINE=Mroonga DEFAULT CHARSET=utf8;</code> </pre> <p> </p> <p>(4) 画面から入力されたキーワードからは記号や前後の不要なスペースを取り除いてSQL文に代入する</p> <p> </p> <pre> <code class="language-php">$keyword = "R-1 ドリンク"; //画面から入力されたキーワード $searchkeyword = ""; if (isset($keyword)) { $words = preg_replace('/[^\p{L}\p{N}_]+/u', ' ', $keyword); // 記号を除外(+や-は利用できないため) $newkeyword = ""; if (isset($words) &amp;&amp; $words != "") { foreach (explode(' ', $words) as $token) { if (trim($token) == "") { continue; } $newkeyword .= "+" . $token . " "; } } $searchkeyword = trim($newkeyword); // 余計な前後の半角スペースを除去 }</code> </pre> <p><span id="cke_bm_8266S" style="display: none;"> </span>上記サンプルでは、最終的に$searchkeywordという変数に「+R +1 +ドリンク」というキーワードが生成されます。</p> <p>※ BOOLEANモードで検索する</p> <pre> <code class="language-sql">SELECT * FROM `ITEM_P_HISTORY` WHERE `ID` IN ( SELECT `HISTORY_ID` FROM `ITEM_P_HISTORY_KEYWORD` WHERE MATCH(`HISTORY_KEYWORD`) AGAINST('+R +1 +ドリンク' IN BOOLEAN MODE) );</code></pre> <p> </p> <p>以上です。</p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-db" hreflang="ja">DB</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> <h2>コメントを追加</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=89&amp;2=comment&amp;3=comment" token="N678BXvWLlvxNlDU9T1ftMIwIE27DFfGNvWiMW1XKS0"></drupal-render-placeholder> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-9ed16e0dc80332eb4c841979088d803c2919c4103952fde62827bff96ce588d4"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-db/article_37" hreflang="ja">MySQL5.6から5.7へのアップグレード手順 (全文検索でngramを利用するために)</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-db/article_37"><img alt="article_37_eye_catch" data-entity-type="file" data-entity-uuid="2b1d5fa1-03d8-4eab-99e5-558d0a460989" src="/sites/default/files/inline-images/article_37.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1705" height="958" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Tue, 11 Feb 2020 13:05:57 +0000 @optimal-sdw.com 89 at http://optimal-sdw.com http://optimal-sdw.com/blog/code-db/article_89#comments MySQL5.6から5.7へのアップグレード手順 (全文検索でngramを利用するために) http://optimal-sdw.com/blog/code-db/article_37 <span>MySQL5.6から5.7へのアップグレード手順 (全文検索でngramを利用するために)</span> <span><span>@optimal-sdw.com</span></span> <span><time datetime="2019-11-08T13:58:17+09:00" title="2019年11月8日(金曜日) - 13:58">2019/11/08(金) - 13:58</time> </span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2019-11-08T04:58:17Z">2019/11/08(金) - 13:58</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-db/article_37"><img alt="article_37_eye_catch" data-entity-type="file" data-entity-uuid="2b1d5fa1-03d8-4eab-99e5-558d0a460989" src="/sites/default/files/inline-images/article_37.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1705" height="958" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>MySQLで全文検索機能を実装しようとした場合、MySQL5.6以上から日本語の全文検索に対応しています。</p> <p>しかしながら、MySQL5.6ではngram等のパーサに非対応で、FULLTEXTインデックスの利便性が悪いです。</p> <p>検索精度を向上させるためには、FULLTEXTインデックスを付与したカラムに自前で工夫したキーワードを登録する必要があります。</p> <p>キーワード生成の自前作成をアプリ側でやろうとするとパフォーマンスも悪く、煩雑なデータ登録ロジックになるため、ngramのパーサに対応しているMySQL5.7へバージョンアップすることにしました。</p> <p>今後さらにバージョンアップを行う場合、同じ手順で実行可能とは限りませんが、ほとんど同じ手順でできるのではないかと思料しております。</p> <p><strong>※ なお、postfixでメール送信しているサーバー上で作業される際は、postfixの設定ファイルを念のため退避しておくことをお奨め致します。MySQLの削除に伴い、postfixも削除されます。</strong></p> <p><strong>※また、cronも削除されるため、バッチ処理のスケジューリングを行っている場合も注意が必要です。</strong></p> <p> </p> <hr /><h2 id="sec01">1. CentOSのバージョン確認</h2> <hr /><p>まずはMySQL5.7を導入するにあたり、CentOSのバージョンが6系統か7系統か確認致します。</p> <p> </p> <pre> <code class="language-xml">$ cat /etc/centos-release CentOS release 6.10 (Final)</code> </pre> <p> </p> <hr /><h2 id="sec02">2. yumのユーティリティツールをインストール</h2> <hr /><p>それからyumのユーティリティツールをインストールしておきます。後でインストールするMySQLのバージョンを5.7にするために5.6を無効化したりするのに利用します。</p> <p> </p> <pre> <code class="language-xml">$ sudo yum -y install yum-utils</code></pre> <p> </p> <hr /><h2 id="sec03">3. MySQLのサービス停止</h2> <hr /><p>現在稼働しているMySQLのサービスを停止します。サービスを停止する前に各種データベースのエクスポートを行い、データのバックアップを行っておくことを推奨いたします。</p> <p> </p> <pre> <code class="language-xml">$ sudo service mysqld stop Stopping mysqld: [ OK ]</code></pre> <p>(CentOS7ではsystemctl stop mysqldでサービスを停止します。)</p> <p> </p> <hr /><h2 id="sec04">4. 既存のMySQLの確認</h2> <hr /><p>現在インストールされているMySQLのライブラリ群を確認します。これらを削除するため念のため何がインストールされていたのかメモしておきます。</p> <p> </p> <pre> <code class="language-xml">$ sudo yum list installed | grep mysql Failed to set locale, defaulting to C compat-mysql51.x86_64 5.1.73-1.el6.remi、 @remi mysql-community-client.x86_64 5.6.44-2.el6 @mysql56-community mysql-community-common.x86_64 5.6.44-2.el6 @mysql56-community mysql-community-devel.x86_64 5.6.44-2.el6 @mysql56-community mysql-community-libs.x86_64 5.6.44-2.el6 @mysql56-community mysql-community-release.noarch el6-5 @/mysql-community-release-el6-5.noarch mysql-community-server.x86_64 5.6.44-2.el6 @mysql56-community php-mysqlnd.x86_64 5.6.40-11.el6.remi @remi-php56</code></pre> <p> </p> <hr /><h2 id="sec05">5. 既存のMySQLの削除</h2> <hr /><p>現在インストールされているMySQLのライブラリ群を削除します。MySQLのライブラリ群を削除する前に、念のため設定ファイルを退避しておくことを推奨いたします。(新しいバージョンのMySQLをインストールする際に自動でリネームされて保持されますが、念のため。対象のファイルは/etc/my.confおよび/etc/my.conf.d直下の設定ファイル)</p> <p>なお、postfixも削除されるため、postfixでメール送信しているサーバー上で作業される場合は注意が必要です。MySQLと同じく念のため各種設定ファイルの複製をホームディレクトリ等に退避しておきましょう。(/etc/postfix/main.cf, /etc/postfix/master.cf, /etc/postfix/virtual)また、mysqldの停止と同様にpostfixのサービスも停止しておきましょう。</p> <p>また、cronも削除されます。crontabのスケジューリング設定は残りますが、念のため退避しておきましょう。依存関係を確認しながら削除される場合は-yを指定せずに実行しましょう。</p> <p> </p> <pre> <code class="language-xml">$ sudo yum -y remove mysql*</code></pre> <p> </p> <p>念のためmysqlに依存して削除されたライブラリを確認しておきましょう。「yum history list」で履歴番号を確認して、「yum history info 履歴番号」で詳細を確認することができます。</p> <p> </p> <pre> <code class="language-xml">$ sudo yum history list | grep Erase 17 **** ***** 10 **** ***** . . . $ sudo yum history info 17 </code></pre> <p> </p> <hr /><h2 id="sec06">6. 新しいバージョンのMySQL RPMパッケージをyumへインストール</h2> <hr /><p>MySQLの公式サイトからCentOSのバージョンに合ったRPMパッケージをダウンロードし、yumへインストールします。</p> <p> </p> <pre> <code class="language-xml">$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm</code></pre> <p> </p> <hr /><h2 id="sec07">7. yumで利用するMySQLのバージョンを5.7に変更</h2> <hr /><p>yumのユーティリティツールを利用してMySQL5.6を無効にします。</p> <p> </p> <pre> <code class="language-xml">$ sudo yum-config-manager --disable mysql56-community</code></pre> <p> </p> <p>yumのユーティリティツールを利用してMySQL5.7を有効にします。</p> <p> </p> <pre> <code class="language-xml">$ sudo yum-config-manager --enable mysql57-community-dmr</code></pre> <p> </p> <hr /><h2 id="sec08">8. MySQL5.7をインストール</h2> <hr /><p>yumのインストールコマンドを利用してMySQL5.7をインストールします。</p> <p>※ postfix、cronも削除されているため、必要な方は以下のコマンドの最後に半角スペースをあけてpostfix crontabsを足してください。mysqlとpostfix、cronがインストールされます。</p> <p> </p> <pre> <code class="language-xml">$ sudo yum -y install mysql mysql-devel mysql-server mysql-utilities</code></pre> <p> </p> <p>退避した設定ファイルから必要な記述を移し替えます。バージョンが上がっているため、設定ファイルの書き方が変わっている可能性があります。MySQLの公式サイトで各バージョンの設定ファイルを事前に確認して先に用意しておくと楽です。postfixの設定ファイルについても同様に退避した設定ファイルから必要な記述を移し替えます。virtualの設定を行っている場合はpostmap /etc/postfix/virtualなども行っておきます。</p> <p> </p> <hr /><h2 id="sec09">9. MySQLのサービス起動</h2> <hr /><p>MySQLのサービスを起動します。</p> <p> </p> <pre> <code class="language-xml">$ sudo service mysqld start Starting mysqld: [ OK ]</code></pre> <p>(CentOS7ではsystemctl start mysqldを使います。)</p> <p> </p> <hr /><h2 id="sec10">10. MySQL5.6のデータベースをMySQL5.7へアップグレード</h2> <hr /><p>MySQLのアップグレードコマンドを利用してアップグレードを行います。これによりMySQL5.6で稼働していたデータベース、テーブル、テーブルデータがMySQL5.7で利用可能になります。</p> <p> </p> <pre> <code class="language-xml">$ sudo mysql_upgrade -u root -p Enter password: Checking if update is needed. Checking server version. Running queries to upgrade MySQL server. Checking system database. ***.******** OK ***.******** OK ***.******** OK ***.******** OK . . . . Upgrade process completed successfully. Checking if update is needed.</code></pre> <p>データベースへアクセス可能かどうか、データは参照できるか等のチェックを行って終了です。また、必要に応じてpostfix、crondのサービスを起動します。</p> <p>仮にデータ破損等生じた場合は該当テーブルの再作成と事前に作成したバックアップからデータの再投入を行います。</p> <p> </p> <p>以上</p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-db" hreflang="ja">DB</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> <h2>コメントを追加</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=37&amp;2=comment&amp;3=comment" token="gvF5wqRkvRYszrMOWAxHDjMIL25UoMLzXWdz7viFYPw"></drupal-render-placeholder> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-e313f0f5ba9807b8cfb27857b55718ce6f493467b9da6adca4c77e6d626b985c"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--2" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-db/article_29" hreflang="ja">MariaDBのインストールまたはMySQLのインストール</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-db/article_29"><img alt="article_29_eye_catch" data-entity-type="file" data-entity-uuid="e3602371-90ac-4e9c-8d87-4b2842378684" src="/sites/default/files/inline-images/article_29.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="763" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Fri, 08 Nov 2019 04:58:17 +0000 @optimal-sdw.com 37 at http://optimal-sdw.com http://optimal-sdw.com/blog/code-db/article_37#comments MariaDB(MySQL)におけるデータベースの作成とユーザ作成および権限付与について http://optimal-sdw.com/blog/code-db/article_32 <span>MariaDB(MySQL)におけるデータベースの作成とユーザ作成および権限付与について</span> <span><span>@optimal-sdw.com</span></span> <span><time datetime="2019-10-14T19:38:31+09:00" title="2019年10月14日(月曜日) - 19:38">2019/10/14(月) - 19:38</time> </span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2019-10-14T10:38:31Z">2019/10/14(月) - 19:38</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-db/article_32"><img alt="article_32_eye_catch" data-entity-type="file" data-entity-uuid="9dcad355-dadc-44a0-b1a1-37966b3094eb" src="/sites/default/files/inline-images/article_32.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="1003" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>MariaDBとMySQLは姉妹関係にあるRDBMSになります。どちらもアプリケーションで登録するデータを保存するために必要なソフトウェアです。</p> <p>違いはMySQLをもとにパフォーマンス改善し、後発として誕生したものがMariaDBです。</p> <p>MariaDBもしくはMySQLをインストールした後はデータベース(DB)の作成と、作成したDBを操作するためのユーザ作成が必要になります。自身でWebアプリケーションを構築する際やWordPress、DrupalといったCMSをインストール際にDBの構築作業は必要になります。</p> <p>また、MariaDB(MySQL)はレンタルサーバでよく使われています。</p> <p>レンタルサーバでは大抵管理メニューから簡単にDBの作成ができるようになっておりますが、仮想環境等を用意し、事前にレンタルサーバでCMSを公開する前に設定方法などを勉強したり、デザインテーマを自身で作成する場合など、管理メニューのようなものが無い状態からDBを構築することのほうがほとんどです。</p> <p>そのため、管理メニュー等の便利機能に頼らずともデータベースの作成やユーザの作成ができるようにしておいたほうが吉です。</p> <p>※ MariaDBおよびMySQLのインストールにつきましては、当該記事の末尾に関連記事のリンクがありますので、そちらからご参照ください。なお、Linux環境におけるインストール方法であり、Windows環境へのインストール方法ではありませんので予めご了承ください。</p> <p> </p> <hr /><h2 id="sec01">rootユーザのパスワード設定とMariaDB、MySQLの起動方法</h2> <hr /><p>MariaDBもMySQLも基本的にコマンドは一緒です。これはMySQLから派生して作られたのがMariaDBだからです。</p> <p>インストール直後はrootという特権ユーザで起動、ログインします。以下のコマンドで起動可能です。</p> <p>【MySQLのサービス起動方法】</p> <pre> <code class="language-xml">$ sudo systemctl start mysqld</code></pre> <p>【MariaDBのサービス起動方法】</p> <pre> <code class="language-xml">$ sudo systemctl start mariadb</code></pre> <p>【MySQL、MariaDBの起動】</p> <pre> <code class="language-xml">$ mysql</code></pre> <p> </p> <p>MySQLにログインする前にrootユーザにパスワード設定する場合は以下のコマンドで行います。</p> <p> </p> <p>【rootユーザのパスワード設定】</p> <pre> <code class="language-xml">$ mysqladmin -u root password input_root_password</code></pre> <p>※ input_root_passwordの部分に設定するパスワードを入力します。</p> <p> </p> <p>パスワード設定後のMariaDB、MySQLの起動とログイン方法は使用するコマンドに違いはありませんが、以下のようにユーザ名を指定するためのオプション「-u」の後ろにユーザ名を指定し、その次にパスワード入力を行うためのオプション「-p」を指定します。Enterキーを押下するとパスワード入力を求められますので、設定したパスワードを入力します。rootユーザ以外のユーザでログインする場合も同じです。</p> <p>【MySQL、MariaDBの起動(ユーザとパスワードの指定有り)】</p> <pre> <code class="language-xml">$ mysql -u root -p </code></pre> <p> </p> <hr /><h2 id="sec02">データベースの作成</h2> <hr /><p>DBを作成するにはmysqlにログイン後、以下のSQLを入力します。</p> <pre> <code class="language-sql">create database input_database_name;</code></pre> <p>※ input_database_nameの部分に作成するDB名を入力します。</p> <p> </p> <p>DBを削除する場合は以下のように入力します。</p> <pre> <code class="language-sql">drop database input_database_name;</code></pre> <p> </p> <hr /><h2 id="sec03">ユーザの作成</h2> <hr /><p>ユーザを作成する場合は以下のように入力します。</p> <pre> <code class="language-sql">create user 'input_user_name'@'input_host_name' identified by 'input_user_password';</code></pre> <p>※ input_user_nameの部分にユーザ名、input_host_nameの部分にホスト名(localhostなど)、input_user_passwordの部分にパスワードを入力します。</p> <p> </p> <p>ユーザを削除する場合は以下のように入力します。</p> <pre> <code class="language-sql">drop user 'input_user_name'@'input_host_name';</code></pre> <p> </p> <hr /><h2 id="sec04">ユーザの権限付与</h2> <hr /><p>特定ユーザにすべてのDBへのアクセスや操作権限を付与するには以下のように入力します。</p> <pre> <code class="language-sql">grant all on *.* to 'input_user_name'@'input_host_name';</code></pre> <p>※ input_user_nameの部分にユーザ名、input_host_nameの部分にホスト名(localhostなど)を入力します。</p> <p> </p> <p>特定のDBへのアクセスや操作権限を付与するには以下のように入力します。</p> <pre> <code class="language-sql">grant all on input_database_name.* to 'input_user_name'@'input_host_name';</code></pre> <p>※ input_database_nameの部分にDB名を入力します。</p> <p> </p> <p>特定のDBの特定テーブルへのアクセスや操作権限を付与するには以下のように入力します。</p> <pre> <code class="language-sql">grant all on input_database_name.input_table_name to 'input_user_name'@'input_host_name';</code></pre> <p>※ input_table_nameの部分にテーブル名を入力します。</p> <p> </p> <p>特定操作の権限を付与するにはallではなく、create, alter, drop, select, insert, update, deleteのように具体的に権限を指定して入力します。</p> <pre> <code class="language-sql">grant input_authority_name on input_database_name.input_table_name to 'input_user_name'@'input_host_name';</code></pre> <p>※ input_authority_nameの部分に権限名を入力します。複数指定する場合はカンマ区切りで入力します。(ex. select, insert, update, delete)</p> <p> </p> <p>設定した権限を有効にするためには以下のように入力します。</p> <pre> <code class="language-sql">flush privileges;</code></pre> <p> </p> <hr /><h2 id="sec05">既存データベースの確認と利用</h2> <hr /><p>作成済みのDBを確認するには以下のように入力します。</p> <pre> <code class="language-sql">show databases;</code></pre> <p> </p> <p>利用するDBを指定するには以下のように入力します。</p> <pre> <code class="language-sql">use input_database_name;</code></pre> <p>※ input_database_nameの部分にDB名を入力します。テーブルの作成や変更、削除、データの検索や登録、変更、削除をする場合、まず最初に利用するDBを指定する必要があります。最初に指定した後は都度指定する必要はありませんが、mysqlからログアウトした後、再ログインした場合は再度利用するDBを指定する必要があります。</p> <p> </p> <p>以上です。</p> <p> </p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-db" hreflang="ja">DB</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> <h2>コメントを追加</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=32&amp;2=comment&amp;3=comment" token="cBy-k65ZpSZzYuUeFvRtIUCCtXu8GaU6qLNQDMe_kRI"></drupal-render-placeholder> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-b8bb8f8f6d780f8f67dbec234cd65d4b5eaa63092fc8fa91e640e07c24f347a2"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--3" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-db/article_29" hreflang="ja">MariaDBのインストールまたはMySQLのインストール</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-db/article_29"><img alt="article_29_eye_catch" data-entity-type="file" data-entity-uuid="e3602371-90ac-4e9c-8d87-4b2842378684" src="/sites/default/files/inline-images/article_29.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="763" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Mon, 14 Oct 2019 10:38:31 +0000 @optimal-sdw.com 32 at http://optimal-sdw.com http://optimal-sdw.com/blog/code-db/article_32#comments MariaDBのインストールまたはMySQLのインストール http://optimal-sdw.com/blog/code-db/article_29 <span>MariaDBのインストールまたはMySQLのインストール</span> <span><span>@optimal-sdw.com</span></span> <span><time datetime="2019-10-08T14:34:33+09:00" title="2019年10月8日(火曜日) - 14:34">2019/10/08(火) - 14:34</time> </span> <div class="field field--name-field-last-update field--type-datetime field--label-above"> <div class="field--label">更新日時</div> <div class="field--item"><time datetime="2019-10-08T05:34:33Z">2019/10/08(火) - 14:34</time> </div> </div> <div class="field field--name-field-kanban field--type-text-long field--label-hidden field--item"><p><a href="https://optimal-sdw.com/blog/code-db/article_29"><img alt="article_29_eye_catch" data-entity-type="file" data-entity-uuid="e3602371-90ac-4e9c-8d87-4b2842378684" src="/sites/default/files/inline-images/article_29.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="763" loading="lazy" /></a></p> <p> </p> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>プログラミングを始め、システム開発を行うときに必ずと言っていいほどセットで登場するのがデータベース(DB)です。</p> <p>データベースとはデータを保存するためのソフトウェアであり、リレーショナルデータベース(RDB)が主流です。</p> <p>データベースの作成やそれらにアクセス可能なユーザなどを管理するソフトウェアがMariaDBやMySQL、PostgreSQL、Oracle、SQLServerといったものです。</p> <p>RDBにおいて覚える必要があるのはSQLというデータベースを操作するための言語です。</p> <p>データを格納する箱であるテーブルを作成したり、データの登録、更新、削除、検索といったことをSQLを使って行います。</p> <p>今回はSQLの基礎知識ではなく、CentOS7環境に最新のMariaDBをインストールする方法、MariaDBではなくMySQLをインストールする方法をご紹介いたします。</p> <p>MySQLおよびMariaDBにおけるユーザの作成、データベースの作成、ユーザへの権限付与の方法については別途記載を予定しています。(自分自身がよく忘れてしまうので。特に権限付与あたり。)</p> <p>※ SQL自体は基本的にMySQLであってもPostgreSQLであってもOracleであっても文法には大きな違いはありません。項目のデータ型や用意されている関数などちょっとした違いはあります。SQLの書き方についてはSQLServerが一番癖が強いと個人的には感じております。</p> <hr /><h2 id="sec01">MariaDBの最新版をCentOSにインストールする</h2> <hr /><p>CentOS7のyumで標準インストールされるのはMariaDBですが、バージョンが古いです。</p> <p>公式サイトで最新版をインストールするための以下コマンドが公開されています。(<a href="https://mariadb.com/kb/en/library/mariadb-package-repository-setup-and-usage/" rel="noopener noreferrer" target="_blank">公式サイトへ</a>)</p> <p> </p> <pre> <code class="language-xml">$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash</code></pre> <p> </p> <p>バージョンを指定してインストールしたい方は以下の通りです。</p> <p> </p> <pre> <code class="language-xml">$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version="mariadb-10.3"</code></pre> <p> </p> <p>サポートされているバージョンは以下の通りです。上記コマンドやサポートバージョンは変わる可能性がありますので、インストール前に必ず公式サイトで情報をご確認ください。</p> <ul><li>mariadb-5.5</li> <li>mariadb-10.0</li> <li>mariadb-10.1</li> <li>mariadb-10.2</li> <li>mariadb-10.3</li> <li>mariadb-10.4</li> </ul><p> </p> <p>上記のコマンドで最新のMariaDBがyumに追加され、以下のコマンドでパッケージをインストールすることができます。</p> <p> </p> <pre> <code class="language-xml"># yum -y install MariaDB-server MariaDB-client</code></pre> <p> </p> <hr /><h2 id="sec02">CentOS7にMariaDBではなくMySQLをインストールする(yum収録のパッケージをMySQLに変更する)</h2> <hr /><p>MySQLから派生したMariaDBよりもMySQLを使いたいという方は以下の手順でyumのMariaDBパッケージを削除し、MySQLに変更することが可能です。</p> <p>CentOS7ではMariaDBがyumの標準になっておりますが、例えば、レンタルサーバで利用しているDBがMySQLなのでMariaDBではなくMySQLをインストールしたいなど、環境をそろえる際に必要になるときがあります。</p> <p>MySQLの公式でyumへの追加方法が公開されています。(<a href="https://dev.mysql.com/doc/refman/5.6/ja/linux-installation-yum-repo.html" rel="noopener noreferrer" target="_blank">公式サイトへ</a>)</p> <p>MariaDBがインストールされた状態ですと、MySQLと競合して上手くインストールすることはできません。そのため、MySQLをインストールする場合はMariaDBの削除が必要です。両方の環境を保持したい場合は仮想マシンで環境構築することをお勧め致します。Dockerでコンテナ環境を作成したり、仮想マシン自体の複製(Vagrantを利用すると楽)を行って複数種類の仮想マシン環境を用意することができます。</p> <p>本題に戻り、まずはMariaDBの削除を行います。</p> <p> </p> <pre> <code class="language-xml"># yum -y remove mariadb-libs # rm -rf /var/lib/mysql</code></pre> <p> </p> <p>続いてMySQLのyumリポジトリ向けRPMパッケージをダウンロードします。CentOSのLinuxカーネルのバージョンを確認して、公式のダウンロードページのリンクを確認します。</p> <p><a href="https://dev.mysql.com/downloads/" rel="noopener noreferrer" target="_blank">MySQL Community Downloads</a> → <a href="https://dev.mysql.com/downloads/repo/yum/" rel="noopener noreferrer" target="_blank">MySQL Yum Repository</a> → ex.【Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package】</p> <p> </p> <pre> <code class="language-xml"># cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) </code></pre> <p> </p> <pre> <code class="language-xml"># yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm</code></pre> <p> </p> <p>上記コマンドでリポジトリにMySQLが追加され、以下のコマンドでインストールします。</p> <p> </p> <pre> <code class="language-xml"># yum -y install mysql-community-server</code></pre> <p> </p> <p>以上です。</p> <p>ちなみにサービスの起動と次回CentOSの起動時に自動的にサービスを立ち上げる場合は以下のコマンドで設定することができます。enableで次回OS起動時に自動的にサービスを起動します。startは今すぐにサービスを起動します。</p> <p>【MariaDBの場合】</p> <pre> <code class="language-xml"># systemctl enable mariadb # systemctl start mariadb </code></pre> <p>【MySQLの場合】</p> <pre> <code class="language-xml"># systemctl enable mysqld # systemctl start mysqld</code></pre> <p> </p> </div> <div class="field field--name-field-blog-category field--type-entity-reference field--label-above"> <div class="field--label">カテゴリ</div> <div class="field--items"> <div class="field--item"><a href="/blog/code" hreflang="ja">Code</a></div> <div class="field--item"><a href="/blog/code-db" hreflang="ja">DB</a></div> </div> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/blog" hreflang="ja">Blog</a></div> </div> <section> <h2>コメントを追加</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=29&amp;2=comment&amp;3=comment" token="UMnLAd2pwczbhuG_AINUbJsxrKQK2Tp-jz6Pxzped2E"></drupal-render-placeholder> </section> <div class="views-element-container form-group"><div class="view view-eva view-relation-article-list view-id-relation_article_list view-display-id-entity_view_1 js-view-dom-id-895c27670a8fbc9f165cb6b2612a7445f375930bf35e7c3060f5d93dc92547c1"> <header> <h4>あわせて読みたい記事はこちら</h4> </header> <div id="views-bootstrap-relation-article-list-entity-view-1--4" class="grid views-view-grid"> <div class="row"> <div class="col-auto col-sm-auto col-md-6 col-lg-6 col-xl-6"> <div class="views-field views-field-title"><span class="field-content"><a href="/blog/code-db/article_32" hreflang="ja">MariaDB(MySQL)におけるデータベースの作成とユーザ作成および権限付与について</a></span></div><div class="views-field views-field-field-kanban"><div class="field-content"><p><a href="https://optimal-sdw.com/blog/code-db/article_32"><img alt="article_32_eye_catch" data-entity-type="file" data-entity-uuid="9dcad355-dadc-44a0-b1a1-37966b3094eb" src="/sites/default/files/inline-images/article_32.jpg" style="max-height:720px;max-width:1280px;width:100%;height:100%;object-fit:cover;" width="1920" height="1003" loading="lazy" /></a></p> <p> </p> </div></div> </div> </div> </div> </div> </div> Tue, 08 Oct 2019 05:34:33 +0000 @optimal-sdw.com 29 at http://optimal-sdw.com http://optimal-sdw.com/blog/code-db/article_29#comments