// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Setting Up the MySQL Database Server in the Windows Operating System
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:syntax: true
:icons: font
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Setting Up the MySQL Database Server in the Windows Operating System - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Setting Up the MySQL Database Server in the Windows Operating System

The MySQL database server is one of the most popular open-source database servers commonly used in web application development.

This document recommends a sequence of steps to set up the MySQL database server 5.6 versions in the Windows operating system. It does not cover MySQL configuration details, it describes a sequence of required steps.

For information about installing and configuring MySQL database server for other operating systems, refer to the link:http://dev.mysql.com/doc/refman/5.6/en/installing.html[+Installing and Upgrading MySQL+] documentation.

NOTE: The link:../../72/ide/install-and-configure-mysql-server.html[+Setting Up the MySQL Database Server 5.1 versions in the Windows Operating System+] document provides the instructions on setting up the 5.1 versions of MySQL Server on Windows.


== Starting the Download

1. Go to link:http://dev.mysql.com/downloads/installer/[+http://dev.mysql.com/downloads/installer/+].
2. Click the Download button.
3. Save the installer file to your system.

== Starting the Installation

After the download completes, run the installer as follows:

1. Right-click the downloaded installation file (for example,  ``mysql-installer-community-5.6.14.0.msi`` ) and click Run.
The MySQL Installer starts.

[start=2]
. On the Welcome panel, select Install MySQL Products.

[start=3]
. On the License Information panel, review the license agreement, click the acceptance checkbox, and click Next.

[start=4]
. On the Find latest products panel, click Execute. 
When the operation is complete, click Next.

[start=5]
. On the Setup Type panel, choose the Custom option and click Next.

[start=6]
. On the Feature Selection panel, ensure MySQL Server 5.6.x is selected, and click Next.

[start=7]
. On the Check Requirements panel, click Next.

[start=8]
. On the Installation panel, click Execute.
When the server installation is completed successfully, the information message appears on the Installation panel. Click Next.

[start=9]
. On the Configuration panel, click Next.

[start=10]
. At the first MySQL Server Configuration page (1/3), set the following options:
* *Server Configuration Type*. Select the Development Machine option.
* *Enable TCP/IP Networking*. Ensure the checkbox is selected and specify the options below:
* *Port Number*. Specify the connection port. The default setting is 3306 - leave it unchanged if there is not special reason to change it.
* *Open Firewall port for network access*. Select to add firewall exception for the specified port.
* *Advanced Configuration.* Select the Show Advanced Options checkbox to display an additional configuration page for setting advanced options for the server instance if required.

NOTE: Choosing this option is necessary to get to the panel for setting the network options where you will turn off the firewall for the port used by the MySQL server.

Click Next.


. At the second MySQL Server Configuration page (2/3), set the following options:
* *Root Account Password*.
* *MySQL Root Password*. Enter the root user's password.
* *Repeat Password*. Retype the root user's password.

NOTE: The root user is a user who has full access to the MySQL database server - creating, updating, and removing users, and so on. Remember the root password - you will need it later when creating a sample database.

* *MySQL User Accounts*. Click Add User to create a user account. In the MySQL User Details dialog box, enter a user name, a database role, and a password (for example,  ``!phpuser`` ). Click OK.

Click Next.


. At the third MySQL Server Configuration page (3/3), set the following options:
* *Windows Service Name*. Specify a Windows Service Name to be used for the MySQL server instance.
* *Start the MySQL Server at System Startup*. Leave the checkbox selected if the MySQL server is required to automatically start at system startup time.
* *Run Windows Service as*. Choose either:
* *Standard System Account*. Recommended for most scenarios.
* *Custom User*. An existing user account recommended for advanced scenarios.
Click Next.


. At the Configuration Overview page, click Next.
. When the configuration is completed successfully, the information message appears on the Complete panel. Click Finish.

NOTE: To check that the installation has completed successfully, run the Task Manager. If the  ``MySQLd-nt.exe``  is on the Processes list - the database server is running.

